MySQL的loose index scan_MySQL
程序员文章站
2022-04-27 15:29:24
...
众所周知,InnoDB采用IOT(index organization table)即所谓的索引组织表,而叶子节点也就存放了所有的数据,这就意味着,数据总是按照某种顺序存储的。所以问题来了,如果是这样一个语句,执行起来应该是怎么样的呢?语句如下:
select count(distinct a) from table1;
列a上有一个索引,那么按照简单的想法来讲,如何扫描呢?很简单,一条一条的扫描,这样一来,其实做了一次索引全扫描,效率很差。这种扫描方式会扫描到很多很多的重复的索引,这样说的话优化的办法也是很容易想到的:跳过重复的索引就可以了。于是网上能搜到这样的一个优化的办法:
select count(*) from (select distinct a from table1) t;
从已经搜索到的资料看,这样的执行计划中的extra就从using index变成了using index for group-by。
但是,但是,但是,好在我们现在已经没有使用5.1的版本了,大家基本上都是5.5以上了,这些现代版本,已经实现了loose index scan:
很好很好,就不需要再用这种奇技淫巧去优化SQL了。
文档里关于group by这里写的有点意思,说是最大众化的办法就是进行全表扫描并且创建一个临时表,这样执行计划就会难看的要命了,肯定有ALL和using temporary table了。
推荐阅读
-
MySQL 创建索引(Create Index)的方法和语法结构及例子
-
MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别
-
[MySQL] explain中的using where和using index
-
Mysql中key和index的区别点整理
-
MySQL字符串函数:substring_index()的使用详解
-
数据库优化-索引的创建-MySQL-index-SQL优化-避免全表扫描
-
MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别
-
MySQL索引的Index method中btree和hash的区别_MySQL
-
使用use index优化sql查询的详细介绍_MySQL
-
MySQL索引的Index method中btree和hash的区别_MySQL