如何解释MySQL EXPLAIN的输出?

R_U*_*ser 10 mysql query-optimization explain

我要选择的列的内容textentrytable.

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
Run Code Online (Sandbox Code Playgroud)

该表有三个指数:

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

Nam*_*ian 6

回答你的问题:

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


Jod*_*ddy 5

  • 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` 用例?

  • 了解 EXPLAIN 输出格式 - http://dev.mysql.com/doc/refman/5.1/en/explain-output.html

  • *“possible_keys 表示表的所有索引(键或索引列)”* - 不正确。它表示可能用于相关查询的索引。 (5认同)