mysql 索引

索引记录的是磁盘中的位置,因此不能迁移

MyISAM无论是主键索引还是非主键索引,叶节点存的都是指向表的指针(记录的物理地址)

InnoDB主键索引是聚集索引,叶子节点存的是表中的数据,非主键索引是非聚集索引,叶子节点存的是索引列和主键,拿到主键再查询主键索引(回表)。非主键索引也叫二级索引

索引会降低写入操作的性能

索引有主键索引、唯一索引、普通索引、全文索引,(联合索引)

 

where、order by、group by、on group by默认会排序

 

排序的列如果没有索引,可能需要用文件进行归并排序filesort

两个索引a和b,会先查a索引,得到集合A,再查b索引,得到集合B,然后取A和B的交集

 

索引字段越小越好

索引列很长,可以使用前缀索引

频繁更新的字段不适合建索引

 

离散度大的字段放在联合索引的前面,

常被查询的字段也放前面

 

 

覆盖索引:数据全部从索引里取出,不需要回表,

另外一种不用回表的情况是查询二级索引+主键,因为二级索引的叶子节点上存的就是主键

 

最左匹配原则:联合索引,从左到右,遇到范围查询后就不能走索引了,

>,<,BETWEEN,LIKE等都属于范围查询)

如有索引(a, b, c, d),查询条件 a = 1 and b = 2 and c > 3 and d = 4,

a、b、c走索引,d不走索引。

不用考虑 =、in 等的顺序,mysql会自动优化,

例如 c > 3 and b = 2 and a = 1 and d < 4

会自动优化为 a = 1 and b = 2 and c > 3 and d < 4

 

 

一些不走索引的情况:

SELECT `sname` FROM `stu` WHERE `age`+10=30; 索引列参与了计算 SELECT `sname` FROM `stu` WHERE LEFT(`date`,4) <1990; 函数运算 SELECT * FROM `houdunwang` WHERE `uname` LIKE'后盾%' 走索引 SELECT * FROM `houdunwang` WHERE `uname` LIKE "%后盾" 不走索引 EXPLAIN SELECT * FROM `a` WHERE `a`="1" 走索引 EXPLAIN SELECT * FROM `a` WHERE `a`=1 不走索引 ,字符串与数字比较 条件中有or,即使其中有部分条件带索引也不会使用

where != 不会走索引

where is null 不走索引

正则表达式不走索引

 

 

 

B+树

1、查找、删除、添加操作的复杂度都是O(lgn)的

2、非叶节点不存储数据,存的key多,树的高度小,I/O次数少

3、数据都存在叶节点上,每次查询都比较稳定

4、叶节点用双向指针连起来,有利于范围查询,而B树范围查询需要中序遍历

 

 

哈希索引

对于=操作,不需要多次比较,效率高

不支持排序、范围查询

不支持最左匹配

不支持通配符

哈希碰撞,效率低

 

posted @ 2020-05-27 20:02  是的哟  阅读(131)  评论(0)    收藏  举报