2011-09-25 59 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. 您也可以增加表缓存大小