我想从text
选择专栏entrytable
的内容。
EXPLAIN SELECT text
FROM entrytable
WHERE user = 'username' &&
`status` = '1' && (
`status_spam_user` = 'no_spam'
|| (
`status_spam_user` = 'neutral' &&
`status_spam_system` = 'neutral'
)
)
ORDER BY datum DESC
LIMIT 6430 , 10
该表有三个索引:
EXPLAIN结果是:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE entrytable ref index_user,index_status_mit_spam index_user 32 const 7800 Using where; Using filesort
possible_keys
和MySQL实际使用的索引是keys
吗?index_status_mit_spam
?在查询中,列的顺序与索引中的顺序相同,... index_datum
未用于ORDER BY
?答案 0 :(得分:6)
回答你的问题:
MySQL可能想要使用的索引possible_keys
和MySQL实际使用的索引是keys
吗?是的,这是正确的。
为什么不使用索引index_status_mit_spam
?在查询中,列的顺序与索引中的顺序相同。 SQL 使用表索引的统计信息来确定要使用的索引。 select语句中的字段顺序对要使用的索引没有影响。索引周围的统计信息包括索引的唯一性和其他内容等信息。可能会使用更多unqiue索引。在此处详细了解此信息:http://dev.mysql.com/doc/innodb/1.1/en/innodb-other-changes-statistics-estimation.html或此处:http://dev.mysql.com/doc/refman/5.0/en//myisam-index-statistics.html。这些因素决定了MySQL将如何选择要使用的一个索引。它只会使用 ONE index 。
为什么索引index_datum不用于ORDER BY? MySQL在查询期间将仅使用一个索引而不是两个索引,因为使用第二个索引会使查询变得更慢。读取索引不是读表。这与查询的操作效率有关。以下是可以解释一些概念的答案:https://dba.stackexchange.com/questions/18528/performance-difference-between-clustered-and-non-clustered-index/18531#18531或Adding limit clause to MySQL query slows it down dramatically或MySQL indexes and when to group them。这些答案有很多细节,可以帮助您理解MySQL索引。
如何优化表索引或查询? (上面的查询需要最多3秒钟,表中有大约一百万个条目)。那么这里有一个文件库,可能会减慢你的速度。可能是表有太多索引而MySQL选择了错误的索引。
您需要了解索引会加快读取速度并减慢对表的写入速度。因此,添加索引并不总是一个好主意。上述答案和指示应该有助于您获得扎实的理解。
答案 1 :(得分:1)
possible_keys
表示表格的所有索引(键或索引列)FORCE INDEX
,USE INDEX
或IGNORE INDEX
点击此链接 - http://dev.mysql.com/doc/refman/5.1/en/index-hints.html。
您可以通过向提示添加FOR子句来指定索引提示的范围。这为优化程序为查询处理的各个阶段选择执行计划提供了更细粒度的控制。要仅影响MySQL决定如何在表中查找行以及如何处理联接时使用的索引,请使用FOR JOIN。要影响对行进行排序或分组的索引用法,请使用FOR ORDER BY或FOR GROUP BY。 (但是,如果表有覆盖索引并且它用于访问表,则优化器将忽略禁用该索引的IGNORE INDEX FOR {ORDER BY | GROUP BY}提示。)
尝试强制使用不同的索引 - 请务必检查此链接 - MySQL `FORCE INDEX` use cases?
了解EXPLAIN输出格式 - http://dev.mysql.com/doc/refman/5.1/en/explain-output.html