我有一个名为ad_view
的表,它在该表中有1890万个数据。
这是ad_vew
ad_view
-------
ad_id
network_id
publisher_id
landingpage_id
advertiser_id
我正在使用此查询获取ad_id
和ad_id
的计数,具体取决于network_id
,因此在这种情况下,network_id
为4
select ad_id,count(ad_id) as strength
from ad_view
where network_id = 4
group by ad_id
order by strength desc
limit 10
此查询需要永远加载。您有什么建议如何快速进行此查询?
我不是数据库专家,如果需要重新设计此表,我会这样做。
任何建议都将不胜感激,谢谢!
答案 0 :(得分:3)
这会有所帮助:
ALTER TABLE ad_view ADD INDEX (network_id, ad_id).
确保您已调整innodb_buffer_pool_size
以将桌面中经常请求的部分保存在内存中。
您可能会喜欢我的演示文稿How to Design Indexes, Really。该演示文稿不会用于GROUP BY
的索引编制,但您可以将其视为范围条件。
答案 1 :(得分:3)
1 在network_id
上创建索引,因为您正在搜索
ALTER TABLE `ad_view` ADD INDEX (`network_id`);
2 如果您尝试获得给定ad_id
的{{1}}计数,为什么结果中需要network_id
?为什么需要ad_id
?我不明白这一点。如果您想要的只是 network_id 4 的ad_ids数量,那么请执行以下操作:
order by
它只返回一个数字。见this demo
PS:您的初始帖子中包含一个损坏的查询(在SELECT COUNT(IF(network_id=4,1,null)) as strength from ad_view
子句中),您在我发表评论后对其进行了更改。您当前的查询仍然无法提供您想要的内容。我刚试了on this fiddle