如何在简单的MySQL查询中设计索引/查询以避免文件排序?

时间:2013-01-03 14:08:36

标签: mysql indexing query-optimization filesort

我有一个表entrytable,其中包含列datumusernamestatusstatus_spam_userstatus_spam_system和{{1 }}

我想从具有textusernamestatusstatus_spam_user特定值的行中选择列文本的内容。由于这可能导致一长串条目(> 30'000),我想限制匹配行的数量。在此之前,匹配的行应按列status_spam_system排序。

datum

我在表格中添加了两个索引:

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

对于此查询,使用索引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_status_mit_spam的信息,因此排序必须单独进行(即filesort)。是否可以以某种方式设计我的查询/索引,它对datum以及WHERE有用吗?

1 个答案:

答案 0 :(得分:2)

(user, status, datum)上添加索引 由于OR条件(它被用于状态部分),因此无法使用status_spam_user / status_spam_system上的索引,并且必须先使用索引的所有先前部分,然后才能通过索引满足部分顺序