У меня небольшая проблема, и я очень признателен за помощь.
У меня есть таблица MyISAM, содержащая 33 000 000 строк со следующей структурой данных:
id -> Primary Key, Unsigned INT, Auto-Increment
characters -> Unique Indexed, varchar(15)
price -> decimal (10,2)
active -> tinyint(1)
Я написалСценарий, который принимает значение поиска от пользователя, а затем создает следующий запрос, основанный на вводе пользователем слова «Кевин»:
SELECT characters, price
FROM listings_dvla
WHERE active=TRUE
AND LOWER(REPLACE(characters, ' ', '')) REGEXP '^[a-z0-9]*[(k)]+[a-z0-9]?[(e)(3)]+[a-z0-9]?[(v)]+[a-z0-9]?[(i)(1)]+[a-z0-9]?[(n)(11)(1v)]+[a-z0-9]*'
ORDER BY characters ASC
LIMIT 0, 12
Просто чтобы объяснить, регулярное выражение просто пытается сопоставить каждую букву по порядкуили последовательность букв, которые означают то же самое на «языке номерного знака», например.N == 1V
Дело в том, что этот запрос черт возьми!20+ секунд.Я много читал и обнаружил, что использование символов в качестве первичного ключа медленнее, поэтому я вынул его и добавил поле идентификатора.Я использовал EXPLAIN, который показывает индексы, и они имеют значение NULL, я предполагаю, что это потому, что REGEXP отключает их (я тоже это где-то читал).
У меня вопрос, есть ли у кого-нибудь какие-нибудь яркие идеи, чтобы серьезно увеличить эти запросыспектакль?Поскольку я чувствую, что не знаю чего-то очень важного, чтобы это было быстрее.
Я изменю структуру таблицы, если это будет необходимо, поэтому не беспокойтесь о том, чтобы дать мне довольно экстремальный ответ.
Спасибо за чтение, буду признателен за любые предложения.