Laravel Eloquent проти конструктора запитів - Навіщо використовувати eloquent для зниження продуктивності [closed]


77

Я провів перевірку продуктивності між розробником запитів Laravel та красномовним. Конструктор запитів був набагато швидшим за допомогою різних операторів sql (select-update-delete-insert).

Тож моє запитання: Чому хтось використовує Laravel Eloquent проти звичайного конструктора запитів?


22
Не порівнюйте яблука та апельсини. Eloquent - це ORM, що означає, що він може автоматично обробляти взаємозв'язки ваших моделей за вас. Ви можете отримати пов’язані моделі без написання складних запитів. Ви навіть можете отримати інформацію про базу даних взагалі без будь-яких знань бази даних. Також Eloquent має масу додаткових функцій, яких не вистачає конструктору запитів, таких як читабельність, аксесуари, мутатори, перетворення JSON / Array, приховування чутливих атрибутів, автоматичні часові позначки, автоматичне лиття атрибутів, програмне видалення тощо ...
Javi Stolz

78
Яблука виробляють яблучний сік, апельсини - апельсиновий сік. Але, на жаль Eloquentі Query Builderобидва виробляють одне і те ж, dataз database. Можливо, тому він порівнює ці два.
Імран

4
@JaviStolz, якби ти сказав би "не знаючи SQL", ти мав би рацію. Але "Ви навіть можете отримати інформацію про базу даних без будь-яких знань про базу даних" неможливо. Eloquent вимагає, щоб ви знали структуру вашої бази даних, що таке зовнішні ключі та як вони працюють, і як орієнтуватися в структурі. Лише найпростіші запити не потребують знань баз даних, а більшість програм потребуватимуть дуже складних запитів.
Міхель ван дер Блонк,

Хоча яблука роблять яблучний сік, а апельсини - апельсиновий, вони обидва є соком. Красномовний повертає Колекції - це дані, загорнуті в помічники, які роблять бізнес-логіку більш читабельною. Query Builder - це частина, використовувана Eloquent. Eloquent - це компонент у парадигмі бізнес-логіки, який дозволяє вносити коригування та фільтрувати дані в кожній частині потоку за допомогою Closure, тому ваші матеріали читаються, $object->filter($something_we_just_calculated)коли вони працюють у дереві рішень. Ви можете думати про Красномовця як про JQuery
Натаніель Вадделл

Відповіді:


139

Eloquent - це реалізація Laravel шаблону Active Record, який має всі свої сильні та слабкі сторони.

Активний запис є хорошим рішенням для обробки однієї сутності в CRUD-манері - тобто створити нову сутність із заповненими властивостями, а потім зберегти її в базі даних, завантажити запис із бази даних або видалити.

Ви отримаєте багато користі від таких красномовних функцій, як брудна перевірка (надсилати SQL UPDATE лише для полів, які були змінені), події моделі (наприклад, надсилати адміністративні сповіщення або оновлювати лічильники статистики, коли хтось створив новий обліковий запис), риси ( позначки часу, м'які видалення, ваші власні риси) нетерпляче / ледаче завантаження тощо. Ви також можете застосувати керований доменом шаблон та реалізувати деякі елементи бізнес-логіки у своїх об'єктах Active Record, наприклад, перевірку, управління відносинами, розрахунки тощо.

Але, як ви вже знаєте, Active Record має певну ціну продуктивності.

Коли ви обробляєте один запис або кілька записів, ні про що турбуватися. Але для випадків, коли ви читаєте багато записів (наприклад, для сіток даних, для звітів, для пакетної обробки тощо), простіші DBметоди Laravel є кращим підходом.

Для наших додатків на базі Laravel ми використовуємо обидва підходи, як ми вважаємо доречними. Ми використовуємо форми Eraquent для інтерфейсу користувача Laravel для обробки одного запису та використовуємо DBметоди (підкріплені поданнями SQL з додатковими налаштуваннями продуктивності, специфічні для механізму бази даних) для отримання даних для таблиць інтерфейсу, завдань експорту тощо. Це також добре працює з RESTful API - Eloquent for GET , ВСТАНОВИТИ, РОЗМІСТИТИ, ВИДАЛИТИ за допомогою ключа та DBдля ОТРИМАТИ без ключа, але з фільтрами та сортуванням та підкачуванням.


1
Чи напружене завантаження не вирішує проблему продуктивності?
Christophvh

5
@Christophvh Іноді Бажаюче завантаження може трохи допомогти, але все-таки це залишається тим самим красномовним (Active Record) об’єктом з усіма його «важкими речами». Laravel пропонує кілька зручних методів на моделях Eloquent, щоб зробити запити SQL та отримані об'єкти ще легшими, але це вже не чистий Eloquent, а якийсь гібрид Eloquent / QueryBuilder.
JustAMartin

Eloquent ідеально підходить для звичайних CRUD-операцій на одній моделі або простих JOIN при роботі з кількома записами, але як тільки ви починаєте входити в складні об'єднання та працювати з сотнями або тисячами записів у транзакції, методи побудови запитів стають більш ефективними; в усьому, необроблений SQL - найефективніший варіант, оскільки це прямий запит.
OzzyTheGiant

Тим не менше погоджуєтесь з відповіддю, оскільки зараз я стикаюся з тим самим способом, що завантаження (SELECT) з різними перевірками / правилами від красномовного - це болісно, ​​але перенести всіх їх у конструктор запитів також є великою проблемою, якщо ми не плануємо з початку що нам потрібно для використання запиту DB, що робити з красномовним, сподіваємось, інші знають про це
Osify

лише для уточнення: проблема, яку має laravel з красномовним, - це створення моделей. Наприклад, laravel робить new User()для кожного повернутого рядка користувача. Це , можливо , займає всього 1 мс , але якщо ою є 10'000 записи? Це часто навіть не потрібно, оскільки колись ви просто хочете повернути скажімо ім'я користувача. У такому випадку це DB::selectбуло б швидше. Зауважте також: красномовним не є реалізація помилок afaik. Це реалізація симфонії, яка була адаптована laravel або була в якийсь момент, якщо я правильно пам’ятаю.
Тоскан

52

Так, в якомусь випадку ти маєш рацію. Коли ми маємо більше даних і майже на кожному веб-сайті, дані насправді не малі. Тоді краще використовувати DB Query, ніж Eloquent Query .

У випуску продуктивності Eloquent VS DB я чув,

Щоб вставити 1000 рядків для простої таблиці, Eloquent займає 1,2 секунди, і в цьому випадку фасади БД займають лише 800 мілі секунд (мс).

То чому тоді красномовний? Це нічого не потрібно?

Відповідь така - красномовний також необхідний. Причина-

Щоб створити кращі стосунки та отримати результати з огляду на стільки простого синтаксису, коли потрібно приєднатися.

Красномовний також для тих, хто не має великих знань про запити SQL .

Структура MVC відповідає правилам читабельності коду, ремонтопридатності коду та того, що таке красномовний, ви це знаєте. Порівняння коду нижче. Очевидно, Красномовство краще читати.

// In Eloquent
$student = App\Student::find($id);

// In DB facade
$student = DB::table('student')->where('id', $id)->first();

Найголовніше, якщо ми хочемо змінити іншу базу даних , тоді необроблений запит буде для нас дуже головним болем, і в такому випадку Laravel Eloquent вирішить всі проблеми однією рукою. Він може обробляти різні типи баз даних.

Отже, коли ми використовуємо Eloquent і When DB фасади:

  1. Коли ми будемо працювати на простому і невеликому сайті записів із простим CRUD, а там записи не є фактом, тоді використовуйте там Eloquent.
  2. Коли ми будемо працювати над великою кількістю записів, краще використовувати DB Query, ніж Eloquent.

Отже, нарешті це зрозуміло - коли ми будемо використовувати Запит до бази даних і Коли ми будемо використовувати Красномовний запит.

Редагувати - Приклад із реального життя

  1. Я роблю веб-сайт університету . Який може містити максимум 5,000 teachers and 10,000 students and some notices and files. Тоді краще зробити це за допомогою простого Laravel Eloquent, який є дуже стандартним і читабельним.
  2. Зараз я роблю такий сайт, як Stackoverflow . Яка може містити більше ніж 1,000,0000 (1 crore) posts and many more things. Я повинен вибрати там звичайні фасади БД. Це швидший пошук записів із такої кількості записів.

Ви можете перевірити ефективність запитів за допомогою налагоджувача Laravel (популярний пакет для перевірки продуктивності записів Eloquent / Database / часу виконання)

Тепер це ваш вибір. Що ви хочете зробити ...

Ви можете перевірити тут повний код, порівнявши код із продуктивністю, споживанням пам'яті та якістю коду про них - https://devsenv.com/tutorials/laravel-eloquent-vs-db-query-builder-performance-and-other-statistics


4
"Коли ми будемо працювати над великою кількістю записів", має бути "коли ми використовуємо багато об'єднань та функцій, не підтримуваних Eloquent". Коли Eloquent не спрацьовує з великим навантаженням, це призводить до масового хіту продуктивності. На сьогодні складні агрегати та об’єднання кількома стовпцями важкі для Eloquent. Якщо у вас мільйон записів, і все, що ви робите, це вибрати кілька записів з однієї таблиці, Eloquent веде до того самого SQL та продуктивності, що і DBQuery, або навіть прямий PDO.
Michiel van der Blonk

Проста та досконала відповідь
Juned Ansari

34

Чому Laravel Eloquent:

  1. Виконання запиту OOPспособом.
  2. Простий у використанні, ніж необроблений запит або query builder.
  3. Немає прив'язки з table schema. тобто навіть якщо ви змінили назву таблиці, не потрібно торкатися жодної query(може бути 1000 query), щоб вона працювала. Просто змініть назву таблиці красномовно model.
  4. Відносини між столами можна підтримувати елегантно. Просто згадайте тип відносин, більше нічого ( JOIN, LEFT JOIN, RIGHT JOINтощо), необхідного у запиті, для отримання даних відповідних таблиць.
  5. Запити легко читаються під час написання за допомогою Eloquent порівняно з Query Builder.
  6. Ви можете використовувати методи, сфери застосування, аксесуари, модифікатор тощо всередині Моделі, яка проста в обслуговуванні.

20

Коли мова заходить про продуктивність і додаток росте, для порівняння візьміть бабло за наступними таблицями:

Порівняння середнього часу відгуку вибраної операції між Eloquent ORM та Raw SQL

Красномовний середній час відгуку ORM

Joins | Average (ms) 
------+-------------
1     | 162,2 
3     | 1002,7 
4     | 1540,0 

Result of select operation average response time for Eloquent ORM 

Неопрацьований середній час відгуку SQL

Joins | Average (ms) 
------+-------------
1     | 116,4 
3     | 130,6 
4     | 155,2 

Result of select operation average response time for Raw SQL 

Посилання на статтю


5

Це лише моя думка, а не вичерпна відповідь. Я використовую все, що зручніше в тій чи іншій ситуації.

Якщо я натрапляю на пакет або код, написаний красномовним текстом або у конструкторі запитів, я використовую те, що використовується.

Я виявив, що конструктор запитів є більш інтуїтивним, якщо я створюю щось з нуля, тому я використовую його частіше.

Що стосується Laravel, то, здається, легкість і швидкість розробки програми важливіші за продуктивність. Мені дуже подобається, що вони роблять все дуже легко навіть для тих, хто мало знає про php / mysql. У деяких випадках красномовний простіше, ніж конструктор запитів. В інших навпаки. Я думаю, що багато способів щось робити - це те, що робить Laravel таким легким та зручним для новачків.


2

Красномовний ORM найкраще підходить для роботи з меншою кількістю даних у певній таблиці. З іншого боку, конструктор запитів займає менше часу, щоб обробляти численні дані в одній або декількох таблицях швидше, ніж Eloquent ORM.

У моєму випадку я використовую ELoquent ORM у програмі з таблицями, які містять менше 17500 записів. Щоразу, коли я передбачаю, що таблиця буде містити більше 17500 записів, найкращим є конструктор запитів.

Крім того, в додатках з підзапитами я віддаю перевагу конструктору запитів над ELoquent ORM.


2

Між ними є багато різного

  1. Запит Builder набагато швидший, ніж ORM, ви тестуєте його за допомогою налагоджувача. ось як можна протестувати https://scotch.io/tutorials/debugging-queries-in-laravel .
  2. Запит Builder вимагає менше часу на виконання, коли ви працюєте з великими обсягами даних, наприклад, якщо у вашій базі даних більше 1000000, ніж ORM.
  3. Запит Builder найкраще підходить для великого обсягу даних. Orm найкраще підходить, коли ви працюєте з відношеннями, оскільки він надає багато методів відношення для визначення відношення між таблицями.
  4. Запит будівельника використовує об'єднання sql, але використання orm для роботи з 2 таблицями або більше.

1

Мені подобається використовувати конструктор запитів під час створення складного запиту з бази даних, оскільки він здається простим у використанні. Для роботи з єдиним столом я люблю красномовного.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.