Laravel Eloquent против построителя запросов - зачем использовать eloquent для снижения производительности

42

Я провел несколько тестов производительности между Laravel query builder и eloquent. Конструктор запросов был намного быстрее с различными операторами sql (select-update-delete-insert).

Итак, мой вопрос: почему кто-то использует Laravel Eloquent против простого построителя запросов?

  • 13
    Не сравнивайте яблоки и апельсины. Eloquent - это ORM, а это значит, что он может автоматически обрабатывать отношения ваших моделей за вас. Вы можете получить связанные модели без написания сложных запросов. Вы даже можете получить информацию о базе данных без каких-либо знаний базы данных вообще. Кроме того, Eloquent обладает множеством дополнительных функций, отсутствующих в построителе запросов, таких как удобочитаемость, методы доступа, мутаторы, преобразование JSON / Array, скрытие чувствительных атрибутов, автоматические временные метки, автоматическое приведение атрибутов, программные блоки и т.д.
  • 42
    Яблоки производят яблочный сок, апельсины производят апельсиновый сок. Но, к сожалению, Eloquent и Query Builder выдают одно и то же - data из database . Может быть, поэтому он сравнивает эти два.
Показать ещё 1 комментарий
Теги:
performance
laravel-5

7 ответов

70
Лучший ответ

Eloquent - это реализация Laravel шаблона Active Record, и он обладает всеми его сильными и слабыми сторонами. Это хорошее решение для использования при обработке одного объекта с помощью CRUD, то есть чтения из базы данных или создания нового объекта, а затем сохранения или удаления. Вы получите много преимуществ от таких черт, как грязная проверка (для отправки SQL UPDATE только для полей, которые были изменены), события модели (например, для отправки административного предупреждения или обновления счетчика статистики, когда кто-то создал новую учетную запись), черт ( временные метки, мягкие удаления, пользовательские черты) нетерпевая/ленивая загрузка и т.д.

Но, как вы уже знаете, это связано с некоторой ценой исполнения. Когда вы обрабатываете одно или несколько записей, вам не о чем беспокоиться. Но для случаев, когда вы читаете множество записей (например, для datagrids, для отчетов, для пакетной обработки и т.д.), Простой DB лучше подходит.

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

  • 0
    Не загружает ли Eager проблему с производительностью?
  • 3
    @Christophvh Иногда активная загрузка может немного помочь, но все же он остается тем же объектом Eloquent (Active Record) со всеми его «тяжелыми вещами». Laravel предлагает несколько удобных методов на моделях Eloquent, чтобы сделать запросы SQL и извлеченные объекты еще легче, но тогда это уже не чистый Eloquent, а своего рода гибрид Eloquent / QueryBuilder.
22

Почему Laravel Eloquent:

  • Выполнение запроса с помощью OOP.
  • Прост в использовании, чем необработанный запрос или query builder.
  • Нет привязки к table schema. т.е. даже вы меняете имя таблицы, не нужно касаться одного query (может быть 1000 query), чтобы заставить его работать. Просто измените имя таблицы в model.
  • Отношения между таблицами можно поддерживать элегантным способом. Просто укажите тип отношения, больше ничего (JOIN, LEFT JOIN, RIGHT JOIN и т.д.), Необходимые в запросе, чтобы получить данные связанных таблиц.
  • Запросы, хорошо читаемые при написании с использованием Eloquent по сравнению с Query Builder.
21

Да, в некоторых случаях вы правы. Когда у нас есть больше данных и почти на каждом сайте, данные на самом деле не маленькие. Тогда лучше использовать DB Query, чем Eloquent Query.

В проблеме производительности Eloquent VS DB я слышал, что

Для вставки 1000 строк в простую таблицу Eloquent требуется 1,2 секунды, и в этом случае фасады БД занимают всего 800 миль (мс).

Так почему тогда красноречивый? Разве это не нужно?

Ответ - красноречивый также необходим. Cause-

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

Eloquent также для тех, кто не очень хорошо знает SQL-запросы.

Платформа MVC следует правилам читабельности кода, сопровождения кода и тому, что Eloquent, вы знаете это. Сравнение кода ниже. Очевидно, что Eloquent лучше читать.

// 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.

Итак, наконец-то все ясно: когда мы будем использовать запрос к базе данных и когда мы будем использовать Eloquent Query.

Edit - Пример из реальной жизни

  1. Я делаю сайт университета. Который может содержать не более 5,000 teachers and 10,000 students and some notices and files. Тогда лучше сделать это с помощью простого Laravel Eloquent, который очень стандартен и удобочитаем.
  2. Сейчас я делаю сайт наподобие Stackoverflow. Который может содержать более 1 1,000,0000 (1 crore) posts and many more things. Я должен будет выбрать обычные фасады DB там. Это быстрее для поиска сообщений из такого количества записей.

Теперь это ваш выбор. Что вы хотите сделать...

  • 1
    «Когда мы будем работать с большим количеством записей», должно быть «когда мы используем много объединений и функций, не поддерживаемых Eloquent». Когда Eloquent не загружается, это приводит к значительному снижению производительности. Сложные агрегаты и объединения по нескольким столбцам в настоящее время трудны для Eloquent. Если у вас есть миллион записей, и все, что вы делаете, это выбираете несколько записей из одной таблицы, Eloquent приводит к тому же SQL и производительности, что и DBQuery, или даже к прямому PDO.
  • 0
    Простой и совершенный ответ
7

Когда дело доходит до производительности и роста приложения, для сравнения возьмите лут в следующих таблицах:

Сравнение среднего времени ответа операции выбора между 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 

Ссылка на статью

4

Это просто мое мнение, а не всеобъемлющий ответ. Я использую все, что удобнее в данной ситуации.

Если я сталкиваюсь с пакетом или кодом, написанным либо в красноречивом, либо в построителе запросов, я использую все, что используется.

Я обнаружил, что построитель запросов более интуитивно понятен, если я что-то создаю с нуля, поэтому чаще использую его.

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

1

Мне нравится использовать построитель запросов при создании сложного запроса из базы данных, потому что он кажется простым в использовании. Для работы с одной таблицей мне нравится красноречивый.

0

Eloquent ORM лучше всего подходит для работы с меньшим количеством данных в конкретной таблице. С другой стороны, построителю запросов требуется меньше времени для обработки многочисленных данных, будь то в одной или нескольких таблицах быстрее, чем в Eloquent ORM.

В моем случае я использую ELoquent ORM в приложении с таблицами, которые будут содержать менее 17500 записей. Всякий раз, когда я ожидаю, что таблица будет содержать более 17500 записей, лучше всего подходит построитель запросов.

Кроме того, в приложениях с подзапросами я предпочитаю построитель запросов, а не ELoquent ORM.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню