20

我想从中选择列的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(用户)
  • index_datum(基准)
  • index_status_mit_spam (status, status_spam_user, status_spam_system)

解释结果是:

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

2 回答 2

12

回答您的问题:

您需要了解索引会加快读取速度并减慢对表的写入速度。所以仅仅添加索引并不总是一个好主意。上述答案和提示应该可以帮助您获得扎实的理解。

于 2013-01-03T11:22:34.933 回答
3
  • 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

于 2013-01-03T11:25:46.310 回答