2011-07-15 233 views
1

我有以下查詢:MySQL查詢優化

SELECT * 
    FROM posts USE INDEX(abc) 
WHERE a=3 and b=123 and c>4012 and d>5212300 and e!=661 
LIMIT 10; 

INDEX(ABC)是一個柱,b和c的索引。

查詢一直運行良好,直到最近數據庫變大時爲止。它現在有大約1000萬行。

我一直在試圖找到替代方案來優化它,但沒有取得太大的成功。我希望有人能給我一些線索。謝謝。

順便說一句,我的表引擎是innodb。

+0

您能否介紹一下這些條件是如何產生的? –

+0

@Dan:將d和e添加到索引中將是無用的,因爲它必須執行完整掃描,因爲列c的查詢不是絕對的。 – Vern

+0

@Sam:這個查詢是生成相關的帖子,類似於where category = 3,group = 123,domain> 4012,articleID> 5212300和writer!= 661. – Vern

回答

1

我將通過刪除您正在使用的索引提示開始我的優化。查詢優化器在猜測什麼是您的查詢的最佳執行計劃方面做得相當不錯,並且在長期運行中提供索引提示通常會對查詢性能產生負面影響。

SELECT * 
    FROM posts 
WHERE a=3 and b=123 and c>4012 and d>5212300 and e!=661 
LIMIT 10; 

我也認爲在bcdea,獨立的索引可以幫助,因爲查詢規劃將能夠結合索引來解析查詢。 (不確定MySQL,但PostgreSQL能夠將它們結合起來解決查詢,如果有幫助的話)。

+0

我不認爲獨立的索引可以提供幫助。看看這篇文章:http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge/ – Vern

+0

我剛剛嘗試刪除索引提示。這不好。所有查詢突然堵塞進程列表。 :( – Vern

+0

@Vern:確實非常有趣的鏈接。非常感謝分享! –