mysql索引相关问题总结

一、InnoDB和myisam的区别

innodb支持事务,外键,行级锁;

myisam不支持事务,不支持外键,只支持表锁。

二、innodb引擎下索引是通过B+树存储的

B+树和B树的区别:

B+树的非叶子节点只存储键和指针,只有叶子节点会存储真实的数据,B树的非叶子节点也会存储数据,这样同等高度下B+树可以存储更多的键,存储相同的键B+树比B树深度更浅搜索速度更快。

为什么不使用二叉树: 二叉树如果插入的元素是有序的会退化成链表,查询慢。

三、聚集索引和非聚集索引

聚集索引: 索引的叶子节点存储真实的数据,索引和数据存储在同一个树上。

非聚集索引: 索引的叶子节点存储的是数据行的id(聚集索引树上的id),索引和数据是分开存储的。

一张表只能有一个聚集索引,可以有多个非聚集索引,主键就是一个聚集索引。

四、索引使用原则

4.1 最左前缀法则

如果一个索引由多列创建,查询时如果不包含最左列则索引失效。如果包含最左列但有跳过的列,从跳过的那列开始索引部分失效。

4.2 or

有or的查询如果or两边的字段有一个没有索引查询就不会走索引,只有or两边都有索引时才会走索引。

4.3 mysql统计后认为不走索引更高效就会不走索引

4.4 sql提示

use index 建议mysql使用某个索引

ignore index 让mysql忽略某个索引

fource index 强制mysql使用某个索引

4.6 覆盖索引

一个查询语句中如果使用的索引包含了要查询的所有列就不需要再进行回表查询,效果会比较高。

4.7 前缀索引

为大文本字段设计的索引,可以取文本的前边一段作为索引,节省存储空间

4.8 单列索引和联合索引

如果有多个条件时尽量使用联合索引包含用到的全部列效果会比较高。

4.9 like模糊查询

不考虑覆盖索引时: 后边有%会走索引,只要前边有%模糊匹配就不走索引

考虑覆盖索引时: 如果select查询的字段在索引中都能找到,即使前边有%模糊匹配也会走索引。

4.10 索引列上有运算或函数时就不会使用索引