Mysql查询优化--50k +行

时间:2011-09-25 20:41:12

标签: mysql optimization

我使用此查询查询50k +行,它需要1.2759秒。您认为优化它的最佳方式是什么?数据每秒钟更新一次,但我可以将其缓存20秒。我一直在研究memcached,但有没有办法优化这个查询?大多数列上都有索引。

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 

更新:所以这是我的EXPLAIN计划的输出。

+----+-------------+-------+--------+----------------------------------------+---------+---------+----------------------------------+-------+-----------------------------+
| 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)

3 个答案:

答案 0 :(得分:2)

做duffymo说,解释和创建索引。这将完成你需要的99%的东西 如果你想让它更快,你也可以这样做:

  1. 启用查询缓存

    query_cache_size = 268435456

    query_cache_type的= 1

    query_cache_limit = 1048576

  2. 您还可以增加表缓存大小

答案 1 :(得分:2)

MySQL只能在查询的每个阶段使用单个索引。您有许多单列索引,但只有其中一个将用于您的查询。要更好地使用索引,请尝试添加多列索引。例如,您可以尝试这个4列索引:

(status, type, prop, track)

索引中包含的列及其顺序都会影响查询的速度。在不知道数据分布的情况下很难说出最佳顺序,所以请随意尝试一下。您可以添加多个索引,运行查询以查看实际使用的索引,然后删除其他未使用的索引。

答案 2 :(得分:1)

在查询中运行EXPLAIN PLAN并查找表扫描。如果找到一个,请考虑添加索引。