2011-12-28 67 views
1
  • 查詢緩存被禁用!
  • 索引是100%在RAM加載
  • 指數只有ID

1benchmark:Mysql查詢不使用主鍵

"SELECT title FROM posts LIMIT ?, 15"; 
? = rand(1,183655); 

EXPLAIN 
id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE posts ALL  NULL NULL NULL NULL 183637 

做100個循環後它接管100秒。

2Benchmark:

"SELECT title FROM posts WHERE id = 78845 OR id = 158738 OR id = 57065 OR id = 146797 OR id = 78918 OR id = 65227 OR id = 117987 OR id = 92541 OR id = 39782 OR id = 1958 OR id = 180384 OR id = 170758 OR id = 102227 OR id = 180223 OR id = 46391"; 

    in each loop every id is generated via rand(1,183655); 

做100個循環花費6秒來完成,它使用主鍵後。

的問題是我覺得在LIMIT MySQL不使用主鍵ID

再次與極限測試之後:

SECONDS:  LOOPS: SQL: 
41.560034990311 = 30 = "SELECT title FROM posts LIMIT ?, 15"; 
36.302664995193 = 30 = "SELECT title FROM posts ORDER BY id LIMIT ?, 15"; 
70.335160970688 = 30 = "SELECT title FROM posts ORDER BY id ASC LIMIT ?, 15"; 
48.453547000885 = 30 = "SELECT id, title FROM posts LIMIT ?, 15" 

不知怎的,但我不是100%肯定。我更新了我的VMware PHP5.1.6到PHP5.3,因爲後來我發現,這些LIMIT查詢需要更長的時間。

+0

'LIMIT BigNumber,AnyNumber'已知很慢。 – 2011-12-28 18:02:13

+0

更正:LIMIT mysql不使用主鍵作爲id。查詢開始生成行,當它碰到偏移行時,它開始輸出它們,直到達到row_count。你可以嘗試添加一個標題索引,看看是否有幫助(假設索引適合內存) – rene 2011-12-28 18:07:32

回答

2

您可以改爲運行以下命令:

SELECT title 
FROM posts 
WHERE id >= ? 
LIMIT 15 

它不等同於LIMIT ?, 15但它會使用索引。

您還可以查看此related article

+0

啊多數民衆贊成在偉大的!謝謝!現在查詢需要1.5秒的100循環,真的非常感謝! – user1015314 2011-12-28 18:12:37

+0

查看我添加的文章鏈接。 – 2011-12-28 18:17:34

+0

感謝非常有趣的網站 – user1015314 2011-12-28 22:53:36