私は、結果の内容を数えるシンプルで長い質問を約14秒かかります。メインテーブルの数自体は秒未満かかりますが、複数の後遅延に参加する説明の出力は多くの結合でクエリを最適化する方法は?
+---+---+---+---+---+---+---+---+---+---+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +---+---+---+---+---+---+---+---+---+---+ | 1 | SIMPLE | specialties | index | PRIMARY | specialty_name | 52 | NULL | 53 | Using index | | 1 | SIMPLE | clients | ref | PRIMARY,specialty | specialty | 4 | crm_db.specialties.id | 143 | | | 1 | SIMPLE | clients_locations | ref | PRIMARY,client_id | client_id | 4 | crm_db.clients.id | 1 | | | 1 | SIMPLE | locations | eq_ref | PRIMARY | PRIMARY | 4 | crm_db.clients_locations.location_id | 1 | | | 1 | SIMPLE | districts | eq_ref | PRIMARY | PRIMARY | 4 | crm_db.locations.district_id | 1 | Using where | | 1 | SIMPLE | visits | ref | unique_visit,client_location_id | unique_visit | 4 | crm_db.clients_locations.id | 4 | Using index | | 1 | SIMPLE | calls | ref | call_unique,visit_id | call_unique | 4 | crm_db.visits.id | 1 | Using index | +---+---+---+---+---+---+---+---+---+---+
ある従っ
Select Count(Distinct visits.id) As Count_id
From visits
Left Join clients_locations ON visits.client_location_id = clients_locations.id
Left Join clients ON clients_locations.client_id = clients.id
Left Join locations ON clients_locations.location_id = locations.id
Left Join users ON visits.user_id = users.id
Left Join potentialities ON clients_locations.potentiality = potentialities.id
Left Join classes ON clients_locations.class = classes.id
Left Join professions ON clients.profession_id = professions.id
Inner Join specialties ON clients.specialty_id = specialties.id
Left Join districts ON locations.district_id = districts.id
Left Join provinces ON districts.province_id = provinces.id
Left Join locations_types ON locations.location_type_id = locations_types.id
Left Join areas ON clients_locations.area_id = areas.id
Left Join calls ON calls.visit_id = visits.id
としては高すぎるアップデート1 上記のクエリ動的なステートメント$sql = $sql . "Where ". $whereFilter
で使用されましたが、私は単純な形式で提出しました。だから、ここでは単に参加する:)
を更新2をeleminate は、動的フィルタリングの例
$temp = $this->province_id;
if ($temp != null) {
$whereFilter = $whereFilter . " and provinces.id In ($temp) ";
}
しかし、ノーどこ声明
訪問時に一意のIDを数えているだけなら、なぜ参加する必要がありますか? – ebyrob
あなたはフィルタリングをしていないようですが、どうして 'count(distinct) 'が必要ですか?つまり、「内部結合」または「結合」の中に2つが振りかざされていますが、結合は必要ないと思われます。 –
後でこのクエリをdynamic whereステートメント 'where $ whereFilter' –