我使用此查詢查詢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)
一個簡單的'performances.created'索引也可能是有用的(取決於你的數據分佈),考慮到小限制(12)。 –