MySQL: сравнение целочисленного значения и строкового поля с индексом

Таблицаa_table имеет индекс на.string_column

У меня есть запрос:

SELECT * FROM a_table WHERE string_column = 10;

я использовалEXPLAIN чтобы найти, что никакие индексы не используются.

Зачем? Не могли бы вы помочь мне со ссылкой на документацию MySQL?

Обновлено:Песочница (SQL Fiddle)

 Meherzad28 мая 2013 г., 09:28
Обратитесь к этой страницеdev.mysql.com/doc/refman/4.1/en/mysql-indexes.html .. 3-я точка пулиComparison of dissimilar columns may prevent use of indexes if values cannot be compared directly without conversion. Suppose that a numeric column is compared to a string column. For a given value such as 1 in the numeric column, it might compare equal to any number of values in the string column such as '1', ' 1', '00001', or '01.e1'. This rules out use of any indexes for the string column.
 Meherzad28 мая 2013 г., 09:53
Проверь этоsqlfiddle.com/#!2/f4807/1 для строки в int используется индекс преобразования, в то время как для int в строку это не следует, хотя я используюforce index..
 DmitryR28 мая 2013 г., 09:38
На самом деле, 10 не столбец (я видел этот текст в документации раньше). Таким образом, он может быть преобразован в строку необходимого типа.

Ответы на вопрос(1)

Решение Вопроса

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

Кроме того, БД всегда покрывает строки -> Числа, потому что это детерминированный способ (иначе 1 можно преобразовать в '01 ','001' как уже упоминалось в комментариях).

Итак, если мы сравним два случая, которые, кажется, смущают вас:

-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';

БД преобразует строку '1' на номер 1, а затем выполняет запрос. Наконец, у него есть int с обеих сторон, поэтому он может использовать индекс.

-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;

Опять же, он преобразует строку в числа. Однако на этот раз он должен преобразовать данные, хранящиеся в таблице. На самом деле, вы выполняете поиск какcast(str_column as int) = 1, Это означает, что вы больше не ищете индексированные данные, БДне могу используйте индекс.

Пожалуйста, посмотрите на это для получения дополнительной информации:

http://use-the-index-luke.com/sql/where-clause/obfuscation/numeric-stringshttp://use-the-index-luke.com/sql/where-clause/functions/case-insensitive-search

Ваш ответ на вопрос