Mysql - Использование временного; Использование файловой сортировки

у меня две такие таблицы

CREATE TABLE `vendors` (
  vid int(10) unsigned NOT NULL AUTO_INCREMENT,
  updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (vid),
  key(updated)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `products` (
  vid int(10) unsigned NOT NULL default 0,
  pid int unsigned default 0,
  flag int(11) unsigned DEFAULT '0',
  PRIMARY KEY (vid),
  KEY (pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Это простой запрос

> explain select vendors.vid, pid from products, vendors where pid=1 and vendors.vid=products.vid order by updated;
+------+-------------+----------+--------+---------------+---------+---------+---------------------+------+----------------------------------------------+
| id   | select_type | table    | type   | possible_keys | key     | key_len | ref                 | rows | Extra                                        |
+------+-------------+----------+--------+---------------+---------+---------+---------------------+------+----------------------------------------------+
|    1 | SIMPLE      | products | ref    | PRIMARY,pid   | pid     | 5       | const               |    1 | Using index; Using temporary; Using filesort |
|    1 | SIMPLE      | vendors  | eq_ref | PRIMARY       | PRIMARY | 4       | social.products.vid |    1 |                                              |
+------+-------------+----------+--------+---------------+---------+---------+---------------------+------+----------------------------------------------+

Мне интересно, почему mysql нужно использовать временную таблицу и сортировку файлов для такого простого запроса. Как видите, в поле ORDER BY есть index.

скрипт mysql здесь: http://sqlfiddle.com/#!9/3d9be/30


person Mark    schedule 29.05.2016    source источник
comment
Исправить, наверное, нечего. Сколько строк вы ожидаете получить в результирующем наборе? Не беспокойтесь о сортировке 100 строк.   -  person Paul Spiegel    schedule 29.05.2016


Ответы (1)


Это будет оптимальный запрос в этом случае, не всегда нужно обращаться к индексу для получения самого быстрого результата. Оптимизатор может выбрать использование индекса, когда количество записей увеличивается. Вы можете попробовать вставить 10 000 фиктивных записей и посмотреть, так ли это.

Если я переверну условия здесь, вы обнаружите, что он будет использовать индекс, поскольку я предоставил таблицу, в которой условие where соединяется позже в запросе. Нам нужно просмотреть записи в табличных продуктах после того, как объединение выполнено, поэтому, по сути, я усложнил работу, поэтому используется индекс. Он по-прежнему будет работать в то же время. Вы можете попробовать сопоставить два запроса друг с другом, чтобы посмотреть, что произойдет. Вот:

EXPLAIN
SELECT vendors.vid, products.pid 
FROM vendors 
INNER JOIN products ON vendors.vid = products.vid
WHERE pid = 1
ORDER BY vendors.updated DESC

Вы можете найти подробное объяснение здесь: Fix Using where; Использование временного; Использование файловой сортировки

person Paul Stanley    schedule 29.05.2016
comment
Ваш запрос должен создать тот же план выполнения. Вам нужно использовать STRAIGHT_JOIN или FORCE INDEX (обновлено), если вы хотите заставить MySQL сначала читать из таблицы поставщиков. - person Paul Spiegel; 29.05.2016