2011-10-14 111 views
0

我有100,000行,並且此查詢有時可能需要2秒以上。我試圖優化它,併成功將DESC創建的字段編入索引。我試圖進一步優化這個查詢,並且想知道這個查詢是否真的加入了所有100,000行的「軌道」,而不僅僅是我實際需要的12個。這可能會導致一個較慢的查詢?MySql加入後選擇 - 慢速查詢

查詢:

SELECT `p`.`id` as performance_id, `p`.`performers`, `t`.`name` as track_name, `p`.`location`, `p`.`fms_id` 
FROM (`performances` p) 
JOIN `tracks` t ON `p`.`track` = `t`.`id` 
WHERE (p.status = 1 OR (p.status != 2 && p.flagged < 3)) 
AND `p`.`prop` IN ('1', '2', '3', '4', '5', '6', '8', '10', '11', '13') 
AND `p`.`track` IN ('17', '9', '5', '15', '2', '3', '8', '6', '12', '4', '1') 
AND `p`.`type` IN ('1', '0', '2') 
ORDER BY `p`.`created` desc 
LIMIT 0, 12 

說明:曲目列表

1 SIMPLE p index track,prop,flagged,status,type created_desc 5 NULL 239 Using where 
1 SIMPLE t eq_ref PRIMARY PRIMARY 4 database_name.p.track 1 Using where 
+0

你應該還會發布查詢中涉及的表和您擁有的其他索引。 –

+0

嘗試使用JOIN ....將所有IN語句移動到JOIN。作爲WHERE子句只保留WHERE(p.status = 1 OR(p.status!= 2 && p.flagged <3))。 – gview

+1

在performance表的'track'列上創建索引會給出所需的行爲(查詢不會加入所有100,000行的「軌跡」。) – Bala

回答

1

使用臨時表,並加入與主查詢,而不是使用 'IN' 子句臨時表。通常,避免使用IN子句,因爲列表中的項目數量增加,查詢計劃可能會發生變化。

創建上表演臺的「跟蹤」列索引會得到期望的行爲(查詢不會加入「軌道」上的所有100,000行。)

http://apps.ycombinator.com/item?id=2206406

http://dbaspot.com/sybase/240012-plan-change-clause-number-set-elements-print.html

+0

臨時表爲什麼要比IN更高效? –

+0

或者添加一個合適的索引。 –

+0

編輯回覆以清除問題 – Bala