Igo*_*nov 5 mysql indexing performance where
所以这是一个非常简单的表'tbl':
+---------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+----------------+
| val | varchar(45) | YES | MUL | NULL | |
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
+---------+---------------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
它的索引:
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tbl | 0 | PRIMARY | 1 | id | A | 201826018 | NULL | NULL | | BTREE | |
| tbl | 1 | val | 1 | val | A | 881336 | NULL | NULL | YES | BTREE | |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Run Code Online (Sandbox Code Playgroud)
我正在尝试这个简单的选择:
select val from tbl where val = 'iii';
Run Code Online (Sandbox Code Playgroud)
结果:86208行(0.08秒)
但是当我想稍微修改它时:
select id, val from tbl where val = 'iii';
Run Code Online (Sandbox Code Playgroud)
结果是:86208行(47.30秒)
我有一个关于coumn的索引,指向的地方,我正在修改的是结果行表示.为什么有如此可怕的延迟?(我不得不说每次我都不能重现这个延迟:即使在'重置查询缓存'或设置'query_cache_type = off'命令之后,它也可以快速完成).
如果没有实际检查您的服务器配置,很难判断,但这是一个有根据的猜测。首先,MySQL 无需实际读取表数据即可满足您的查询。您所要求的所有信息都可以仅从索引中检索。请注意,索引的基数val仅为 10 6的量级行,并且索引中的行将非常短。
在第二种情况下,您请求的数据不在 的索引中val。现在引擎必须实际查找并读取数据中的行。这里的基数大约是 250 倍,并且由于索引将检索按 排序的行val,因此查找相应的id值将需要在磁盘上数百 GB 的数据中进行大量跳转。这会慢得多。