MYSQL. LIKE-запрос становится слишком длинным, если я использую переменную - PullRequest
0 голосов
/ 31 марта 2020

У меня большая таблица с 5 миллионами слов. Мне нужно найти слова, начинающиеся со строки Dynami c. Но когда я использую оператор LIKE со строковой переменной, запрос становится слишком длинным.

Например, этот запрос занимает 1,3 секунды:

set @pattern = 'f%';
select * from words where Word like @pattern limit 100;

Следующий запрос занимает 0,0 секунды:

select * from words where Word like 'f%' limit 100;

Но оба запроса выполняют одну и ту же работу.

В чем может быть причина, почему запросы сильно различаются по продолжительности? Как устранить эту разницу?

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Оказалось, что переменные имеют utf8mb4 кодировку (набор символов по умолчанию для моей базы данных), но столбец Word имеет utf8 кодировку.

Итак, все, что мне нужно сделать, это преобразовать кодировку с использованием utf8:

set @pattern = CONVERT('f%' USING utf8);
select * from words where Word like @pattern limit 100;
0 голосов
/ 01 апреля 2020
  • Создайте запрос, а не используйте @variables. Возможно, используйте хранимую процедуру как способ подготовки и выполнения.
  • Переключение с MyISAM на InnoDB.
  • Вас волнует, какие 100 строк? A LIMIT без ORDER BY обычно не подходит.
  • Если это действительно "слова" (а не просто буквы типа 'f'), рассмотрим FULLTEXT.
  • SHOW VARIABLES LIKE 'char%'; - это может показать более простое место для настройки CHARACTER SET.
0 голосов
/ 31 марта 2020

- это проблема с пониманием, поскольку мы сохраняем значение в куче, а затем используем его в запросе, а не непосредственно в запросе. Я предлагаю улучшить документацию по чтению производительности mysql ниже: https://geekflare.com/mysql-performance-tuning/

...