5

所以这是一个非常简单的表'tbl':

+---------+---------------------+------+-----+---------+----------------+
| Field   | Type                | Null | Key | Default | Extra          |
+---------+---------------------+------+-----+---------+----------------+
| val     | varchar(45)         | YES  | MUL | NULL    |                |
| id      | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
+---------+---------------------+------+-----+---------+----------------+

及其索引:

+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| 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      |         |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

我正在尝试这个简单的选择:

select val from tbl where val = 'iii';

结果:集合中有 86208 行(0.08 秒)

但是当我想稍微修改它时:

select id, val from tbl where val = 'iii';

结果是:集合中有 86208 行(47.30 秒)

我在指向的地方有一个索引,我正在修改的是结果行表示。为什么会有如此可怕的延迟?(我不得不说,我不能每次都重现这种延迟:即使在“重置查询缓存”或设置“查询缓存类型=关闭”命令之后也可以快速完成)。

4

3 回答 3

3

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

在第二种情况下,您要求提供不在索引中的数据val。现在引擎必须实际从数据中查找和读取行。这里的基数大约是 250 倍,并且由于索引将检索按 排序的行val,因此要找到相应的id值将需要在磁盘上的数百 gig 数据中跳来跳去。这将非常慢。

于 2012-06-10T00:24:13.527 回答
0

尝试ORDER BY在查询中添加一个和 `LIMIT。这应该有很大帮助。

我认为如果您将查询更改为此它会更快:

select id, val from tbl where val = 'iii' order by val limit 10;
于 2012-06-09T20:33:37.793 回答
0

您正在基于两列进行选择,但不存在两者的索引。尝试添加一个由id 和 val组成的新索引。

于 2012-06-09T20:42:04.943 回答