为什么这个简单的MySQL查询如此之慢?

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'命令之后,它也可以快速完成).

Jim*_*son 3

如果没有实际检查您的服务器配置,很难判断,但这是一个有根据的猜测。首先,MySQL 无需实际读取表数据即可满足您的查询。您所要求的所有信息都可以仅从索引中检索。请注意,索引的基数val仅为 10 6的量级行,并且索引中的行将非常短。

在第二种情况下,您请求的数据不在 的索引中val。现在引擎必须实际查找并读取数据中的行。这里的基数大约是 250 倍,并且由于索引将检索按 排序的行val,因此查找相应的id值将需要在磁盘上数百 GB 的数据中进行大量跳转。这会慢得多。