Почему этот запрос использует где вместо индекса? - PullRequest
4 голосов
/ 10 ноября 2010
EXPLAIN EXTENDED SELECT  `board` . * 
FROM  `board` 
WHERE  `board`.`category_id` =  '5'
AND  `board`.`board_id` =  '0'
AND  `board`.`display` =  '1'
ORDER BY  `board`.`order` ASC

Результат запроса выше

id  select_type table   type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  board   ref category_id_2   category_id_2   9   const,const,const   4   100.00  Using where

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

category_id_2   BTREE   No  No 
category_id 33  A       
    board_id    33  A   
    display 33  A   
    order   66  A   

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Вывод EXPLAIN иногда может вводить в заблуждение.

Например, filesort не имеет никакого отношения к файлам, using where не означает, что вы используете предложение WHERE, а using index может отображаться в таблицах без определенного индекса.

Using where просто означает, что в таблице имеется некоторое ограничивающее предложение (WHERE или ON), и не все записи будут возвращены. Обратите внимание, что LIMIT не считается ограничительным предложением (хотя это может быть).

Using index означает, что вся информация возвращается из индекса без поиска записей в таблице. Это возможно, только если все поля, необходимые для запроса, покрыты индексом.

Поскольку вы выбираете *, это невозможно. Поля, отличные от category_id, board_id, display и order, не охватываются индексом и должны быть просмотрены.

0 голосов
/ 10 ноября 2010

Он правильно использует индекс category_id_2, как показано в поле key EXPLAIN.

Using where означает, что вы выбираете только несколько строк с помощью оператора WHERE, поэтому вы не получите всю таблицу обратно;)

0 голосов
/ 10 ноября 2010

На самом деле используется индекс category_id_2.

...