我有以下问题。我需要在存储超过10百万行的表中优化索引。特别耗时的查询最多需要10秒才能加载(当WHERE子句仅过滤约2百万行时 - 必须对8百万行进行分组)。我创建了一些索引(其中一些是复杂的,一些更简单),并试图找出如何加快速度。也许我做错了什么。 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
你知道如何加快计算速度吗?
谢谢!
答案 0 :(得分:2)
我会使用以下索引:(geo_city,tablename,type) - geo_city显然比tablename更具选择性,因此它应该在左侧。应用条件后,其余部分应按类型进行分类。