mysql - 这个MySQL连接查询可以优化吗?

标签 mysql sql query-optimization

我有这个需要 27 秒执行的查询:

SELECT ocal_files.*, count(DISTINCT ocal_favs.username) as favs 
FROM ocal_files
   INNER JOIN ocal_favs on ocal_favs.clipart_id = ocal_files.id 
GROUP BY ocal_files.id 
ORDER BY favs DESC​

(而不是用户名,它应该是 user_id,因为我有用户表)

ocal_files 有 37457 行,ocal_favs 有 18263

编辑解释的结果

mysql> EXPLAIN SELECT ocal_files.*, count(DISTINCT ocal_favs.username) as favs FROM ocal_files INNER JOIN ocal_favs on ocal_favs.clipart_i
d = ocal_files.id GROUP BY ocal_files.id ORDER BY favs DESC;                                                                             
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+
| id | select_type | table      | type   | possible_keys  | key     | key_len | ref                             | rows  | Extra                           |
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+
|  1 | SIMPLE      | ocal_favs  | ALL    | rlb_clipart_id | NULL    | NULL    | NULL                             | 18622 | Using temporary; Using filesort|
|  1 | SIMPLE      | ocal_files | eq_ref | PRIMARY        | PRIMARY | 4       | openclipart.ocal_favs.clipart_id |     1 | Using where                    |
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+
2 rows in set (0.00 sec)

为什么会慢?可以优化吗?如果是那么怎么办?

最佳答案

尝试创建索引

ocal_favs ( clipart_id, username )

并确保 ocal_favs.username 上有 NOT NULL 约束,或添加 ocal_favs.username IS NOT NULL 作为条件。

这应该允许从 ocal_files 和那个索引中获取所有信息。

关于mysql - 这个MySQL连接查询可以优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11292842/

相关文章:

mysql - 如何获取 MySQL 服务器上每个数据库的空值计数?

sql - 谁能解释为什么这些查询不一样?

MySQL优化: index choice WHERE vs JOIN

mysql - 优化查询以查找订单之间的最大时间跨度

python - 类型错误 : execute() takes from 2 to 3 positional arguments but 7 were given

mysql - 使用子查询在 mysql 基础上删除非常慢

mysql - 加速连接表

mysql - 如何将数组插入到数据库中的字段 - wordpress

mysql - SQL (MySql) 外键和组合键语法错误

sql - 使用 select 和 where 子句更新查询