0

我试图理解为什么 MySQL 不使用完整索引来回答查询。让我解释。我通过 MySQL 版本 5.1.73-1 (Debian) 使用 imdb 数据库。我在movie_info_idx 表上创建并索引“itid_inf25_mid_ndx”,其中包含列(info_type_id、info(25)、movie_id)。info_type_id 和movie_id 列是整数(NOT NULL),info 是TEXT 类型,因此每个索引条目占用4+27+4 = 35 个字节。句子的输出:

EXPLAIN
SELECT movie_id
FROM movie_info_idx
WHERE info_type_id = 101
AND info > "9";

显示这些值:

选择类型 = 简单;表=电影信息IDX;类型=范围;可能键= itid_inf25_mid_ndx;键= itid_inf25_mid_ndx;key_len = 31; 参考=空;行 = 841; 额外 = “使用地点”

key_len 列和额外列中没有“使用索引”通知仅使用索引中的总和 4+27 = 31 个字节的列 (info_type_id,info(25))。我想知道为什么优化器不使用索引中的movie_id 列来访问SELECT 子句中的movie_id?似乎优化器将访问基表movie_info_idx 以获取我要列出的movie_id 值。为什么?。

预先感谢您的回复。

4

1 回答 1

1

一旦 MySQL 使用查询进行“范围扫描”(匹配多个值),它通常将不再使用最后一列。

原因是多列索引是一棵树。为了扫描最后一列 (movie_id) 上的索引,它必须在索引树中搜索范围列 (info) 的每个匹配值。这通常效率低下,因此 MySQL 不会这样做。

为了改善这种情况,将预期作为范围扫描的列放在最后,因此将其排序为 (info_type_id, movie_id, info)

更多信息: https ://dev.mysql.com/doc/refman/5.6/en/multiple-column-indexes.html

于 2015-03-27T14:27:42.150 回答