powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / можно ли както заставить мускл не делать нужную работу?
10 сообщений из 10, страница 1 из 1
можно ли както заставить мускл не делать нужную работу?
    #38424362
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
select * from target where target.field = value  

AND

not exists( select * where union select * where  union select * where .....)



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

вот можно ли както мускл заставить не делать лишнее - explain всегда показывает что будут выполняться все подзапросы.

ЗЫ
другие варианты
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#join
select * from target join t1 on(...and t1.param=good) join t2 on(-and t2.param=good)..... join tn on(-0)
where target.field = value
#предполагаеться наличие ключей на поля парам. тоесть при джоине можно будет увидеть сразу скажем что t1.param=good - 0 записей

#2 AND

select * from target 
where .....
AND not exists(select1) AND not exists(select2) and..... and not exists (select n)

#3 IF

select * from target where ....
and
IF(exists(select 1);false; IF(exists(select2);false;IF....................;false;IF(exists(selectn);false;true).....))



полагаю суть ясна.

ЗЫ если поможет, подзапросы корелированные (dependent subquery)

тоесть по типу
select * from target where target.field=value and

not exists(select * from t1 where t1.link = target.id) and
not exists (select * from t2 whre t2.link = target.id) and....
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38424407
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я за вариант #2
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38424732
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот можно ли както мускл заставить не делать лишнее - explain всегда показывает что будут выполняться все подзапросы.


EXPLAIN в принципе этого никогда не показывает. Вообще никогда. Он это не может показать.
Он не показывает, что будет выполняться, а что нет. Он показывает, как будет выполняться, если будет.
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38424739
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, ты почему-то решил искать ключи не там, где их потерял, а где светлее.
Ты делаешь необоснованные выводы.
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38424756
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

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

тем более что и вопрос связан именно с не понимание - что именно показывает эксплейн

=============
вот счас при оптимизации запроса вида

select * from t where t.t1 = @target
union
select * from t where t.t2 = @target
union
select * from t where t.t3 = @target

limit 10

это упростил. на поля Т№ по индексу. и експлеин показывает число строк для просмотра использую правильный индекс, для одного поля больше чем есть реально строк в базе подходящих, для двух других меньше чем есть реально.

=======
так что если цепляться к словам - то, эксплейн как раз таки не показывает что будет если будет, а лиш оценивает.

ЗЫ(дополнительные условия в юнионе есть, но и учитывая их цифра с эксплейна не совпадает с реальностью, и при удалении всех остальных условий, тоже не совпадает)
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38424800
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453вот счас при оптимизации запроса вида

select * from t where t.t1 = @target
union
select * from t where t.t2 = @target
union
select * from t where t.t3 = @target

limit 10

... второе, что ты должен был сделать (в порядке оптимизации) - это
Код: sql
1.
2.
3.
4.
select * from t where t.t1 = @target 
OR t.t2 = @target
OR t.t3 = @target
limit 10


А первое - это обратить внимание на идиотизм исходной конструкции. limit 10 сработает только на последний субзапрос, первые два выдадут все результаты. Вряд ли тебе ЭТО нужно.
Но даже если ты поступишь как по науке, и возьмёшь субзапросы в скобки - без сортировки лимит даст совершенно отфонарный и слабопредсказуемый результат.
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38424969
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina... второе, что ты должен был сделать (в порядке оптимизации) - это
Код: sql
1.
2.
3.
4.
select * from t where t.t1 = @target 
OR t.t2 = @target
OR t.t3 = @target
limit 10



Насколько я помню (по крайней мере раньше так было), MySQL не использовал индексы при OR.

Тоесть когда у тебя:
Код: sql
1.
2.
3.
4.
select * from T 
where X=...
OR Y=...
OR Z=...

то MySQL выбирает один индекс (или X,или Y,или Z), и использует только его один.

В то время как при использовании:
Код: sql
1.
2.
3.
4.
5.
select * from T where X=...
UNION
select * from T where Y=...
UNION
select * from T where Z=...

каждый запрос будет использовать свой индекс, и запрос выполняется в несколько раз быстрее.

Когда-то я очень попался на этом.
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38425012
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
limit 10 видишь? отсутствие сортировки видишь? выборка по одному индексу - более чем достаточно, если по нему можно отобрать 10 записей.
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38425067
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У человека AND not exists для прохождения условия. Значит что в подовляющем числе случаев у него и 1 записи этот запрос не выдаст. Это значит что при поиске через OR, он одно поле проскочит по индексу, а для поиска по остальным полям он будет N раз перебором шерстить всю таблицу, чтобы потом сказать - "Да, действительно нету ни одной строки удовлетворяющей твоему запросу".
Это не оптимально...
...
Рейтинг: 0 / 0
можно ли както заставить мускл не делать нужную работу?
    #38425094
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нащот лимита при юнионе!
по документации - если хотите лимит и ордер бай для отдельного селекта поставте его в скобках с селектом

да и из практики - запросс выдаст не более 10 записей так как без скобок он относиться ко всему юниону!!!


нащот, почему юнион а не ИЛИ - прав человек, при юнионе используеться три индекса и вычисляеться пересечение

при ИЛИ - используеться только один.

или ваще долго работает, юнион быстрее но долго. оказалось легче делать три запроса к базе чем один с юнионом
(20 млн записей, юнион отрабатывает за 70-80 секунд при лимит 10.

этот запрос вообще делаеться в контексте апдейта

update table join (select union select union select limit 10)a on a.id=table.id
set ....

вообщем говоря, если по отдельности, то даже с лимитом 10000 апдейт срабатывает гораздо быстрее чем выборка с юнионом(пока индекс не кеширован - до 10 секунд, при кешированом ндексе - 2-3 секунды)


воопрос остаёться в силе, может кто сможет заставить мускл расматривать сразу три ситуации, и выдать быстро результат.

ЗЫ
хотя может стоит и остановиться на варианте выполнять их по отдеьности - ведь логика задачи гдето такова.
под труйную выборку будет попадать в 100 раз больше строк, чем надо за один раунд обновить.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / можно ли както заставить мускл не делать нужную работу?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]