索引 (Index) 是帮助 MySQL 高效获取数据的数据结构。我们可以简单理解为:快速查找排好序的一种数据结构。Mysql 索引主要有两种结构:B+Tree 索引和 Hash 索引。我们平常所说的索引,如果没有特别指明,一般都是指 B 树结构组织的索引 (B+Tree 索引)。

  • 存储引擎
  • .frm 后缀的文件存储的是表结构。
  • .ibd 后缀的文件存放索引文件和数据 (需要开启 innodb_file_per_table 参数)
  • .frm 后缀的文件存储的是表结构。
  • .myd 后缀的文件存储的是表数据。
  • .myi 后缀的文件存储的就是索引文件。
  • MyISAM 存储引擎
  • InnoDB 存储引擎
  1. 索引是按照特定的数据结构把数据表中的数据放在索引文件中,以便于快速查找;
  2. 索引存在于磁盘中,会占据物理空间。
  • 索引的类型
  • B-Tree 索引
  • 哈希索引
  • 覆盖索引

如果一个索引包含 (或覆盖) 所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表

  • 覆盖索引优点
  • 索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量
  • 因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。
  • 一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用
  • innodb的聚簇索引,覆盖索引对innodb表特别有用。
  • 覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以 mysql 只能用 B-tree 索引做覆盖索引。

索引失效的问题

  • 条件中有or,及时其中有条件带索引也不会使用;要想使用or,又想索引生效,只能将or条件中的每个索引列都加上索引。
  • 对于多列索引,不是使用的第一部分,则不会生效
  • like查询以%开头。
  • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
  • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。