为什么mysql优化器没有使用完整的索引?

时间:2015-03-27 13:14:13

标签: mysql explain covering-index

我试图理解为什么MySQL没有使用完整的索引来回答查询。让我解释。 我通过My​​SQL版本5.1.73-1(Debian)使用imdb数据库。我使用列(info_type_id,info(25),movie_id)在表movie_info_idx上创建并索引“itid_inf25_mid_ndx”。列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";

显示以下值:

  

select_type = SIMPLE; table = movie_info_idx;键入=范围;   possible_keys = itid_inf25_mid_ndx; key = itid_inf25_mid_ndx; key_len   = 31; ref = NULL; rows = 841;额外=“使用在哪里”

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

提前感谢您的回复。

1 个答案:

答案 0 :(得分: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