首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用索引优化具有GROUP BY子句的查询

使用索引优化具有GROUP BY子句的查询
EN

Stack Overflow用户
提问于 2011-11-23 05:00:17
回答 1查看 529关注 0票数 0

我需要在一个存储超过1000万行的表中优化索引。特别耗时的查询最多需要10秒来加载( WHERE子句只过滤大约200万行-必须对800万行进行分组)。我已经创建了几个索引(有些很复杂,有些比较简单),并试图找出如何加快速度。也许我做错了什么。MySQL使用optimized_5索引(基于EXPLAIN)。

下面是表的结构和查询:

代码语言:javascript
运行
复制
 CREATE TABLE IF NOT EXISTS `geo_reverse` (
     `fid` mediumint(8) unsigned NOT NULL,
     `tablename` enum('table1','table2') NOT NULL default 'table1',
   `geo_continent` varchar(2) NOT NULL,
   `geo_country` varchar(2) NOT NULL,
   `geo_region` varchar(8) NOT NULL,
   `geo_city` mediumint(8) unsigned NOT NULL,
   `type` varchar(30) NOT NULL,

  PRIMARY KEY  (`fid`,`tablename`,`geo_continent`,`geo_country`,`geo_region`,`geo_city`),
   KEY `geo_city` (`geo_city`),
   KEY `fid` (`fid`),
   KEY `geo_region` (`geo_region`,`geo_city`),
   KEY `optimized` (`tablename`,`type`,`geo_continent`,`geo_country`,`geo_region`,`geo_city`,`fid`),
   KEY `optimized_2` (`fid`,`tablename`),
   KEY `optimized_3` (`type`,`geo_city`),
   KEY `optimized_4` (`geo_city`,`tablename`),
   KEY `optimized_5` (`tablename`,`type`,`geo_city`),
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

查询示例:

代码语言:javascript
运行
复制
SELECT type, COUNT(*) AS objects FROM geo_reverse WHERE tablename = 'table1' AND geo_city IN (5847207,5112771,4916894,...) GROUP BY type

你知道如何加快计算速度吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-23 05:40:14

我将使用以下索引:( geo_city,tablename,type) -geo_city显然比tablename更具选择性,因此它应该在左边。在应用条件后,其余部分应按类型进行排序以进行分组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8233754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档