MySQL(八):索引,java大学实用教程第四版

本文详细介绍了MySQL中的索引类型,包括覆盖索引的概念和优势,解释了如何通过FORCE INDEX和USE INDEX来提示优化器使用特定索引。同时,讨论了Multi-Range Read(MRR)优化,它减少了磁盘随机访问并优化了数据访问顺序。最后提到了Index Condition Pushdown(ICP)优化,它将WHERE条件过滤提前到存储引擎层,提高查询效率。
摘要由CSDN通过智能技术生成

EXPLAIN SELECT * FROM buy_log WHERE userid = 2;

在这里插入图片描述

优化器选择了使用单个列的聚集索引,因为这个索引的叶子结只有1个键值,也就是这个结点能存放更多的键值(一页有16KB,然后一个叶子结点就是一页)

在这里插入图片描述

在这里插入图片描述

可以看到选择器选择了userid_2这个索引,也就是联接索引,因为在这个联合索引中,buy_date是已经排序好了,如果使用这个索引进行取出数据,就无需再对buy_date做一次额外的排序操作(可以看到在Extra列上,只有使用了index scan和index,并没有using filesort)。

强制使用单一列来索引的话

EXPLAIN SELECT * FROM buy_log FORCE INDEX(userid) WHERE userid = 2 ORDER BY buy_date DESC LIMIT 3;

在这里插入图片描述

可以看到Extra里拥有using filesort,即表明了需要额外的一次排序才能完成查询,而这次排序明显是对buy_date进行排序。

覆盖索引

InnoDB存储引擎支持覆盖索引,或称为索引覆盖,即从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录(一般辅助索引里面存放索引键值,然后还要根据索引键值去查找聚集索引),即叶子结点已经包含了想要的数据,不需要再去聚集索引中找完整的数据,引用覆盖索引的好处是辅助索引不包含整行记录的所有信息,故其大小会远小于聚集索引,因此可以减少IO操作。

对于InnoDB存储引擎的辅助索引而言,叶子结点是包含主键信息的,所以页中存储的内容大概是(primary key 1,primary key 2…,key 1,key 2)这样的数据,所以下列的SQL语句都可以直接查询这些数值出来,而不需要额外去找聚集索引

SELECT key2 FROM table WHERE key 1 = xxx;

SELECT primary key2,key2 FROM table WHERE key 1 = xxx;

SELECT primary key1,key2 FROM table WHERE key1 = xxx;

SELECT primary key1,primary key2,key1,key2 FROM table WHERE key1 = xxx;

覆盖索引的另一个好处就是,辅助索引会小于聚集索引(由于每条行数据的列不全),可以减少IO操作。

用上面的bug_log表为例

EXPLAIN SELECT COUNT(*) FROM buy_log;

在这里插入图片描述

Using index其实就是覆盖索引操作

此外,一般来说对于诸如(a,b)这样的联合索引,一般不可以选择b列作为查询条件,但如果是对于统计操作,会选择覆盖索引来进行优化。

INDEX HINT

MySQL数据库支持INDEX HINT(索引提示),显示地告诉优化器使用哪个索引,下面这两种情况可能需要使用到INDEX HINT。

  • MySQL数据库的优化器错误地选择了某个索引(这种情况比较少见,优化器在绝大部分情况下工作都是正确的),导致SQL语句运行得很慢。这时候就需要强制使用正确的索引

  • 某SQL语句可以选择的索引非常多,这时优化器选择执行计划时间的开销可能会比较大,当大于执行SQL本身的时候,就需要强制使用某个索引了。

如何使用INDEX HINT

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值