Я пытаюсь оптимизировать большой запрос 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)
Я тоже пробовал гуглить, но даже не знаю, как это назвать
Я хочу, чтобы сгенерированный запрос был просто SELECT * FROM <...>, а не перечислял все поля, которые он собирается выбрать
Но вы не сможете увлажнить результаты
Я думаю, что вы неправильно измерили время запроса. без очистки кеша и т. д.
Вы действительно уверены в потраченном времени? Как вы это измерили?
@Antoniossss опередил меня ...
@ndm получил его из MySQL Workbench "Action Output" i.imgur.com/KerEgJC.png, вы думаете, это неточно?






Похоже, вы хотите переопределить преимущества ORM, поэтому я собираюсь предложить метод, который не следует использовать в обычных операциях.
$datasource = ConnectionManager::get('default');
$datasource->execute('SELECT * FROM some_table;');
Если вы хотите гидратировать сущности, вы должны разрешить оператору select использовать псевдонимы для полей, чтобы приведенное выше не давало вам сущностей.
Я считаю, что вы должны использовать обычный выбор и оптимизировать свои стратегии кеширования для этих данных.
В этом запросе я использую конструкцию containмного, поэтому прямой ввод SQL не очень эффективен. Однако это может быть вариант для кого-то другого. Спасибо, проголосовали за. Кстати, добро пожаловать в клуб 1К хаха :)
По-видимому, я не могу иметь перечисленные поля в нет из-за того, как был разработан CakePHP ORM.
Поэтому вместо этого решается вручную занести в белый список только те поля, которые мне действительно нужны. В конце концов, запрос по-прежнему относительно быстрый (около 100 мс по моим измерениям).
так что именно ты хочешь?