2011-05-11 5 views
0

は、私は(意図したとおりに動作している)私のクエリを見て、目の新しいセットを持つことができますしてください、私は厳しい批判や提案や改善の方法を探しています:CakePHPは参加して、条件の最適化厳しい批判が

。 ..

$options = array(
    'joins'  => array(
     array(
      'table'  => 'plans_zips', 
      'alias'  => 'PZips', 
      'type'  => 'inner', 
      'foreignKey' => false, 
      'conditions' => array('Plan.id = PZips.plan_id') 
     ), 
     array(
      'table'  => 'zips', 
      'alias'  => 'Zips', 
      'type'  => 'inner', 
      'foreignKey' => false, 
      'conditions' => array('Zips.id = PZips.zip_id') 
     ) 
    ), 
    'conditions' => array(
     "OR" => array(
      'AND' => array(
       $ApplicantAge . ' BETWEEN Age.Min_Age AND Age.Max_age', 
       'Zips.title'    => $Zip, 
       'Applicant.amount'   => array($comboType, $memberCount), 
      "NOT" => 
       array(array('PlanDetail.company_id' => array('27','3')))), 
      array(
       $PsSpouseAge . ' BETWEEN Age.Min_Age AND Age.Max_age', 
       'Zips.title'   => $Zip, 
       'Applicant.amount'  => array($comboType, $memberCount), 
       'PlanDetail.company_id' => '27'), 
      array(
       $OdsSpouseAge . ' BETWEEN Age.Min_Age AND Age.Max_age', 
       'Zips.title'   => $Zip, 
       'Applicant.amount'  => array($comboType, $memberCount), 
       'PlanDetail.company_id' => '3')) 
), 
    'contain' => array(
     'PlanDetail' => array(
      'fields' => array(
       'id', 
       'effective_date', 
       'expiration_date', 
       'active', 
       'name', 
       'plan_type_id', 
       'max_benefit', 
       'deductible', 
       'preventive', 
       'basic', 
       'major', 
       'ortho', 
       'application_url', 
       'company_id', 
       'plan_type_id', 
       'plan_detail_note_id'), 
      'Company' => array('fields' => array(
       'id', 
       'name', 
       'company_logo_url' 
      )), 
      'PlanType' => array('fields' => array(
       'id', 
       'name', 
       'description' 
      ))), 
     'Age'  => array('fields' => array(
      'id', 
      'name', 
     )), 
     'Applicant' => array('fields' => array(
      'id', 
      'name', 
     )), 
     'Zip'  => array('fields' => array(
      'id', 
      'title') 
     ) 
    ), 
    'limit'  => 100, 
    'order'  => array('monthly_cost' => 'ASC') 
); 
if ($Vision == 1) { 
    array_push($options['conditions'], "dental_cost > 0"); 
} 

...

+0

同じスクリプトと同じデータベーススキーマの場合は、おそらくMySQLサーバーです。サーバーを最適化する必要があるかもしれません。この[記事](http://www.joehayes.org/optimizing-mysql-for-dummies.html)にあるスクリプトを実行してみてください。 – junwafu

答えて

0

私はおそらく、複数の小さなクエリを実行することで、クエリを簡素化に取り組んでお勧めしたいです。それ以外の場合は、データベースエンジンを最適化するか、mysqlプロファイラを使用してパフォーマンスを向上させるためにSQLでクエリを最適化してください。

0

debug> 1のときに生成されるクエリログのどこかにpastebinに投稿できますか?

また、インデックス/テーブル構造がわかるように、mysqlデータベースのdescribe文の結果を投稿します。

生成されたクエリ/クエリを見ずにデータベース情報を見ることなく、誰でもこれを評価できる現実的な方法はありません。

+0

Abba、私はクエリ結果セットとテーブル構造を掲示しました。 plans_zipsテーブルのインデックスを作成しましたが、構造の出力には表示されません。ここにリンクがあります:http://pastebin.com/9SRXFdqK – OldWest

+0

うわー、私は重複したクエリのトンがそこに表示されます。同じIDで何回もAgeテーブルをクエリする理由がありますか? –

+0

私はAgeテーブル(および他のもの)で何度も何度も繰り返されるクエリをキャッシュすることから始めます。または、クエリを実行している場所では、find( 'all')の最初の結果セットを、 dbに照会します。それが関係から来ているのであれば、queryCacheや多くのキャッシュプラグインの実装を見てください。 –

関連する問題