mysql - 使用索引优化带有 GROUP BY 子句的查询

标签 mysql sql

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

这是表的结构和查询:

 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;

示例查询:

SELECT type, COUNT(*) AS objects FROM geo_reverse WHERE tablename = 'table1' AND geo_city IN (5847207,5112771,4916894,...) GROUP BY type

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

最佳答案

我会使用以下索引:(geo_city,表名,类型) - geo_city 显然比表名更具选择性,因此它应该位于左侧。应用条件后,其余的应按类型排序进行分组。

关于mysql - 使用索引优化带有 GROUP BY 子句的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8233754/

相关文章:

mysql - 使用 mysql 和正则表达式模式转换和提取行

php - 在页面中的特定时间后插入数据

php - 如何用mysql从已分解的数组中调用所有数据

php - elseif 在 while 子页面

php - MySQL php 插入...选择 : use commas to join $var+value

sql - 哪个 SQL 语句更快? (有与在哪里......)

sql - MSSQL2000 : get list of role members

c# - 批量查询异常

c# - Linq-to-SQL - 采取不工作

mysql - Symfony2 DBAL 更新方法返回 0