2016-07-27 2 views
2

Это для InnoDB с MySQL 5.7.MySQL - индексирование для сравнения строк

Если у меня есть запрос типа:

SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0 

Можно ли иметь индекс D, который можно использовать в запросе? то есть MySQL достаточно умен, чтобы использовать индекс btree для функции STRCMP?

Если нет, то как я смогу перепроектировать запрос (и/или таблицу), чтобы я мог выполнять сравнение строк в D, и может быть какая-то форма обрезки, чтобы она не ударяла каждый ряд?

+0

use: WHERE D like% somestring% – kollein

+0

@kollein: Извините, но как этот комментарий даже уместен? Во-первых, с% somestring%, из-за префикса переменной индексирование отключено. Во-вторых, я пытаюсь выполнить сравнение строк, а не подстроку. –

ответ

3

Удивительно, как много неправильных ответов до сих пор. Позвольте мне посмотреть, не могу ли я присоединиться к ним.

STRCMP возвращает -1, 0 или 1, в зависимости от того, как сравниваются аргументы.

STRCMP(D, 'somestring') > 0 идентичен D > 'somestring'. (Не >=, не =, не LIKE)

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

Любая функция и некоторые операторы, скрытые столбцы от использования с INDEXes. D > 'somestring' может воспользоваться индексом, начинающимся с D; версия STRCMP не может.

+0

Спасибо @ rick-james! (А также @ydoow и @ mike-bryant). Это может звучать глупо, но я не знал, что «>» и т. Д. Можно использовать в строках операндов! –

0

Mysql не будет использовать индексы для вызовов функций.

Использование ниже запроса и Создание индекса на D колонке

SELECT A, B, C FROM TABLE WHERE D ='somestring' 

создать индекс, используйте расположенную ниже запрос,

create index index1 on TABLE(D); 
2

Почему просто не

WHERE D > 'somestring' 

Этот рычаг будет типичный индекс B-дерева на колонке D.

1

Если вы выполняете сравнения только путем передачи значений столбца функции, такой как STRCMP(), индексации в ней нет.

Ссылка: https://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

Индекс В-дерева могут быть использованы для сравнения столбцов в выражениях, которые используют =, >, >=, <, <= или BETWEEN операторов.

Таким образом, вы можете использовать

SELECT A, B, C FROM TABLE WHERE D > 'somestring'

вместо этого, в то время как LIKE более строгим и может быть то, что вы ожидаете.

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

SELECT A, B, C FROM TABLE WHERE D > 'somestring' COLLATE utf8_bin

+0

'LIKE' без подстановочного символа совпадает с' = '. Я думаю, что намерение OP было как сортировка механизма сортировки - вернуть все записи, где D больше, чем (в алфавитно-цифровых условиях сортировки) строку, с которой сравниваются записи таблицы. –

+0

Спасибо @MikeBrant за указание на это. Я упустил вопрос и понял, что это неправильно. Исправленный ответ соответственно. – ydoow

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