2012-04-13 57 views
0

我只是想知道如果我能做些什麼來使查詢運行得更快一些?如何使此查詢運行得更快?

我有這個疑問:

SELECT * FROM posts 
WHERE posts.exists = 'n' 
ORDER BY posts.ratecount DESC 
LIMIT 0,100 

注意到:2.47s @ 0,100 | 6.18s @ 500,100

這種方法可行,但隨着限制的增加(100,100> 200,100等),它會變得相當慢。

使用的指數似乎並沒有幫助或者:

SELECT * FROM posts 
USE INDEX(ratecount_ca) 
WHERE posts.exists = 'n' 
ORDER BY posts.ratecount DESC 
LIMIT 0,100 

注意到:8.59s @ 0,100 | 28.98s @ 500,100

奇怪的是,沒有它的工作完美。

降序索引很可能會解決問題,但由於這似乎還沒有實現,我需要另一種選擇。 在訂購之後做WHERE可能會加速它,但是由於我對SQL比較陌生,所以我不知道該怎麼做:<

回答

1

什麼版本的MySQL您使用的是? v5.0文檔建議有一種方法來改變索引順序。

我會建議在兩列上創建索引。它應該看起來像這樣:

CREATE INDEX index_2_cols ON posts(exists, ratecount DESC); 
+0

這工作完美。謝謝! :D – 2012-04-13 11:24:56

+0

你可以發佈多少性能改進?只是爲了我的好奇:) – 2012-04-13 11:33:09

+1

從8.59s> 0.93s出發。相當肯定它可以降低,但這適用於我所需要的。 :3 公平地確定這是因爲即使選項存在,實際上也無法更改索引順序: 「index_col_name規範可以以ASC或DESC結尾,這些關鍵字可用於指定升序或降序索引值的將來擴展存儲。目前,它們被解析但被忽略;索引值總是以升序存儲「 – 2012-04-13 11:52:19

0

既然你說過忽略where條件使其運行速度很快,我想嘗試create an indexpostsexists領域:

CREATE INDEX ON posts_exists ON posts (exists(10)); 
+0

這似乎沒有工作,它仍然與第二個查詢大約相同的速度。 – 2012-04-13 11:19:51