Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / можно ли както заставить мускл не делать нужную работу? / 10 сообщений из 10, страница 1 из 1
11.10.2013, 13:13:52
    #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
11.10.2013, 13:32:53
    #38424407
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли както заставить мускл не делать нужную работу?
я за вариант #2
...
Рейтинг: 0 / 0
11.10.2013, 17:01:27
    #38424732
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли както заставить мускл не делать нужную работу?
вот можно ли както мускл заставить не делать лишнее - explain всегда показывает что будут выполняться все подзапросы.


EXPLAIN в принципе этого никогда не показывает. Вообще никогда. Он это не может показать.
Он не показывает, что будет выполняться, а что нет. Он показывает, как будет выполняться, если будет.
...
Рейтинг: 0 / 0
11.10.2013, 17:03:42
    #38424739
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли както заставить мускл не делать нужную работу?
В общем, ты почему-то решил искать ключи не там, где их потерял, а где светлее.
Ты делаешь необоснованные выводы.
...
Рейтинг: 0 / 0
11.10.2013, 17:09:40
    #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
11.10.2013, 17:24:43
    #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
11.10.2013, 21:23:52
    #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
11.10.2013, 22:57:03
    #38425012
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли както заставить мускл не делать нужную работу?
limit 10 видишь? отсутствие сортировки видишь? выборка по одному индексу - более чем достаточно, если по нему можно отобрать 10 записей.
...
Рейтинг: 0 / 0
12.10.2013, 01:07:55
    #38425067
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли както заставить мускл не делать нужную работу?
У человека AND not exists для прохождения условия. Значит что в подовляющем числе случаев у него и 1 записи этот запрос не выдаст. Это значит что при поиске через OR, он одно поле проскочит по индексу, а для поиска по остальным полям он будет N раз перебором шерстить всю таблицу, чтобы потом сказать - "Да, действительно нету ни одной строки удовлетворяющей твоему запросу".
Это не оптимально...
...
Рейтинг: 0 / 0
12.10.2013, 03:09:34
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / можно ли както заставить мускл не делать нужную работу? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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