[英]Best approach to select most viewed posts from last n hours
我正在使用PHP和MYSQL(innodb引擎)。
正如MYSQL参考所言,选择比较一列并按另一列排序不能使用我们考虑的索引。
我有一个名为News
的表。
该表至少有100万条记录,其中包含两个重要列: time_added
和number_of_views
。
我需要选择最近n
小时中观看次数最多的记录。 这样做的最佳索引是什么? 还是可以对具有数百万条记录的表非常快速地运行这种查询?
我已经为“最后一天”完成了此操作,这意味着我可以通过添加新列( date_added
)从前一天中选择观看次数最多的记录。 但是,如果我决定从上周选择这些记录,那我又会遇到麻烦。
首先,编写查询:
select n.*
from news n
where time_added >= date_sub(now(), interval <n> hours)
order by number_of_views desc
limit ??;
最好的索引是(time_added, number_of_views)
。 实际上, number_of_views
不会用于完整查询,但我会将其包含在其他可能的查询中。
首先,您必须将以下行添加到my.cnf中
[mysqld]):
query_cache_size = 32M (or more).
query_cache_limit = 32M (or more)
query_cache_size设置缓存的大小
另一个要注意的选项-这个query_cache_limit-它设置查询结果的最大数量,可以将其放置在缓存中。 检查缓存的状态,您可以请求以下内容:
show global status like 'Qcache%';
http://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html
如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行。 例如,如果在(col1,col2,col3)上有一个三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上都有索引搜索功能。 有关更多信息,请参见http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html
您需要一个汇总表。 由于“小时”是您的粒度,因此可能会发生以下情况:
CREATE TABLE HourlyViews (
the_hour DATETIME NOT NULL,
ct SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY(the_hour)
) ENGINE=InnoDB;
如果您要计数的项目有一些细分,则可能需要另一列(并将其添加到PK)。 您可能还需要在此表中进行SUM或COUNT运算。
逐步构建和维护该表。 即,每小时将另一行添加到表中。 (或者,您可以使用INSERT .. ON DUPLICATE KEY UPDATE ..
对其进行更新。)
然后更改查询以使用该表; 它会快很多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.