mysql - 您将如何优化以下查询

标签 mysql optimization

我使用以下查询来查找我的 Drupal 站点中查看次数最多的 6 个页面:

SELECT n.title, n.nid, c.daycount 
FROM node n 
JOIN node_counter c ON n.nid=c.nid 
WHERE n.type='page' AND n.status = 1 
ORDER BY c.daycount DESC
LIMIT 0,6;

这非常自然,并且在大多数网站上都运行良好。然而,在具有许多节点(1.7m)的站点上,它的速度相当慢,并且几乎不会被缓存,因为当用户在系统中添加/编辑节点时,节点表不断变化。

在繁忙的站点上运行解释会产生以下输出:

+----+-------------+-------+--------+-----------------------------------------------+------------------+---------+------------------+-------+----------------------------------------------+
| id | select_type | table | type   | possible_keys                                 | key              | key_len | ref              | rows  | Extra                                        |
+----+-------------+-------+--------+-----------------------------------------------+------------------+---------+------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | n     | ref    | PRIMARY,node_type,status,node_status_type,nid | node_status_type | 102     | const,const      | 71878 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | c     | eq_ref | PRIMARY                                       | PRIMARY          | 4       | kidstvprd2.n.nid |     1 | Using where                                  |
+----+-------------+-------+--------+-----------------------------------------------+------------------+---------+------------------+-------+----------------------------------------------+

注意“使用位置;使用临时;使用文件排序”。

我想到的一个解决方案是离线运行这个查询(也许在 cron 中),并将结果保存在另一个表中供任何人读取,直到下一次 cron 运行更新它。然而,在恢复到 cron 之前,我想尝试优化这个查询。

有人知道如何优化它吗?

谢谢

最佳答案

问题是它是从 n 表开始的,而不是 c 表。您想要的是它在 c.daycount 上使用索引(以避免排序),然后将其连接到 n。如有必要,请使用 Straight_join 强制排序。

另请参阅http://dev.mysql.com/doc/refman/5.1/en/join.html

关于mysql - 您将如何优化以下查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/887072/

相关文章:

java - 登录-注销 session 无法正常工作

optimization - PuLP - COIN-CBC 错误 : How to add constraint with double inequality and relaxation?

ios - 在 Swift 中优化屏幕反馈绘制立方贝塞尔曲线

algorithm - 优化 Modbus 请求

mysql - 在开始新的更改操作之前缺少逗号

java - 使用 Intellij 配置 JPA

c# - 优化多个网页的下载。 C#

vb.net - 我应该为此查询使用 LINQ 吗?

PHP/SQL 等于某列

mysql - SQL - 创建一个返回表行的函数