Задавайте вопросы, мы ответим
Вы не зашли.
Ситуация аналогична http://sqlinfo.ru/forum/viewtopic.php?id=3880
Вопрос: всетаки почему запросы вида
Неактивен
Посмотрите на EXPLAIN обоих запросов. Скорее всего, второй обрабатывается как
зависимый подзапрос.
Неактивен
да, он действительно выполняется как зависимый, но, тем не менее, тот же EXPLAIN показывает одинаковое количество строк используемых в выборке, использование индекса, а Extra просто "using where". В тоже время в запросе с join тип derived, все остальное примерно идентично, + создается производная таблица по которой идет сортировка.
Вопрос почему , а главное как, в MySql работают те самые зависимые запросы, почему такая огромная разница с производными ?
Неактивен
Вот profile двух запросов как ваши.
Это пример с JOIN
starting 0.000057
Opening tables 0.000109
System lock 0.000002
Table lock 0.000042
optimizing 0.000005
statistics 0.000009
preparing 0.000005
executing 0.000003
Sorting result 0.000002
Sending data 0.000495
init 0.000015
optimizing 0.000007
statistics 0.000070
preparing 0.000014
executing 0.000001
Sending data 0.003005
end 0.000001
query end 0.000001
freeing items 0.000111
removing tmp table 0.000008
closing tables 0.000003
logging slow query 0.000001
cleaning up 0.000003
Это с WHERE IN
starting 0.000117
Opening tables 0.000013
System lock 0.000002
Table lock 0.000006
init 0.000036
optimizing 0.000007
statistics 0.000057
preparing 0.000008
executing 0.000002
Sending data 0.000033
optimizing 0.000004
statistics 0.000006
preparing 0.000005
executing 0.000004
Sorting result 0.000002
----------------------------------------------
Sending data 0.000448
executing 0.000001 Повторяется около 2000 раз
Sorting result 0.000002
----------------------------------------------
Sending data 0.000470
end 0.000005
query end 0.000003
freeing items 0.000278
logging slow query 0.000001
cleaning up 0.000010
Интересно почему WHERE IN так коряво работает ? Что физически происходит ?
Отредактированно evgeny (23.06.2011 00:04:11)
Неактивен
Нужно уметь точно отличать случаи зависимых и независимых подзапросов.
К сожалению, оптимизация этого куска всё время откладывается. Вроде бы,
в 6.0 обещают какое-то улучшение кода в этом месте.
Неактивен
Видимо пока лучше забыть про вложенные запросы в MySql
Неактивен
В конструкции In помоему индексы не должны работать, отсюда может и корявая работа.
Неактивен
В IN индексы работают, чем так IN не устроил )
Неактивен
Нужно уметь точно отличать случаи зависимых и независимых подзапросов.
А можно пару слов о том, как точно это делать?
Неактивен
LazY написал:
Нужно уметь точно отличать случаи зависимых и независимых подзапросов.
А можно пару слов о том, как точно это делать?
Ну вот по профайлингу и видно когда зависимый а когда нет, смотрите мой пример выше.
Каждый подзапрос виден как
----
Sending data 0.000448
executing 0.000001
---
Если вы имеете виду как отличать по самому запросу, то тут наверно нужно просто помнить конкретные конструкции ...
Например:
SELECT customer_id,(SELECT first_name FROM users where user_id=customer_id) as customer_name FROM customers;
Так же примеры с тем же WHERE IN
Насколько я знаю таких примеров не много ... Если кто знает , привидите примеры, интересно посмотреть ...
Отредактированно evgeny (03.07.2011 15:49:39)
Неактивен
А, в смысле
Повторяется около 2000 раз
- это буквально, в листинге от профайлинга?
Неактивен
LazY написал:
Нужно уметь точно отличать случаи зависимых и независимых подзапросов.
А можно пару слов о том, как точно это делать?
Ну вот по профайлингу и видно когда зависимый а когда нет, смотрите мой пример выше.
Каждый подзапрос виден как
----
Sending data 0.000448
executing 0.000001
---
Если вы имеете виду как отличать по самому запросу, то тут наверно нужно просто помнить конкретные конструкции ...
Например:
SELECT customer_id,(SELECT first_name FROM users where user_id=customer_id) as customer_name FROM customers;
Так же примеры с тем же WHERE IN
Насколько я знаю таких примеров не много ... Если кто знает , привидите примеры, интересно посмотреть ...
Неактивен
LazY написал:
А, в смысле
Повторяется около 2000 раз
- это буквально, в листинге от профайлинга?
Нет это мой коммент :-)
В профалинге это часть повторялась 2000 раз
Неактивен
Ну да, я так и понял
Неактивен