Остановите CakePHP 3 от перечисления всех полей в запросе SELECT, который он генерирует с помощью find () - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь оптимизировать большой запрос MySQL.Я случайно обнаружил, что запрос со всеми перечисленными полями (SELECT Orders.id AS Orders__id, <...>; поведение CakePHP по умолчанию) занимает в 4 раза больше времени, чем запрос с SELECT * FROM - 0,324 секунды против 0,084 секунды;проверил несколько раз.

Мне интересно, могу ли я отключить это поведение.Я пробовал:

  • добавление 'fields' => '*' к find() опциям или вызов ->select('*'), но это приводит к SELECT Orders.* AS Orders__*, который выдает SQLSTATE[42000] ошибка.

  • избавление от псевдонима с ->select(['*' => '*']) согласно query-builder.html # selection-data , но это приводит к SELECT * AS *, который также выдает ошибку

  • с использованием ->enableAutoFields(false)

Я также пытался Google, но я даже не знаю, как позвонитьэто

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Очевидно, я не могу не иметь перечисленные поля из-за того, как был разработан CakePHP ORM.

Таким образом, вместо этого, решает вручную белый список только тех полей, которые мне действительно нужны.В конце концов, запрос все еще относительно быстрый (по моим измерениям около 100 мс).

0 голосов
/ 25 мая 2018

Кажется, вы хотите переопределить преимущества ORM, поэтому я собираюсь предложить метод, который не следует использовать в обычных операциях.

$datasource = ConnectionManager::get('default');
$datasource->execute('SELECT * FROM some_table;');

Если вы хотите гидрировать объекты, вы должны разрешитьоператор select для создания псевдонимов полей, так что вышеприведенное не даст вам сущностей.

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

...