[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как ощутить разницу
VeRTak
Всем привет, имею фреймворк, в котором аж три варианта запроса к базе, все отличаются, но в доках не написано какой из вариантов быстрее, как нагрузить запрос что бы определить что же быстрее?
T1grOK
В большинстве случаев достаточно посмотреть EXPLAIN запросов.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
VeRTak
T1grOK

Спасибо, узнал еще что то новое :) Пока почитал мельком, но мне кажется это не совсем то что мне нужно.

к примеру у меня есть два вот таких вида


$phql = "SELECT c.* FROM Cars AS c ORDER BY c.name";
$cars = $manager->executeQuery($phql);

Это то же самое, что и:

$cars = Cars::find(
array(
"order" => "name"
)
);



Вот мне надо определить что же быстрее, или тут особой разницы нету?
T1grOK
Посмотреть через профайлер и сравнить.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
VeRTak
T1grOK

Спасибо, все удалось. Только вот понять пока не могу, что же все таки быстрее, если я правильно понял то 1 запрос.

1 запрос

Starting 21 µs
Waiting For Query Cache Lock 6 µs
Init 4 µs
Checking Query Cache For Query 77 µs
Checking Permissions 9 µs
Opening Tables 156 µs
Init 35 µs
System Lock 8 µs
Optimizing 15 µs
Statistics 25 µs
Preparing 20 µs
Executing 9 µs
Sending Data 19 µs
End 6 µs
Query End 8 µs
Closing Tables 4 µs
Removing Tmp Table 11 µs
Closing Tables 37 µs
Freeing Items 83 µs
Cleaning Up 20 µs


2 запрос

Starting 77 µs
Checking Permissions 9 µs
Opening Tables 170 µs
Init 33 µs
System Lock 7 µs
Optimizing 15 µs
Statistics 23 µs
Preparing 19 µs
Explaining 29 µs
Query End 8 µs
Closing Tables 4 µs
Removing Tmp Table 8 µs
Closing Tables 6 µs
Freeing Items 88 µs
Cleaning Up 18 µs
neadekvat
Первый способ - это ручное написание запроса. Второй - через обертку. И дело в том, что обертка наверняка сгенерирует почти такой же запрос, что ты написал вручную. Таким образом, сейчас ты замеряешь скорость выполнения фактически одного и того же запроса.

Разницу здесь надо ощущать на другом уровне. Фреймворк предоставляет абстракцию, и все что находится внутри фреймворка - абстракция. Абстракцией же является и запрос на получение данных. Лишь где-то внутри фреймворка известно, что метод find обращается к базе данных. А что, если модель будет наследоваться не от какого-нибудь ActiveRecord? Например, в какой-то момент все объекты Cars переедут из реляционной базы в какой-нибудь Memcache?

Так что настоятельно рекомендую, если уж взялся за ООП-фреймворк (не Yii ли?), то пиши в стиле ООП. То есть никаких чистых SQL-запросов в бизнес-логике.
VeRTak
neadekvat

Спасибо за развернутый ответ, но дело в том что и первый вариант тоже вроде как обертка, если я все правильно понял из документации smile.gif

Цитата (neadekvat @ 9.01.2016 - 16:58)
не Yii ли?


Нет, Phalcon.

Ну и вообще интересует такой вопрос, стоит ли забивать голову такой экономией, или эта экономия на спичках? smile.gif
VeRTak
Когда получаю объект, через второй вариант, через вардамп вижу уже именно вот такой запрос как в первом варианте, как мне показалось то что второй вариант выступает как парсер(возможно где то ошибаюсь)

Выглядит это примерно так

$captcha = Captcha::find(["ip = '$ip'", "order" => "time DESC", "limit" => 1]);
wtf($captcha);exit;



[_pdoStatement:protected] => PDOStatement Object
(
[queryString] => SELECT `captcha`.`id`, `captcha`.`time`, `captcha`.`ip`, `captcha`.`word` FROM `captcha` WHERE `captcha`.`ip` = '127.0.0.1' ORDER BY `captcha`.`time` DESC LIMIT :APL0
)
neadekvat
Цитата (Wind @ 9.01.2016 - 17:09)
первый вариант тоже вроде как обертка

Разумеется. Абстракция, помним об абстракции (: Но по существу запрос вряд ли будет меняться. Подстановка параметров - да. Возможно, какие-то кавычки расставит. Но парсить и менять запрос - нет, не думаю.

Цитата (Wind @ 9.01.2016 - 17:09)
или эта экономия на спичках

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

Цитата (Wind @ 9.01.2016 - 17:15)
как мне показалось то что второй вариант выступает как парсер

Не понял эту мысль..
VeRTak
neadekvat

Спасибо smile.gif
Ron
Цитата (neadekvat @ 9.01.2016 - 16:58)
Так что настоятельно рекомендую, если уж взялся за ООП-фреймворк (не Yii ли?), то пиши в стиле ООП. То есть никаких чистых SQL-запросов в бизнес-логике.

И как же это сделать, когда в запросах по 4-5 джоинов, вложенные селекты и прочие штуки? Как должна выглядеть модель данных?

neadekvat
Ron, зависит от того, что за ORM ты используешь, очевидно. Но в общем случае джоины - это связи между моделям, которые в этой самой модели и должны прописываться, и, соответственно, ORM без особых затруднений может составить правильный запрос. (Хотя многие отказываются от джоинов в пользу отдельных, но простых SELECT запросов.)

Вложенные селекты - отдельный случай. Очевидно, если тебе нужен вложенный селект, то мы уже выходим за рамки простых моделей - сам запрос начинает содержать в себе некую бизнес-логику. Возможно, это можно описать неким конструктором запросов, возможно - переписать в код, выделив несколько простых запросов. Ситуативная штука.
Invis1ble
Цитата (Ron @ 9.01.2016 - 21:14)
Как должна выглядеть модель данных?

причем здесь модель, обычно сложные запросы пишут с помощью билдера, на худой конец на "чистом" SQL, а затем маппят результат
например, работая с доктриной, мне пока что доводилось писать чистый SQL только для импорта данных в БД, и то, только ради скорости, притом что эти запросы запускаются только при новом патче (и далеко не при каждом). и тут, кстати, мне пришлось писать доп. код, из-за того, что я работал вне слоя ORM и в приложении не генерировались ивенты, на которые была завязана куча логики.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.