Я пытаюсь оптимизировать большой запрос MySQL. Я случайно обнаружил, что запрос со всеми указанными полями (SELECT Orders.id AS Orders__id, <...>
; поведение CakePHP по умолчанию) занимает в 4 раза больше времени по сравнению с запросом только с SELECT * FROM
- 0,324 секунды против 0,084 секунды; проверен несколько раз.
Мне интересно, могу ли я отключить это поведение. Я пробовал:
добавляя 'fields' => '*'
к параметрам find()
или call ->select('*')
, но это приводит к SELECT Orders.* AS Orders__*
который выдает ошибку SQLSTATE [42000].
избавление от псевдонимов title ->select(['*' => '*'])
в соответствии с запросом-builder.html # select-data, но это приводит к SELECT * AS *
который также выдает ошибку
using ->enableAutoFields(false)
Я также пытался Google, но я даже не знаю, как назвать это
По-видимому, я не могу не иметь перечисленных полей из-за того, как был разработан CakePHP ORM.
Таким образом, вместо этого, решается путем ручной переадресации только полей, которые мне действительно нужны. Запрос по-прежнему относительно быстро после всех (около 100 мс, согласно моим измерениям).
Кажется, вы хотите переопределить преимущества ORM, поэтому я собираюсь предложить метод, который не должен использоваться в обычных операциях.
$datasource = ConnectionManager::get('default');
$datasource->execute('SELECT * FROM some_table;');
Если вы хотите гидратировать объекты, вы должны разрешить оператору select псевдонизировать поля, чтобы приведенное выше не давало вам объектов.
Мое мнение таково, что вы должны использовать обычный выбор и оптимизировать свои стратегии кеширования для этих данных.
contain
конструкцию много в этом запросе, поэтому выпуск SQL непосредственно не почти эффективно. Это все еще может быть вариантом для кого-то еще, однако. Спасибо, проголосовал. Кстати, добро пожаловать в 1К клуб хаха :)
SELECT * FROM <...>
а не перечислял все поля, которые он собирается выбрать