MySQL: использовать 2 ключа, один для объединения, другой для сортировки? - PullRequest
0 голосов
/ 02 октября 2009

У меня есть простое предложение where для ключевого поля, соединение двух таблиц в другом поле, а затем сортировка в другом поле второй таблицы. У меня есть ключи ко всему, но похоже, что описание дает мне сортировку файлов и 30-секундное выполнение запроса:

mysql> describe  SELECT * FROM `alias` LEFT OUTER JOIN `aliaspoint` ON (`alias`.`id` = `aliaspoint`.`alias_id`) WHERE `alias`.`type_id` = 9  ORDER BY `aliaspoint`.`points` DESC LIMIT 100 OFFSET 200; 
+----+-------------+---------------------+--------+------------------------+------------------------+---------+------------------------+--------+---------------------------------+
| id | select_type | table               | type   | possible_keys          | key                    | key_len | ref                    | rows   | Extra                           |
+----+-------------+---------------------+--------+------------------------+------------------------+---------+------------------------+--------+---------------------------------+
|  1 | SIMPLE      | metaward_alias      | ref    | metaward_alias_type_id | metaward_alias_type_id | 4       | const                  | 356710 | Using temporary; Using filesort |
|  1 | SIMPLE      | metaward_aliaspoint | eq_ref | alias_id               | alias_id               | 4       | paul.metaward_alias.id |      1 |                                 |
+----+-------------+---------------------+--------+------------------------+------------------------+---------+------------------------+--------+---------------------------------+
2 rows in set (7.52 sec)

Почему он не использует ключ для aliaspoint на points для заказа?

Таблицы:

mysql> show create table aliaspoint;
+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table               | Create Table                                                                                                                                                                                                                                                                                                        |
+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| aliaspoint | CREATE TABLE `aliaspoint` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `alias_id` int(11) NOT NULL,
  `points` double DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `alias_id` (`alias_id`),
  KEY `aliaspoint_points` (`points`)
) ENGINE=MyISAM AUTO_INCREMENT=1014683 DEFAULT CHARSET=latin1 |
+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Ответы [ 2 ]

1 голос
/ 02 октября 2009

Почему он не использует ключ для псевдонима в пунктах для заказа?

Поскольку индексы используются только для извлечения данных. Это возвращенные строки , которые нуждаются в сортировке.

1 голос
/ 02 октября 2009

Под "ключами" я полагаю, вы имеете в виду индексированные столбцы.

Вообще говоря, СУБД будет использовать один индекс и один индекс только для доступа к таблице.

Оптимизатор, очевидно, решил использовать индекс для фильтрации "где =" и затем сортируйте повторяющийся вывод. Он может использовать индекс по порядку столбца, чтобы получить все строки в правильной последовательности, а затем отфильтровать остальные, но это может испортить соединение.

Если вы подумаете об этом, вы увидите, что трудно сделать что-то еще. После того, как вы выбрали строку в результирующем наборе, индекс становится практически бесполезным, поскольку он указывает на строку на диске.

Вы можете попробовать объединить все три столбца в один индекс, что может привести к дополнительным трюкам.

...