【发布时间】:2011-10-22 13:00:17
【问题描述】:
我有一个包含 30,000 行(并且还在增长)的表,我将它与另一个表连接起来。一些页面,我需要运行大约 100 多个这样的查询,事情变得很慢。如果我EXPLAIN 查询,我注意到一个表使用主键并且速度很快,但另一个表使用它的一个索引,这不是最好的。这是一个概述:
SIMPLE | acc_entries | ref | ledger,date,type,status,status_ledger_date_type | type | 1 | const | 15359 | Using where
这是一个示例查询:
SELECT SUM(usd) AS total FROM acc_entries
LEFT JOIN acc_ledgers ON acc_entries.ledger = acc_ledgers.id
WHERE acc_entries.status = 1 AND
acc_ledgers.account = 3004 AND
date >= '2011-01-01' AND
date <= '2011-08-30' AND
type = 'credit'
如您所见,我在 WHERE 字段中使用了 status、ledger(与 acc_ledgers.account 连接的字段)、date 和 type。所有这些字段都有索引。但是,还有一个特定的索引以相同的顺序用于所有这些索引。它被称为status_ledger_data_type,如您所见,它是 MySQL 考虑使用的索引之一。然而,最后 MySQL 选择使用type 作为索引。这有大约 15,000 个可能的行(表的一半),而另一个组合索引仅包含其中的一小部分。所以我的问题是:为什么当有更好的索引可用时 MySQL 会选择这个索引,我该如何防止这种情况发生?
【问题讨论】:
标签: mysql indexing query-optimization