MySQL оптимизация запроса с предложением GROUP BY с использованием индексов - PullRequest
0 голосов
/ 23 ноября 2011

У меня следующая проблема. Мне нужно оптимизировать индексы в таблице, которая хранит более 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

У вас есть идеи, как ускорить вычисления?

Спасибо!

1 Ответ

2 голосов
/ 23 ноября 2011

Я бы использовал следующий индекс: (geo_city, tablename, type) - geo_city явно более избирателен, чем tablename, поэтому он должен быть слева.После применения условия остаток следует отсортировать по типу для группировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...