繁体   English   中英

您如何优化以下查询

[英]How would you optimize the following query

我正在使用以下查询来查找我的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

在SQLServer中,我将确保具有以下索引

CREATE INDEX IX_NODE_NID_TYPE_STATUS_TITLE   
  ON dbo.Node (Nid, Type, Status) INCLUDE (Title)

CREATE INDEX IX_NODE_COUNTER_NID_DAYCOUNT 
  ON dbo.Node_Counter (Nid, DayCount)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM