2014-10-08 3 views
3

У меня есть сомнения, вот мой стол:MySQL порядок следования столбцов в составной ключ

mysql> show create table watchdog\G 
*************************** 1. row *************************** 
    Table: watchdog 
    Create Table: CREATE TABLE `watchdog` (
     `index1` int(11) NOT NULL DEFAULT '0', 
     `index2` int(11) NOT NULL DEFAULT '0', 
     `dog` int(11) NOT NULL DEFAULT '9', 
     PRIMARY KEY (`index1`,`index2`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

    1 row in set (0.00 sec) 

< 1> Первый запрос:

select index1, index2 
from watchdog 
where index1 > 4000008 and index1 < 4200007; 

Результат:

 
... 
| 4200001 | 4200002 | 
| 4200002 | 4200003 | 
| 4200003 | 4200004 | 
| 4200004 | 4200005 | 
| 4200005 | 4200006 | 
| 4200006 | 4200007 | 
+---------+---------+ 

199997 rows in set (0.09 sec) 

< 2> Второй запрос:

select index1, index2 
from watchdog 
where index2 > 4000009 and index2 < 4200007; 

Результат:

 
... 
| 4200002 | 4200003 | 
| 4200003 | 4200004 | 
| 4200004 | 4200005 | 
| 4200005 | 4200006 | 
+---------+---------+ 

199997 rows in set (1.68 sec) 

время они используются в 0.9sec и 1.68sec! Может ли кто-нибудь сказать мне, почему? Что происходит с композитным порядком клавиш?

ответ

7

У MySQL есть хорошие documentation на составных индексах, которые вы должны просмотреть. Позвольте мне обобщить вопрос для вашего запроса.

Соответствующая часть запроса является where пункт:

where index1 > 4000008 and index1 < 4200007; 
index2 > 4000009 and index2 < 4200007; 

У вас есть индекс по index1, index2, в таком порядке. В общем, MySQL может посмотреть на запрос и сделать один из трех вещей с индексом:

  1. решили не использовать индекс на всех (на основе статистических данных или неприменимости в запросе)
  2. Решают использовать index1 компонент.
  3. Решите использовать index1иindex2.

В первом запросе MySQL может выбрать второй вариант. Таким образом, он использует индекс для сравнения index1. Затем он, по-видимому, просматривает соответствующие строки, оценивая значение index2 в индексе, находит идентификаторы строк, просматривает их и возвращает строки.

Для второго предложения where он не может использовать индекс. Первый ключ индекса - index1, и его нет в запросе. Таким образом, MySQL должен выполнить полное сканирование таблицы.

0

Поскольку вы определили ключ , который может использоваться только в том случае, если оба столбца или первый столбец используются в вашем предложении where.

Но вы используете только второй столбец своего ключа в медленном запросе.

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