我想在其中有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