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

0

Я пытаюсь оптимизировать большой запрос 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, но я даже не знаю, как назвать это

  • 0
    так что вы хотите именно?
  • 0
    Я хочу, чтобы сгенерированный запрос был просто SELECT * FROM <...> а не перечислял все поля, которые он собирается выбрать
Показать ещё 5 комментариев
Теги:
cakephp
cakephp-3.0

2 ответа

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

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

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

1

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

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

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

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

  • 0
    Я использую contain конструкцию много в этом запросе, поэтому выпуск SQL непосредственно не почти эффективно. Это все еще может быть вариантом для кого-то еще, однако. Спасибо, проголосовал. Кстати, добро пожаловать в 1К клуб хаха :)

Ещё вопросы

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