2013-01-12 81 views
2

我有一個INNER JOIN簡單的查詢。連接的表格有1500行和2500行。兩個表都有一個主鍵。此連接不在此鍵上完成。添加限制加速mysql查詢,爲什麼?

此查詢的結果集有1500行。 當我運行此查詢它需要20秒......(一個永恆

SELECT so.order_id 
FROM shop_orders so 
     INNER JOIN shop_order_payments sop 
      ON so.order_code = sop.order_code 
WHERE sop.status = 9 
ORDER BY date_created DESC 

當我然後添加「LIMIT 1500」末,查詢只需要1秒。 (當我刪除它需要20秒,所以它不是緩存...)

  1. 這是爲什麼?
  2. 有沒有一種快速的方法來找出這個查詢有多少行作爲結果?

注:我運行PHP腳本這個查詢與MySQL()函數)

* UPDATE1:結果的EXPLAIN

 
id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE sop ALL NULL NULL NULL NULL 1153 Using where; Using temporary; Using filesort 
1 SIMPLE so ALL NULL NULL NULL NULL 2529 Using where 

  • 更新2:

我按照評論中的要求運行DESC

 

payment_id - int(11) NO PRI  auto_increment 
timestamp - timestamp NO  CURRENT_TIMESTAMP 
order_code - varchar(100)NO   
acceptance - varchar(50) NO   
amount - varchar(20) NO   

所以只有一個主要指標出現,這是不夠的,作爲一個索引?

+4

'EXPLAIN'說什麼? –

+0

查詢需要很長時間才能運行,因爲可能缺少索引。你可以查詢這個結果嗎? 'DESC shop_orders'和'DESC shop_order_payments'? –

+2

你有什麼指數?你可以爲每個表顯示「SHOW CREATE TABLE ...」的輸出嗎? –

回答

1

EXPLAIN表明查詢使用的是沒有索引。因此它執行完整的掃描,導致它慢。

嘗試運行此語句,

ALTER TABLE shop_orders ADD INDEX td_idx (order_code); 
ALTER TABLE shop_order_payments ADD INDEX td2_idx (order_code); 

並再次運行SELECT查詢。

更新1

表有在這種情況下是不是因爲聯接使用列order_code使用的索引,但在payment_id列。您還必須在該列上定義索引。

+1

查詢現在只需要0.05秒...感謝! –

+0

不客氣':D' –