Using where查询的列未被索引覆盖 , where筛选条件非索引的前导列,Extra 中为 Using where 。

文章插图
所谓前导列,就是在创建复合索引语句的第一列或者连续的多列 。比如通过:CREATE INDEX comp_ind ON table1(x, y, z)创建索引,那么x,xy,xyz都是前导列 , 而yz,y,z这样的就不是 。using where,using index查询的列被索引覆盖,并且 where筛选条件是索引列之一但是不是索引的前导列,Extra中为Using where; Using index,意味着无法直接通过索引查找来查询到符合条件的数据;

文章插图
查询的列被索引覆盖,并且where筛选条件是索引列前导列的一个范围 , 同样意味着无法直接通过索引查询到符合条件的数据

文章插图
Using index condition查询的列不全在索引中,where条件中是一个前导列的范围

文章插图
查询列不完全被索引覆盖,查询条件完全可以使用到索引(进行索引查找)

文章插图
NULL(既没有Using index , 也没有Using where Using index,也没有using where) 。
查询的列未被索引覆盖 , 并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引 , 也不是完全没用到索引,Extra中为NULL(没有信息) 。

文章插图
Using join buffer使用了连接缓存 。
小表驱动大表impossible wherewhere子句总是false,不能用来获取任何元素 。即筛选条件没能筛选出任何数据 。
在表连接过程中 。一般选择小表作为驱动表,大表作为被驱动表 。
驱动表(小表)的连接字段无论建立没建立索引都需要全表扫描的 。被驱动表(大表)如果在连接字段建立了索引,则可以走索引 。如果没有建立索引则也需要全表扫描 。
两张表连接的情况
被驱动表的连接字段有索引:主键索引
对于驱动表中的每一条数据,到被驱动表的聚簇索引上寻找其对应的数据 。
被驱动表的连接字段有索引:二级索引
对于驱动表上的每一条数据,到被驱动表的二次索引上寻找其对应的数据id,然后再根据数据id到聚簇索引上寻找对应的数据 。
被驱动表的连接字段没有索引
对于驱动表上的每一条数据,都要到被驱动表上进行一次全表遍历 , 找到对应的数据 。
join buffer的作用
就是针对被驱动表的连接字段没有索引的情况下需要进行全表扫描,所以引入了join buffer内存缓冲区来对这个全表扫描过程进行优化 。
select tables optimized away在没有 GROUPBY 子句的情况下,基于索引优化 MIN/MAX操作 。
distinct优化 distinct操作 。在找到第一匹配的时候就停止找同样的动作 。
推荐阅读
- Python之Redis操作
- PostgreSQL到底好不好?为什么互联网公司不敢用呢?
- 《无所畏惧》:方丽虹与韩之通交手,躲在背后的人才是最大赢家
- 59岁关之琳被偶遇,皮肤无暇但脸太僵,回春技术被质疑是缅北功劳
- 云顶之弈福星有哪些英雄,云顶之弈福星拉夫是什么阵容
- 戒烟一个月后脸的变化 戒烟一个月之后身体的变化真吓人
- 千里之行的下一句,歇后语关公门前耍大刀和千里之行的后半句是
- 宋轶与白敬亭的低调之恋,究竟隐藏着什么秘密?
- 情侣送礼物送什么好呢 情侣之间有意义的礼物
- 皮提亚之墓的石碑在哪
