Длинный запрос SQL

12
I
На сайте с 23.12.2010
Offline
25
#11
LEOnidUKG:
лучше жувать иногда :)

Почитайте, что такое индексы. От запроса это не зависит.

действительно, иногда лучше жувать.

я вот проверил, при "!=" составной индекс не используется. такой же запрос, но с "=" - используется.

если немножко подумать о том, как устроены индексы и как по ним поиск идет, то можно догадаться почему именно так, а не иначе.

---------- Добавлено в 23:42 ---------- Предыдущее сообщение было в 23:40 ----------

Dreammaker:
Если мне не изменяет память, то конструкция IN или её аналог OR ... OR
... OR .... проходит аналогично отдельным запросам, а значит и составной индекс будет задействоваться. Но я сделал оговорку, что нужно проверить EXPLAIN. Ибо "чуйка" подсказывает, что должно работать, но всё же проверка не будет лишней, ибо я уже какое-то время больше "по руководящей линии", чем собственно програмлю, мог уже что-то и забыть.

да не, тут не про IN/OR - это синтетический сахар, тут про "!=" vs "="

Dreammaker
На сайте с 20.04.2006
Offline
569
#12
iopiop:
ут про "!=" vs "="

таки да, слона я не заметил :)

SD
На сайте с 08.12.2011
Offline
5
#13

Если ники "захардкожены" не проще ли их вынести в отдельную таблицу? И запрос проще станет и менять в последующем проще.

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#14
iopiop:
действительно, иногда лучше жувать.
я вот проверил, при "!=" составной индекс не используется. такой же запрос, но с "=" - используется.
если немножко подумать о том, как устроены индексы и как по ним поиск идет, то можно догадаться почему именно так, а не иначе.

А если мы сделаем так?

EXPLAIN SELECT * FROM `cms_brand` FORCE INDEX (trans) WHERE name!='abb' AND (trans!='abb' OR trans!='gewi')

То EXPLAIN нам выдаст, что используется наш ключик trans.

А если мы добавим ещё LIMIT 1, то вообще прелесть будет :)

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
I
На сайте с 23.12.2010
Offline
25
#15
LEOnidUKG:
А если мы сделаем так?

EXPLAIN SELECT * FROM `cms_brand` FORCE INDEX (trans) WHERE name!='abb' AND (trans!='abb' OR trans!='gewi')

То EXPLAIN нам выдаст, что используется наш ключик trans.

А если мы добавим ещё LIMIT 1, то вообще прелесть будет :)

конечно мы можем заставить использовать индекс. в этом случае мы сначала будем ходить по индексу, а потом пойдем за данными в таблицу, т.е. получим 2 IO операции вместо одной, но нам же не это нужно, правда?

суть в том, что в данном случае нет никаких преимуществ в использовании индекса по сравнению с table scan, а недостатки известны - дополнительное место под индекс, перестройка (а значит локи) индекса при вставке-удалении-апдейте.

оптимизатор может выбрать использовать индекс в трех случаях

а) индекс кластерный - т.е. данные хранятся физически вместе с индексом

б) таблица достаточно широкая - может получиться что шагать по индексу дешевле (в терминах IO) чем шагать по таблице

в) в селекте выбирается только те колонки, из которых состоит индекс

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#16

Ну тогда как я и писал раньше, менять просто логику работы. Искать не !=, а =

Тогда всё встанет на свои места.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий