MySQL索引的数据结构

用来查询数据库的存储引擎,命令:SHOW ENGINES;

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,

主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。

引擎采用B+Tree结构来作为索引结构

MyISAM引擎特点

每一个采用MyISAM引擎的数据表在实际存储中都是由三个文件组成,分别是frm文件,MYD文件和MYI文件

frm文件保存表的结构,

MYD保存表的数据,

MYI保存表的索引文件

1、不支持事务。
2、表级锁定。
即发生数据更新时,会锁定整个表,以防止其他会话对该表中数据的同时修改所导致的混乱。这样做可以使得操作简单,但是会减少并发量。
3、读写互相堵塞。 在MyISM类型的表中,既不可以在向数据表中写入数据的同时另一个会话也向该表中写入数据,也不允许其他的会话读取该表中的数据。只允许多个会话同时读取该数据表中的数据。
4、只会缓存索引,不会缓存数据。 所谓缓存,就是指数据库在访问磁盘数据时,将更多的数据读取进入内存,这样可以使得当访问这些数据时,直接从内存中读取而不是再次访问硬盘。MyISAM可以通过key_buffer_size缓存索引,以减少磁盘I/O,提升访问性能。但是MyISAM数据表并不会缓存数据。
5、读取速度较快,占用资源较少。
6、不支持外键约束。
7、支持全文索引。

InnoDB存储引擎

InnoDB的存储文件有两个,后缀名分别是 .frm和 .idb;其中 .frm是表的定义文件, .idb是表的数据文件。

1.InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID)

2.InnoDB支持行级锁。行级锁可以最大程度的支持并发,行级锁是由存储引擎层实现的。

3.InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何基于磁盘的关系型数据库引擎所不能匹敌的

4.InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件);

5.InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按照主键顺序存放,如果没有显示在表定义时指定主键。InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键

6.InnoDB被用在众多需要高性能的大型数据库站点上

7.InnoDB中不保存表的行数(eg:select count(*)from table时,InnoDB需要扫描一遍整个表来计算有多少行);

8.清空整个表时,InnoDB是一行一行的删除,效率非常慢;
 

MySQL 存储引擎 MyISAM 与 InnoDB 区别?

  • 一、InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
  • 二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
  • 三、InnoDB支持外键,MyISAM不支持
  • 四、MySQL 在 5.1 之前版本默认存储引擎是 MyISAM,5.1 之后版本默认存储引擎是 InnoDB
  • 五、InnoDB不支持FULLTEXT类型的索引
  • 六、InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表
  • 七、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
  • 八、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
  • 九、InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'

你可能感兴趣的:(数据库,mysql,数据库)