2016-05-29 5 views
2

У меня есть две таблицы, как этотMysql - использование временных; Использование FileSort

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 нужно использовать временную таблицу и FileSort для такого простого запроса. Как вы можете видеть, что поле ORDER BY имеет индекс.

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

+0

Там, вероятно, ничего исправить. Сколько строк вы ожидаете в наборе результатов? Не беспокойтесь о сортировке 100 строк. –

ответ

0

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

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

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; Using temporary; Using filesort

+0

В вашем запросе должен быть указан тот же план выполнения. Вам нужно использовать STRAIGHT_JOIN или FORCE INDEX (обновлено), если вы хотите заставить MySQL сначала читать таблицу поставщиков. –

Смежные вопросы