优化从大表中选择
Posted
技术标签:
【中文标题】优化从大表中选择【英文标题】:Optimizing a select from a large table 【发布时间】:2012-03-29 14:24:03 【问题描述】:我有一个大约有 4000 万行的表,我想运行这样的东西:
SELECT country, count(*) FROM `signups`
where `signed_up` > '2012-03-20 00:00:00'
group by country
基本上是在特定日期(通常是上周)之后获取每个国家/地区的注册人数。每天大约有 40 万注册,总共有 4000 万左右。
查询在上周没有运行,我得到一个“mysql 服务器已消失”...有什么优化方法吗?
【问题讨论】:
countries
上有哪些索引?
只有一个索引,主键是signup_id
始终使用 EXPLAIN SELECT ... 命令来查看您的数据库将如何回答您的查询。自从您在此字段上搜索以来,signed_up 上的索引也不会受到伤害。
【参考方案1】:
请使用以下查询并在 signed_up 列上添加索引。您一定会获得性能提升。
从signups
选择国家,计数(signup_id)
其中signed_up
> '2012-03-20 00:00:00'
按国家分组
问候, 阿洛克
【讨论】:
【参考方案2】:计数 * 是对性能的打击。如果可能的话,最好不要做任何事情。这只是导致数据库引擎做更多的工作,从而减慢了查询速度。
Alok 是对的,为您通常搜索的列添加索引,并且在查询运行时已经创建了哈希表。否则引擎将需要创建结果的哈希表才能真正获得结果。索引会事先执行此操作。
【讨论】:
以上是关于优化从大表中选择的主要内容,如果未能解决你的问题,请参考以下文章