Почему мой запрос занимает в два раза больше времени, когда я перехожу на поле utf8? - PullRequest
0 голосов
/ 21 января 2009

Первоначально для моего поля было установлено значение latin1_swedish_ci, которое я изменил на utf8_general_ci (как для поля, так и для таблицы), а затем обнаружил, что мой запрос изменился с ~ 1,8 секунды до ~ 3,3. У меня есть индекс на поле и даже воссоздал индекс (удалить, затем добавить). Поле используется в порядке заказа.

Есть идеи, если может быть проблема или это нормально?

Я использую MySQL 5.0.

Ответы [ 3 ]

4 голосов
/ 21 января 2009

latin1_swedish_ci - система кодирования один октет на символ. Если вы знаете порядок сортировки (или сортировки), сравнение символов и целых строк становится относительно тривиальным.

utf8_general_ci требуется от одного до четырех октетов на символ. Декодирование данных октетов в этой кодировке сложнее, поэтому это занимает больше времени.

2 голосов
/ 21 января 2009

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

набор символов latin1_swedish_ci - это система кодирования одного октета, что означает, что каждый символ, закодированный этой системой, занимает ровно один байт. Сравните это с набором символов utf8_general_ci, где каждый символ состоит из от одного до четырех октетов на символ, то есть для представления каждого символа требуется от одного до четырех байтов.

Это имеет очевидный недостаток, заключающийся в том, что символы utf8 занимают больше места, больше памяти и, что самое важное, больше времени для идентификации процессора. И самое очевидное преимущество заключается в том, что символы utf8 могут кодироваться для любого символа Юникода.

Поскольку этот вопрос помечен как «запрос-оптимизация», вам нужно спросить себя, действительно ли вам нужно представлять более «экзотические» символы или они представлены в однооктетных системах (таких как обычный ASCII- Таблица) достаточно для ваших нужд. Поскольку по своей природе utf8 будет потреблять больше ресурсов процессора / памяти.

0 голосов
/ 21 января 2009

Как выглядит ваш запрос?

Возможно ли, что вы используете фильтр для этого поля и указали тип данных вашего параметра как тип данных не-utf8? В этом случае СУБД придется выполнить кастинг, что снизит производительность.

...