bugfix> mysql > 投稿

大規模なMySQLクエリを最適化しようとしています。すべてのフィールドがリストされたクエリ( SELECT Orders.id AS Orders__id, <...> ;デフォルトのCakePHPの動作)は、 SELECT * FROM だけのクエリと比較して4倍時間がかかります-0.324秒と0.084秒。数回チェックしました。

この動作を無効にできるかどうか疑問に思っています。私はもう試した:

  • 'fields' => '*' を追加するに find() オプションまたは ->select('*') の呼び出し 、しかし SELECT Orders.* AS Orders__* になりますSQLSTATE [42000]エラーがスローされます。

  • ->select(['*' => '*']) でエイリアス化されたタイトルを取り除くごとにquery-builder.html#selecting-data、しかし SELECT * AS * になりますまた、エラーがスローされます

  • ->enableAutoFields(false) を使用する

私もGoogleを試してみましたが、これを呼び出す方法もわかりません

回答 2 件
  • ORMの利点をオーバーライドしたいので、通常の操作では使用しない方法を提案します。

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

    エンティティをハイドレートする場合は、selectステートメントがフィールドをエイリアスできるようにする必要があります。これにより、上記ではエンティティを取得できません。

    私の意見では、通常の選択を使用して、このデータのキャッシュ戦略を最適化する必要があります。

  • どうやら、私はできませんじゃない CakePHP ORMがどのように設計されたかにより、フィールドがリストされます。

    その代わり、実際に必要なフィールドのみを手動でホワイトリストに登録することで解決しました。結局のところ、クエリはやはり比較的高速です(私の測定によると約100ミリ秒)。

あなたの答え