如何解释MySQL EXPLAIN的输出?

时间:2013-01-03 10:59:51

标签: mysql query-optimization explain

我想从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

该表有三个索引:

  • index_user(user)
  • index_datum(datum)
  • index_status_mit_spam(status,status_spam_user,status_spam_system)

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
  • MySQL可能想要使用的索引possible_keys和MySQL实际使用的索引是keys吗?
  • 为什么不使用索引index_status_mit_spam?在查询中,列的顺序与索引中的顺序相同,...
  • 为什么索引index_datum未用于ORDER BY
  • 如何优化表索引或查询? (上面的查询需要最多3秒钟,表格中有大约一百万个条目)

2 个答案:

答案 0 :(得分:6)

回答你的问题:

您需要了解索引会加快读取速度并减慢对表的写入速度。因此,添加索引并不总是一个好主意。上述答案和指示应该有助于您获得扎实的理解。

答案 1 :(得分:1)

  • possible_keys表示表格的所有索引(键或索引列)
  • MySQL优化器决定执行查询的最佳方法,它可能使用任何索引(不是必需的主键),或者没有
  • 要强制MySQL使用或忽略possible_keys列中列出的索引,请在查询中使用FORCE INDEXUSE INDEXIGNORE 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