Laravel, Datatables, неэффективные запросы - PullRequest
0 голосов
/ 25 апреля 2018

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

 select count(*) as aggregate from (select '1' as [row_count] from [assignments]
  left join [jobs] on [assignments].[id] = [jobs].[name] 
  left join [categories] on [categories].[id] = [jobs].[vol_cat_type]
   where ([assignments].[id] LIKE '%XYZ%' or [assignments].[person_id] LIKE '%XYZ%' or 
    (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[name_title] LIKE '%XYZ%') >= 1 or 
    (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[first_name] LIKE '%XYZ%') >= 1 or 
    [assignments].[title] LIKE '%XYZ%' or 
    (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[gender] LIKE '%XYZ%') >= 1 or 
    (select count(1) from [states_master] where [states_master].[identity] = [assignments].[current_state] and [states_master].[name] LIKE '%XYZ%') >= 1 or
        [assignments].[updated_datetime] LIKE '%XYZ%' or
        (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[nationality] LIKE '%XYZ%') >= 1 or 
    (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[place_of_birth] LIKE '%XYZ%') >= 1 or 
    (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[civil_status] LIKE '%XYZ%') >= 1 or 
    (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[email] LIKE '%XYZ%') >= 1 or 
    (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[date_of_birth] LIKE '%XYZ%') >= 1 or 
    (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[nationality2] LIKE '%XYZ%') >= 1
      or (select count(1) from [people] where [assignments].[person_id] = [people].[person_id] and [people].[skype] LIKE '%XYZ%') >= 1))
       count_row_table

Большие таблицы задействованы, и выполнение этих запросов не только занимает 20-30 секунд, но и влияет наобщие характеристики сервера.Что мне не нравится, так это то, что многие LIKE применяются ко всем столбцам, особенно к тем, где они применяются к нестроковым (например, к дате последнего изменения).Мое предложение было бы:

1) Использовать = вместо LIKE для всех нестроковых: числа, односимвольные коды, такие как пол M / F, логические значения

2) Конфигурировать полнуютекстовый поиск, включенный в Microsoft SQL Server, и вместо LIKE пишите CONTAINS (столбец, 'XYZ') вместо LIKE

. Возражение от разработчиков состоит в том, что Laravel и Datatables создают эти запросы, и мы ничего не можем сделатьоб этом.

Можно ли настроить Laravel и Datatables, не изменяя, конечно, код библиотеки, указав для каждого столбца, использовать ли LIKE, = или CONTAINS?

1 Ответ

0 голосов
/ 25 апреля 2018

Eloquent обычно используется для создания более простых запросов модели.

Для более сложных запросов SQL используйте конструктор запросов.

Это пример из документации по его использованию.

$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
                     ->where('status', '<>', 1)
                     ->groupBy('status')
                     ->get();

Вы также можете использовать raw sql, если хотите.

$results = DB::select('select * from users where id = :id', ['id' => 1]);

Список литературы:

https://laravel.com/docs/5.6/queries

https://laravel.com/docs/5.6/database#running-queries

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