Как ускорить запрос MySQL, включающий условие «нравится» в столбце varchar? - PullRequest
0 голосов
/ 29 мая 2020

У меня есть таблица со столбцом varchar, содержащим тикеры фондового рынка. Значения могут иметь добавление фондовой биржи к фактическому тикеру, но некоторые этого не делают. Например:

NYSE:MSFT
NYSE:AAPL
AMT:STZ
^SPX
JMAT

Это все действительные тикеры. Теперь, когда кто-то ищет тикер, запрос выглядит примерно так:

select * from stocks where ticker like '%'.$string.'%'

В рабочей таблице будет более 100 тыс. Записей. Я хочу опередить эту потенциальную проблему, индексируя столбец, но, судя по MySQL документам, это невозможно, в любом случае не для такого запроса.

В документах указано, что varchar index возможно, но в запросе like он не будет работать, если перед строкой поиска есть подстановочный знак . И мне нужен подстановочный знак перед строкой поиска.

Есть ли другой способ ускорить этот запрос?

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

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

Таким образом, ваша таблица должна выглядеть так:

full_ticker  ticker
-----------  ------
NYSE:MSFT    MSFT
NYSE:AAPL    AAPL
AMT:STZ      STZ
^SPX         ^SPX
JMAT         JMAT

Простое манипулирование строкой приведет к второй (новый) столбец; для 100 тыс. строк это не займет времени.

Теперь вы можете создать два индекса, по одному на столбец:

create index ix1 on stocks (full_ticker);

create index ix2 on stocks (ticker);

Наконец, когда поиск приходит в с двоеточием , затем используйте первый индекс:

select * from stocks where full_ticker like $string.'%'

Если поиск попадает в без двоеточия , используйте второй индекс:

select * from stocks where ticker like $string.'%'

Обратите внимание, что оба при поиске избегайте использования % в начале шаблона. Таким образом, ваши запросы будут использовать индексы и будут работать быстро.

Последнее замечание: Другой вариант - создать второй избыточный столбец как «виртуальный столбец»; виртуальные столбцы могут быть проиндексированы для получения того же опыта, который я подробно описал здесь. Просто подумай.

1 голос
/ 29 мая 2020

Как вы сказали, нет возможности использовать индекс в сочетании с использованием '% wildcard%'. Существует возможность использовать функцию под названием: Полнотекстовый поиск (FTS), которая может улучшить вашу эффективность поиска по сравнению с использованием оператора LIKE.

Пример анализа производительности: здесь

Существует много дискуссий о FTS, вы, конечно же, можете прочитать на StackOverflow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...