Какие индексы мне нужно добавить, чтобы ускорить этот запрос MYSQL JOIN / GROUP BY / HAVING? - PullRequest
1 голос
/ 24 июня 2011

Выполнение следующего запроса занимает около 30 секунд, когда current_vacature_response содержит 88k записей, а daily_vacature_response содержит 10k записей. Используя EXPLAIN, я пришел к выводу, что в таблице current_vacature_response нет индексов. Я добавил несколько основных индексов, но ни один из них, похоже, не используется. Какой индекс мне нужно установить, чтобы ускорить этот запрос?

Запрос:

SELECT c.`stats_date` as `stats_date` 
    FROM `current_vacature_response` c 
    LEFT JOIN `daily_vacature_response` d ON (c.`stats_date` = d.`stats_date` )
    GROUP BY c.`stats_date`, d.`stats_date` 
    HAVING max(d.`last_stats_datetime`) IS NULL 
        OR MAX(d.`last_stats_datetime`) < MAX(c.`created_datetime`);

определение таблицы current_vacature_response:

CREATE TABLE `current_vacature_response` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `created_datetime` datetime NOT NULL,
  `site_id` tinyint(1) unsigned NOT NULL,
  `stats_date` date NOT NULL,
  `type` enum('typ1', 'type2') NOT NULL,
  `vacature` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `current_vacature_created_datetime` (`created_datetime`),
  KEY `current_vacature_response_vacature` (`vacature`),
  KEY `current_vacature_response_type` (`type`),
  KEY `current_vacature_stats_date` (`stats_date`)
) ENGINE=MyISAM AUTO_INCREMENT=88210 DEFAULT CHARSET=utf8;

определение таблицы daily_vacature_response:

CREATE TABLE `daily_vacature_response` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `contact` int(10) unsigned NOT NULL DEFAULT '0',
  `site_id` tinyint(1) unsigned NOT NULL,
  `spotlight_result` int(10) unsigned NOT NULL DEFAULT '0',
  `stats_date` date NOT NULL,
  `last_stats_datetime` datetime NOT NULL,
  `vacature` int(10) unsigned NOT NULL,
  `created_datetime` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `daily_vacature_response_key` (`site_id`,`vacature`,`stats_date`),
  KEY `daily_vacature_response_last_stats_datetime` (`last_stats_datetime`),
  KEY `daily_vacature_response_stats_date` (`stats_date`)
) ENGINE=MyISAM AUTO_INCREMENT=9802 DEFAULT CHARSET=utf8;

Объяснить вывод:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: c
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 88209
        Extra: Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: d
         type: ref
possible_keys: daily_vacature_response_stats_date
          key: daily_vacature_response_stats_date
      key_len: 3
          ref: reporting_development.c.stats_date
         rows: 99
        Extra: 

1 Ответ

1 голос
/ 24 июня 2011

Попробуйте индекс на daily_vacature_response(stats_date, last_stats_datetime).

Я подозреваю, что это будет иметь огромное значение, но это наиболее вероятный кандидат.

Кроме того, попробуйте переписать запрос aнемного (может не работать в MySQL, но стоит попробовать):

GROUP BY c.`stats_date`, c.`created_datetime`, d.`stats_date` 
HAVING max(d.`last_stats_datetime`) IS NULL 
    OR max(d.`last_stats_datetime`) < c.`created_datetime`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...