Как MySQL использует сопоставления с индексами? - PullRequest
5 голосов
/ 12 марта 2009

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

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

У меня есть индекс в этом поле, который используется для удовлетворения предложения ORDER BY, быстрого извлечения строк по порядку (избегая сортировки файлов). Однако я не уверен, повлияет ли использование этого сопоставления на скорость строк при их обратном чтении из индекса или если индекс хранит данные в уже нормализованном состоянии в соответствии с этим сопоставлением, что позволяет снизить производительность быть полностью в создании индекса и не читать его обратно.

Ответы [ 2 ]

5 голосов
/ 12 марта 2009

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

Посмотрите на эти два плана запроса:

mysql> explain select * from sometable where keycol = '3';
+----+-------------+-------+------+---------------+---------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key     | key_len | ref   | rows | Extra                    |
+----+-------------+-------+------+---------------+---------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | pro   | ref  | PRIMARY       | PRIMARY | 66      | const |   34 | Using where; Using index | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+--------------------------+


mysql> explain select * from sometable where binary keycol = '3';
+----+-------------+-------+-------+---------------+---------+---------+------+-------+--------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows  | Extra                    |
+----+-------------+-------+-------+---------------+---------+---------+------+-------+--------------------------+
|  1 | SIMPLE      | pro   | index | NULL          | PRIMARY | 132     | NULL | 14417 | Using where; Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+--------------------------+

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

Так что поиск сопоставления без учета регистра должен быть немного менее эффективным.

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

UPDATE:

Вы можете увидеть аналогичный эффект для заказа по операциям:

mysql> explain select * from sometable order by keycol collate latin1_general_cs;
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-----------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows  | Extra                       |
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-----------------------------+
|  1 | SIMPLE      | pro   | index | NULL          | PRIMARY | 132     | NULL | 14417 | Using index; Using filesort | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-----------------------------+

mysql> explain select * from sometable order by keycol ;
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows  | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
|  1 | SIMPLE      | pro   | index | NULL          | PRIMARY | 132     | NULL | 14417 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+

Обратите внимание на дополнительную стадию 'filesort', необходимую для выполнения запроса. Это означает, что mysql помещает в очередь результат во временном буфере и сортирует его сам, используя быструю сортировку на дополнительном этапе, отбрасывая независимо от порядка индекса. Используя исходное сопоставление, этот шаг не требуется, поскольку mysql изначально знает порядок по индексу.

5 голосов
/ 12 марта 2009

MySQL будет использовать сопоставление столбца для индекса. Таким образом, если вы создадите поле utf8_unicode_ci, то индекс также будет в порядке utf8_unicode_ci.

Имейте в виду, что использование индекса не всегда на 100% обходит влияние на производительность, но для большинства практических целей оно будет.

Многие системы баз данных не привязаны к процессору, поэтому я сомневаюсь, что вы заметите это влияние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...