Почему индекс s не используется для сортировки здесь? - PullRequest
3 голосов
/ 23 марта 2010

Настройка:

mysql> create table test(id integer unsigned,s varchar(30));
Query OK, 0 rows affected (0.05 sec)

mysql> insert into test(id,s) value(1,'s');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test(id,s) value(1,'tsr');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test(id,s) value(1,'ts3r');
Query OK, 1 row affected (0.00 sec)

mysql> create index i_test_id on test(id);
Query OK, 3 rows affected (0.08 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> create index i_test_s on test(s);
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql>  insert into test(id,s) value(21,'ts3r');
Query OK, 1 row affected (0.00 sec)

И затем выполните это:

mysql> explain select * from test where id in (1) order by s desc;
+----+-------------+-------+------+---------------+-----------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key       | key_len | ref   | rows | Extra                       |
+----+-------------+-------+------+---------------+-----------+---------+-------+------+-----------------------------+
|  1 | SIMPLE      | test  | ref  | i_test_id     | i_test_id | 5       | const |    2 | Using where; Using filesort |
+----+-------------+-------+------+---------------+-----------+---------+-------+------+-----------------------------+
1 row in set (0.02 sec)

Мы можем видеть, что он использует файловую сортировку вместо использования индекса на s, который будет медленным, когдавыбранный набор результатов большой. Как его оптимизировать?

Ответы [ 5 ]

1 голос
/ 23 марта 2010

Иногда MySQL не использует индекс, даже если он доступен.Одно из обстоятельств, при которых это происходит, - это когда оптимизатор оценивает, что для использования индекса MySQL потребует доступа к очень большому проценту строк в таблице.Как MySQL использует индексы

0 голосов
/ 08 января 2011

Проблема, с которой вы столкнулись, проистекает из того факта, что вы помещаете в свой SQL-оператор предложение Order by.Это приводит к тому, что MySql пропускает использование любого из индексов и выполняет полную сортировку на S. Оператор объяснения показывает, что MySql имеет i_test_id, из которого можно выбрать возможный индекс, а ключевое поле показывает, что он выбран, но он долженвыполнить сортировку по s.Оптимизатор решил не использовать i_test_s в качестве возможного индекса, поскольку он будет более дорогим с точки зрения производительности.Вы можете обойти эту проблему, создавая составные индексы за счет дискового пространства, или вы можете вместо этого структурировать свой запрос, используя Unions.Хотя не пробовал в вашем примере.

0 голосов
/ 23 марта 2010

На какой версии MySQL вы работаете? Только в версии 5 MySQL может использовать более одного индекса на таблицу.

Выбор используемых индексов также зависит от размера набора результатов. Если в результате будут возвращены только две записи, он все равно не сможет использовать индекс. Для таких небольших наборов результатов MySQL, похоже, не возражает сортировать вещи вручную.

Однако, что вы можете сделать, чтобы действительно помочь MySQL, если это обычный запрос для вас, это добавить составной индекс ('id', 's'). По сути, это похоже на создание еще одной маленькой таблицы, которая всегда сортируется по id, а не по s, поэтому сортировка файлов не требуется, и для этого потребуется только один индекс, а не два.

0 голосов
/ 23 марта 2010

Создать кластеризованный индекс для столбца «id».Кластерный индекс означает физическую сортировку.Таким образом, я предполагаю, что при вызове этого запроса не будет сортировки файлов.

Но таблица может иметь только один кластеризованный индекс.Следовательно, если у вас есть другой столбец, который является первичным ключом таблицы, вы не сможете создать кластеризованный индекс для столбца «id».Как первичные ключи по умолчанию кластеризованы.

0 голосов
/ 23 марта 2010

Индекс по id используется для идентификации возвращаемых строк. В зависимости от используемой версии MySQL он может разрешить использование только одного индекса на таблицу, и оптимизатор определил, что более эффективно использовать индекс для фильтрации строк, а не для упорядочивания.

...