优化从大表中选择

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 是对的,为您通常搜索的列添加索引,并且在查询运行时已经创建了哈希表。否则引擎将需要创建结果的哈希表才能真正获得结果。索引会事先执行此操作。

【讨论】:

以上是关于优化从大表中选择的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询优化从大表中获取8-10条记录

MySQL nodejs 在从大表中选择数据时崩溃

从大表中选择非空字段

MySQL - 从大表中选择随机行

从大表中有效地选择不同的(a,b)

优化比较两个 MySQL 大表中的数据