MySQL двоичное сравнение не использует индекс - PullRequest
5 голосов
/ 26 октября 2010

У меня следующий запрос:

EXPLAIN EXTENDED SELECT *
FROM (
`photo_data`
)
LEFT JOIN `deleted_photos` ON `deleted_photos`.`photo_id` = `photo_data`.`photo_id`
WHERE photo_data.photo_id = 'UKNn'
AND `deleted_photos`.`photo_id` IS NULL

К сожалению, мне нужно использовать двоичный файл для сравнения этого photo_id (который передается мне из другого внешнего сервиса).Так что я избегаю вытаскивания «uknn» из базы данных вместо «UKNn».

Проблема в том, что когда я делаю объяснение, я вижу, что использование бинарного кода не использует индекс.Если я беру двоичный файл, он использует индекс для photo_id.Есть ли способ использовать двоичный параметр и использовать индекс с ним?

Ответы [ 2 ]

4 голосов
/ 26 октября 2010

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

Вы можете изменить сам столбец на двоичное сопоставление:

ALTER TABLE YourTable MODIFY
   YourColumn VARCHAR(4)
   CHARACTER SET latin1
   COLLATE latin1_bin;

Тогдаindex будет полезен для двоичного поиска.

2 голосов
/ 26 октября 2010

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

ALTER TABLE photo_data MODIFY photo_id VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_bin

или

ALTER TABLE photo_data MODIFY photo_id VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_general_cs
...