我正在使用PHP和MYSQL(innodb引擎)。
正如MYSQL参考所说,选择一列的比较和另一列的排序不能使用我们考虑的索引。
我有一个名为News
的表。
此表包含至少100万条记录,其中包含两个重要列:time_added
和number_of_views
。
我需要从过去n
小时内选择查看次数最多的记录。这样做的最佳指标是什么?或者是否可以非常快速地为具有数百万条记录的表运行此类查询?
我已经为“最后一天”做了这个,这意味着我可以通过添加新列(date_added
)从最后一天选择最常查看的记录。但如果我决定从上周选择这些记录,我又遇到了麻烦。
答案 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 ..
更新它。)
然后更改查询以使用该表;它会更快很多。