如何优化复杂的mysql查询?

时间:2017-08-01 09:42:37

标签: mysql query-optimization

当我探索这个时:

EXPLIAN SELECT m.*,m.id AS mid FROM movie_category mc 
LEFT JOIN movie m ON m.id=mc.movie_id  
RIGHT JOIN movie_area ma ON ma.movie_id=mc.movie_id 
LEFT JOIN area a ON a.id=ma.area_id 
LEFT JOIN category c ON c.id=mc.category_id 
WHERE 1 and ma.area_id>0 
GROUP BY mid  
ORDER BY m.read_count desc  LIMIT 0,36;

我得到了这个结果:

+----+-------------+-------+------------+--------+-----------------+----------+---------+----------------------+-------+----------+---------------------------------+
| id | select_type | table | partitions | type   | possible_keys   | key      | key_len | ref                  | rows  | filtered | Extra                           |
+----+-------------+-------+------------+--------+-----------------+----------+---------+----------------------+-------+----------+---------------------------------+
|  1 | SIMPLE      | ma    | NULL       | ALL    | NULL            | NULL     | NULL    | NULL                 | 15545 |   100.00 | Using temporary; Using filesort |
|  1 | SIMPLE      | mc    | NULL       | ref    | movie_id        | movie_id | 5       | flask.ma.movie_id    |     2 |   100.00 | NULL                            |
|  1 | SIMPLE      | m     | NULL       | eq_ref | PRIMARY,year_id | PRIMARY  | 4       | flask.ma.movie_id    |     1 |   100.00 | NULL                            |
|  1 | SIMPLE      | a     | NULL       | eq_ref | PRIMARY         | PRIMARY  | 4       | flask.ma.area_id     |     1 |   100.00 | Using index                     |
|  1 | SIMPLE      | c     | NULL       | eq_ref | PRIMARY         | PRIMARY  | 4       | flask.mc.category_id |     1 |   100.00 | Using index                     |
+----+-------------+-------+------------+--------+-----------------+----------+---------+----------------------+-------+----------+---------------------------------+
5 rows in set, 1 warning (0.00 sec)

如何优化此查询?我真的不知道该怎么做,帮帮我。

编辑: 从解释结果来看,第一行的额外是"使用临时;使用filesort",并不好。第二行的Extra和第三行的Extra都是NULL,也不好。

PS: 查询跨度0.91秒,非常糟糕。如何添加索引来证明查询速度。

1 个答案:

答案 0 :(得分:1)

改进架构

如果没有看到涉及的模式,我将假设您有两个多对多映射表(mc,ma),它们的定义效率低下。

遵守规则here;你会获得一些效率。

摆脱不必要的表格

查询中并未真正使用

function abc(sender, args) { var Imagename = args.get_fileName(); alert(Imagename ); } category,因此请将其从查询中删除。

我认为这是一个“生成”的查询?然后让这一代变得更加复杂!