2011-09-25 61 views
1

我使用此查詢查詢50k +行,它耗時1.2759秒。你認爲什麼是優化它的最好方法。數據每秒更新一次,但我可以將其緩存20秒。我一直在研究memcached,但有沒有一種方法來優化這個查詢?大多數列已經有索引。Mysql查詢優化 - 50k +行

SELECT `p`.`id` as performance_id, `p`.`performers`, `t`.`name` as track_name, `p`.`location`, `p`.`es_id` 
FROM (`performances` p) 
JOIN `users` u ON `p`.`user_id` = `u`.`id` 
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', '11', '13') 
AND `p`.`track` IN ('5', '15', '2', '3', '8', '6', '12', '4', '1') 
AND `p`.`type` IN ('1', '0', '2') 
ORDER BY `p`.`created` desc 
LIMIT 12 

更新:因此,這裏是從我的解釋計劃輸出。

+----+-------------+-------+--------+----------------------------------------+---------+---------+----------------------------------+-------+-----------------------------+ 
| id | select_type | table | type | possible_keys       | key  | key_len | ref        | rows | Extra      | 
+----+-------------+-------+--------+----------------------------------------+---------+---------+----------------------------------+-------+-----------------------------+ 
| 1 | SIMPLE  | p  | range | user_id,track,prop,flagged,status,type | status | 2  | NULL        | 27440 | Using where; Using filesort | 
| 1 | SIMPLE  | u  | eq_ref | PRIMARY,id        | PRIMARY | 3  | staging.p.user_id    |  1 | Using index     | 
| 1 | SIMPLE  | t  | eq_ref | PRIMARY        | PRIMARY | 4  | staging.p.track     |  1 | Using where     | 
+----+-------------+-------+--------+----------------------------------------+---------+---------+----------------------------------+-------+-----------------------------+ 
3 rows in set (0.00 sec) 

回答

2

MySQL只能在查詢的每個階段使用單個索引。您有許多單列索引,但其中只有一個將用於查詢。爲了更好地使用索引,請嘗試添加多列索引。舉個例子,你可以試試這個4列索引:

(status, type, prop, track) 

兩個列您在食指和它們的順序會影響到查詢的速度。如果不知道數據的分佈情況,很難說出最佳的順序,所以請隨時嘗試一下。您可以添加多個索引,運行查詢以查看實際使用的索引,然後刪除其他未使用的索引。

+1

一個簡單的'performances.created'索引也可能是有用的(取決於你的數據分佈),考慮到小限制(12)。 –

1

對您的查詢運行EXPLAIN PLAN並查找表掃描。如果找到一個,請考慮添加索引。

+1

如果它仍然迴避你,隨時編輯你的文章,幷包括解釋計劃的結果 – qdot

2

做什麼duffymo說,解釋,並創建索引。這將做你需要 的東西99%。如果你想使它更快,你也可以這樣做:

  1. 啓用查詢緩存

    query_cache_size變量= 268435456

    query_cache_type的= 1

    query_cache_limit = 1048576

  2. 您也可以增加表緩存大小