Mysql索引总结

1、索引分类

  1. Hash索引

Hash 索引查询效率很高,时间复杂度O(1)。Mysql Innodb引擎不支持hash索引的。Hash索引适合精确查找,不适合范围查找。

  1. 平衡二叉树

时间复杂度为 O(n),根节点会变,数据量多,层次多,磁盘IO多。

  1. B树

每个节点中不仅包含数据的 key 值,还有 data 值。数据量较大的时候,同样会导致B树很深,从而增加了磁盘 IO 的次数。

  1. B+树

所有的数据节点都在最后一层上,叶子节点按关键字排序,从左到右指针连接,层级更少,查询稳定。

2、主键索引

搜索过程:索引页 ——> 索引页 ——> 数据页

索引页+数据页组成的B+树就是聚簇索引。

InnoDB聚簇索引:

  1. 如果定义了PK,那么PK就是聚簇索引。
  2. 没有PK,第一个not null unique就是聚簇索引。
  3. 否则,自动建一个隐藏列作为聚簇索引。

聚簇索引叶子节点储存整行数据(就是数据页);

普通索引叶子节点:

  • InnoDB储存主键索引;
  • MyIsam储存行记录的指针;

3、回表与索引覆盖

非聚簇索引(普通索引)中只保存了索引字段的值(按照顺序排列,联合索引先按第一列排序,再按第二列……排序,全都相同,再按主键索引排序)与主键索引的值。

回表:

Select的where条件中是非聚簇索引,查询需要返回非聚簇索引中不包含的字段,此时需要用主键索引再查一次表

索引覆盖:

将被查询的字段,建立到联合索引里去。

4、联合索引与最左匹配

  • 多列条件为OR关联时,不生效;
  • 最左匹配最左边的列必须在查询条件中,不然不生效;
  • 联合索引范围查询时,第一列是范围查询,后续的列再范围查询没法走索引的,只有第一列是等值查询时,后续的列才能用范围查询。
  • groupBy+索引,效率特别高,不需要建中间表,也不需要排序

5、索引优化

  • 大字段建索引时,可以只取字段的前半部分

        CREATE INDEX  table ON dual(address(20));

  • 某个值在某一列中出现比列很高时,查询优化器就会放弃索引,全表扫;比例分界线默认是30%
  • orderBygroupBy后的字段最好建索引,不会产生中间表
  • 隐式类型(“1”=> 1)转换会导致索引失效
  • 大数据查询分页使用Limit时,先嵌套子查询,把id查出来,再通过id用where条件搜索,可以走索引,避免回表;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值