从过去n小时中选择观看次数最多的帖子的最佳方法

时间:2016-07-02 19:33:13

标签: php mysql indexing innodb

我正在使用PHP和MYSQL(innodb引擎)。

正如MYSQL参考所说,选择一列的比较和另一列的排序不能使用我们考虑的索引。

我有一个名为News的表。

此表包含至少100万条记录,其中包含两个重要列:time_addednumber_of_views

我需要从过去n小时内选择查看次数最多的记录。这样做的最佳指标是什么?或者是否可以非常快速地为具有数百万条记录的表运行此类查询?

我已经为“最后一天”做了这个,这意味着我可以通过添加新列(date_added)从最后一天选择最常查看的记录。但如果我决定从上周选择这些记录,我又遇到了麻烦。

3 个答案:

答案 0 :(得分:1)

首先,编写查询:

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不会用于完整查询,但我会将其包含在其他可能的查询中。

答案 1 :(得分:0)

首先,您必须将以下行添加到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

答案 2 :(得分:0)

您需要一个汇总表。自&#39;小时&#39;是你的粒度,这样的东西可能会起作用:

CREATE TABLE HourlyViews (
    the_hour DATETIME NOT NULL,
    ct SMALLINT UNSIGNED NOT NULL,
    PRIMARY KEY(the_hour)
) ENGINE=InnoDB;

如果您计算的项目出现故障,可能需要另一列(并将其添加到PK)。您可能还需要在此表格中输入其他内容或其他内容。

以递增方式构建和维护此表。也就是说,每小时,向表中添加另一行。 (或者您可以使用INSERT .. ON DUPLICATE KEY UPDATE ..更新它。)

More on Summary Tables

然后更改查询以使用该表;它会更快很多