我试图理解为什么MySQL没有使用完整的索引来回答查询。让我解释。 我通过MySQL版本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值。为什么呢?
提前感谢您的回复。
答案 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