#mysql #select #join #performance
#mysql #выберите #Присоединиться #Производительность
Вопрос:
я должен выполнить SQL-запрос
SELECT child.name,(COUNT(parent.name) - (parentDepth.depth 1)) AS depth
from category as child,category as parent,category as sub_parent,
( select child.name,(count(parent.name)-1) as depth from category as child,category as parent where child.lft between parent.lft and parent.rgt and child.name='ELECTRONICS' ) as parentDepth
where child.lft between parent.lft and parent.rgt and child.lft between sub_parent.lft and sub_parent.rgt and sub_parent.name=parentDepth.name
group by child.name having depth >0 order by child.lft
ИСПОЛЬЗУЙТЕ СОЕДИНЕНИЕ
SELECT child.name,(COUNT(parent.name) - (parentDepth.depth 1)) AS depth from
category as child join category as parent on child.lft between parent.lft and parent.rgt join category as sub_parent on child.lft between sub_parent.lft and sub_parent.rgt,
( select child.name,(count(parent.name)-1) as depth from category as child,category as parent where child.lft between parent.lft and parent.rgt and child.name='ELECTRONICS' ) as parentDepth
where sub_parent.name=parentDepth.name
group by child.name having depth >0 order by child.lft
я хочу знать, с одним лучше! Я имею в виду производительность и скорость
Ответ №1:
разница в производительности, если разница существует, будет абсолютно минимальной. по сути, ,
-синтаксис — это не что иное, как более короткая форма написания соединения, поэтому единственной разницей будет время, используемое для «разбора» инструкций. есть много гораздо более важных вещей, которые нужно сделать, чтобы повысить производительность базы данных, например
- использование индексов
- не выбирайте неиспользуемые поля
- выберите наилучший механизм хранения данных для ваших нужд
лично я бы использовал второй синтаксис, потому что он более удобочитаем для меня (и удобочитаемый код важен — гораздо важнее, чем такие крошечные различия в производительности) — но это всего лишь мое субъективное мнение, другим может понравиться первый синтаксис, потому что он короче…
Ответ №2:
Используйте ОБЪЯСНЕНИЕ перед запросом, чтобы получить информацию о том, как MySQL будет выполнять ваш запрос, какие таблицы он будет использовать, сколько строк он будет читать, какие индексы использовать и так далее…
Другое решение — запустить этот запрос много раз (скажем, 100) и измерить среднее время отклика.
Просмотр ваших запросов привел меня к мысли, что вы, вероятно, могли бы написать лучший (хотя и не уверен — слишком сложный на первый взгляд).
Ответ №3:
Я предпочитаю на самом деле тестировать и получать данные, а не строить догадки (даже если чьи-то рассуждения кажутся здравыми).
На уровне отдельного запроса можно использовать инструкции SHOW PROFILE для отображения информации о профилировании для инструкций, выполняемых в ходе текущего сеанса:
http://dev.mysql.com/doc/refman/5.1/en/show-profiles.html
Это даст вам представление о том, сколько времени требуется для выполнения запроса в вашей базе данных MySQL (то есть, продолжительность или скорость запроса). Конечно, на прикладном уровне на карту могут быть поставлены другие вещи.
Для общего обзора того, как оптимизировать MySQL, стоит ознакомиться с интересной книгой «Высокопроизводительный MySQL» Барона Шварца и др., опубликованной O’Reilly Media, Inc. (ISBN: 9780596101718)http://www.highperfmysql.com /
В книге подробно описывается, как интерпретировать выходные данные из инструкций EXPLAIN, среди многих других полезных тем.