Эффективность запроса: поиск по почтовому индексу, названию компании или городу - PullRequest
0 голосов
/ 30 сентября 2011

См. SQL-запрос ниже - он позволяет вам искать Магазин по почтовому индексу, названию компании или городу (местонахождение) ... На веб-сайте внешнего интерфейса будет только одно текстовое поле поиска без раскрывающегося типа поиска.

Результат будет показан только в том случае, если shop_options.live равно 1 и в зависимости от того, какой день магазин открыт: O_Hour.weekday = '5' (пятница).

Если я выполню поиск по S_D.postcode (например: S_D.postcode = 'L14'), он найдет L14 из таблицы shop_delivery_area и отобразит список магазинов с этим почтовым индексом.

SELECT distinct S.*, S.company, S.street, S.town FROM shop as S
    JOIN shop_delivery_area as S_D on S_D.shopID = S.shopID
    JOIN shop_options on shop_options.shopID = S.shopID
    JOIN shop_opening_hours as O_Hour on O_Hour.shopID  = S.shopID
WHERE (S_D.postcode = 'Liverpool'  OR S.company LIKE 'Liverpool' OR S.town LIKE 'Liverpool') 
AND shop_options.live = '1' AND O_Hour.weekday = '5' 
    ORDER BY O_Hour.opentime

Запрос работает, но он очень медленный. Почти секунду, чтобы получить результат. Как улучшить производительность быстрее?

Редактировать: Исправлен SQL-запрос.

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

Если вам нужно сохранить предикаты, например

S_D.postcode = 'Liverpool'  OR S.company LIKE 'Liverpool' OR S.town LIKE 'Liverpool'

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

ALTER TABLE shop_delivery_area ADD KEY `sda_idx1` (`postcode`);
ALTER TABLE shop ADD KEY `shop_idx1` (`company`);
ALTER TABLE shop ADD KEY `shop_idx2` (`town`);

Еще один момент касается нечеткого поиска.Если вы можете заменить «LIKE» на «=», то вы увидите увеличение скорости.Хотя нет смысла использовать «LIKE» без нечеткого поиска, например, «LIKE», «Ливерпуль».Используйте LIKE "% Liverpool%" или = "Liverpool".Так что либо используйте:

    S_D.postcode = 'Liverpool'  OR S.company LIKE '%Liverpool%' OR S.town LIKE '%Liverpool%'

или

    S_D.postcode = 'Liverpool'  OR S.company = 'Liverpool' OR S.town = 'Liverpool'

Если вы используете последний и создаете индексы, тогда ваш запрос должен работать просто отлично!

0 голосов
/ 30 сентября 2011
  1. Избавьтесь от условий для пустых строк (S_D.postcode = '' OR S.company LIKE '')
  2. Как правило, LIKE сильно замедляет ваши запросы, поэтому я буду избегать этого, когда это возможно
  3. Добавитьуказатели на столбцы WHERE
0 голосов
/ 30 сентября 2011

Использование IFNULL вместо OR может значительно повысить производительность в зависимости от объема данных, индексов и т. Д.

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