Можно ли оптимизировать этот запрос без реструктуризации таблицы? - PullRequest
0 голосов
/ 14 ноября 2018
SELECT * FROM products WHERE
serial LIKE '{$ssz}'             //exact match, no other serials in row
OR serial LIKE '%,{$ssz}'        //match at list end
OR serial LIKE '%,{$ssz},%'      //match between other two serials
OR serial LIKE '{$ssz},%'        //match at list beginning

Это мой отлично работающий запрос, где {$ ssz} - это переменная PHP для поиска.serial Столбцы TEXT содержат список серийных номеров, разделенных запятой.

Серийные номера являются уникальными, но переменной длины, поэтому возможны "AAB001" и "AB001".

Может быть, этобудет быстрее с регулярным выражением?Или с совершенно другим подходом?

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете сократить его до:

SELECT p.*
FROM products p
WHERE FIND_IN_SET('{$ssz}', serial) > 0;

Это приятнее смотреть и легче кодировать. Но это не существенно быстрее.

В чем проблема? Ваша модель данных - это проблема. Вы не должны хранить списки вещей в строке с разделителями. У SQL есть действительно отличный способ хранить списки. Он называется таблицей , а не строкой.

Вам нужна таблица соединений / связей для ваших данных. Затем вы можете ускорить запрос, используя соответствующие индексы.

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