我想在其中有200k条记录的表上使用以下查询。有各种其他可以被过滤的字段,但这是一个基本的例子。MySQL索引策略
SELECT b.isbn FROM books b
WHERE
b.price IS NOT NULL AND
b.deleted = '' AND
b.publication_date <= '2009-12-04' AND
(
b.subject1_id IN ('CAT1','CAT2','CAT3','CAT4','CAT5') OR
b.subject2_id IN ('CAT1','CAT2','CAT3','CAT4','CAT5') OR
b.subject3_id IN ('CAT1','CAT2','CAT3','CAT4','CAT5')
)
目前,我对所有这些字段都有一个单独的索引,这个查询需要4.5秒,这太长了。 EXPLAIN
列出密钥下的NULL
。
我还尝试创建一个包含上述查询中所有字段的大型索引,但EXPLAIN
显示未使用此多字段索引。
如何索引这些字段以加快查询速度?
编辑:这是我目前的指标(其中没有一个似乎是由查询使用):
- 指数(价格)
- 指数(删除)
- 指数(publication_date)
- 指数(subject1_id)
- 指数(subject2_id)
- 指数(subject3_id)
- 指数(价格,删除,publication_date,subject1_id,subject2_id,subject3_id)
EDIT2:每ʞɔıu的答案 - 正火表和使用基本上是他查询后,它加速它的一些(现在是时候〜3.5秒),但没有我期待的那么多。我将新表作为PRIMARY KEY(isbn,subject_id)编制索引,并且此索引正在用于连接。
EDIT3:我在第二个表(subject_id,isbn)上添加了一个额外的索引,这有所帮助。在下面提到的其他索引的增加会有所帮助,但只有在查询中使用“FORCE INDEX”时才会使用。现在下降到大约1.5秒。是否有希望将其降低得多?
尝试对主题表 – 2009-12-04 21:57:35
也给出了相同的连接上添加一个索引上添加(主题,ISBN)其他指数(ISBN,出版日期,已删除,价格) – 2009-12-04 22:01:16