SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.12.2010 20:44:27

IDr
Участник
Зарегистрирован: 03.12.2010
Сообщений: 2

Как оптимизировать скорость GROUP BY при объединении таблиц

Здравствуйте!

Не могу разобраться, как оптимизировать скорость GROUP BY при объединении таблиц.
(версия сервера: 5.1.51)

Есть следующая таблица:

CREATE TABLE IF NOT EXISTS `tags_objects` (
  `obj_id` mediumint(8) unsigned NOT NULL,
  `tag_id` mediumint(8) unsigned NOT NULL,
  KEY `tag_obj` (`tag_id`,`obj_id`),
  KEY `obj_tag` (`obj_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

В ней ~250 000 записей, ~125 000 уникальных obj_id, ~200 уникальных tag_id
На каждый obj_id в среднем 2 tag_id

Запрос:
SELECT SQL_NO_CACHE t2.tag_id
FROM tags_objects AS t1, tags_objects AS t2
WHERE 1
AND t1.tag_id IN ( 3, 67, 66, 58, 53, 17, 16, 15, 14, 70, 72, 73, 74 )
AND t1.obj_id = t2.obj_id
GROUP BY t2.tag_id

Результат 100 строк, запрос занял 0.2780 сек.
(А если убрать GROUP BY то результат 72,256 строк, запрос занял 0.0014 сек.)

EXPLAIN:
+----+-------------+-------+-------+-----------------+---------+---------+-----------+-------+----
| id | select_type | table | type  | possible_keys   | key     | key_len | ref       | rows  | Extra
+----+-------------+-------+-------+-----------------+---------+---------+-----------+-------+----
|  1 | SIMPLE      | t1    | range | tag_obj,obj_tag | tag_obj | 3       | NULL      | 61569 | Using where; Using index; Using temporary; Using filesort

|  1 | SIMPLE      | t2    | ref   | obj_tag         | obj_tag | 3       | t1.obj_id |     1 | Using index
+----+-------------+-------+-------+-----------------+---------+---------+-----------+-------+----

Пробовал использовать комбинации индексов, но они почему-то медленней
(если я правильно понимаю EXPLAIN, то он использует только первые части индексов?):
(`tag_id`) и (`obj_id`,`tag_id`) - 0.5002 сек.
(`tag_id`,`obj_id`) и (`obj_id`) -  0.4464 сек.
(`tag_id`) и (`obj_id`) - 0.5149 сек.

Я так понимаю что для совершения "GROUP BY" MySQL использует "Using temporary; Using filesort",
из за чего и запрос такой медленный, а вот как ускорить так и не нашел

Отредактированно IDr (03.12.2010 20:46:23)

Неактивен

 

#2 03.12.2010 23:07:32

IDr
Участник
Зарегистрирован: 03.12.2010
Сообщений: 2

Re: Как оптимизировать скорость GROUP BY при объединении таблиц

Проблема решена, тема закрыта.

Подсказали в другом месте, вот решение:

SELECT SQL_NO_CACHE DISTINCT t2.tag_id
FROM tags_objects AS t1, tags_objects AS t2
WHERE 1
AND t1.tag_id IN ( 3, 67, 66, 58, 53, 17, 16, 15, 14, 70, 72, 73, 74 )
AND t1.obj_id = t2.obj_id

Отрабатывает за 0,0035 сек

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson