2016-11-02 133 views
1

我正在爲我的高流量網站優化一個mysql表,我有一個關於mysql索引的問題。首先一些信息:MySQL索引最佳性能

該表有273382行。

查詢是:

SELECT table1.field1, table1.field2, table2.field2 
FROM table1 
LEFT JOIN table2 ON table1.idfield = table2.idfield 
WHERE table1.field = 1 AND table1.field2 = 'yes' 
ORDER BY table1.id DESC 
LIMIT 0,25 

我有以下指標:

index for table1.id - primary unique index 
index for table1.idfield - index 
index for table2.idfield - index 
index for (table1.field,table1.field2) - index 

通過上述指標的查詢需要1.5至2.5秒即可完成

EXPLAIN EXTENDED說,正在使用主鍵(table1.id),我試過unique/index(table1.field,table1.field2,table1.id),結果類似(即使它使用了這個索引)。

在索引更改過程中(大約需要1分鐘),查詢變得快得多0.009。一旦更改過程完成,查詢就會回到1.5-2.5s(大部分低於2)的速度。

我的問題是:哪個索引對這個查詢最有效,以及爲什麼查詢在更改索引時速度更快。

+0

一般經驗法則:在決策環境中使用的任何字段('where,'join,等等)都應該有一個索引。並注意只是有一個索引並不意味着它會隨時使用。 mysql可能會決定全表掃描比使用索引更有效。 –

+0

我意識到了這一點,並且我在連接和字段的位置都有索引,但查詢仍然很慢。但是在更改過程中,查詢運行速度要快得多,爲什麼?我怎樣才能使這個查詢運行速度與它被修改時一樣快。 –

+0

嘗試將table1.field和table1.field2列添加到索引中。它可能有助於您的表現。 – reza

回答

1

如果超過20%的表格有table1.field = 1 AND table1.field2 = 'yes',那麼優化器會決定掃描表格更便宜,而不是在最佳索引(field, field2, id)與數據之間來回反射。

如果您想進一步討論,請提供SHOW CREATE TABLE,0 SHOW TABLE STATUS,EXPLAIN SELECT ...,RAM的大小以及innodb_buffer_pool_size的值。

它聞起來像緩存和I/O問題;以上信息將有助於深入研究。