【发布时间】:2011-10-08 03:44:52
【问题描述】:
考虑下表及其索引:
CREATE TABLE '交互' (
'oid' bigint(20) 非空,
'archieved' 日期时间 DEFAULT NULL,
'内容' 长文本 COLLATE utf8_bin,
'contentSentiment' int(11) 默认为 NULL,
'createdAt' 日期时间 DEFAULT NULL,
'id' varchar(255) 整理 utf8_bin 默认为 NULL,
'interactionSource' 长文本 COLLATE utf8_bin,
'链接' varchar(255) 整理 utf8_bin DEFAULT NULL,
'source' varchar(255) 整理 utf8_bin DEFAULT NULL,
'title' varchar(255) 整理 utf8_bin DEFAULT NULL,
'类型' int(11) 默认为空,
'authorKloutScore' int(11) 默认为空,
主键('oid'),
KEY 'createdAt' ('createdAt'),
KEY 'fullMonitorFeedSearch' ('criteria_oid','createdAt','authorKloutScore','archieved','type')
) ENGINE=MyISAM 默认字符集=utf8 COLLATE=utf8_bin
如果有一个索引 (fullMonitorFeedSearch) 覆盖它,为什么以下查询运行缓慢?顺便说一句,如果删除了 'interactio0_.TYPE = 2',则 sql 将在 0.01 秒内运行。
选择interactio0_.oid
FROM 交互interactionio0_
其中interactio0_.criteria_oid = 21751021
AND interactio0_.createdat = 10
AND interactio0_.archieved 为 NULL
AND interactio0_.TYPE = 2
ORDER BY interactio0_.createdat DESC
这是对sql的解释:
+----+-------------+--------------+--------+------- -------------------------------------------------- -----------------+------------------------+-------- -+--------+---------+--------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------------+--------+------- -------------------------------------------------- -----------------+------------------------+-------- -+--------+---------+--------------+ | 1 |简单 |交互0_ |范围 | FKD15475F24AA96F7,createdAt,fullMonitorFeedSearch | fullMonitorFeed 搜索 | 18 |空 | 2323027 |使用位置 | +----+-------------+--------------+--------+------- -------------------------------------------------- -----------------+------------------------+-------- -+--------+---------+--------------+【问题讨论】:
-
考虑重新排列索引的顺序,将唯一性最小的值放在首位(在您的情况下可能是 TYPE)。
-
“最不独特”是什么意思?
-
换句话说,最有可能具有重复值的列。诸如“TYPE”之类的列可能具有非常有限数量的值,而日期时间字段将变化很大。这将在没有大量索引查找的情况下快速减少记录数量。优化器应该做到这一点,但也要考虑重新排列查询本身以匹配。