2017-10-13 54 views
0

私はEXPLAINクエリから次のことを知っています。私はこれを使ってクエリのパフォーマンスを向上させる方法を知りません。私の質問は以下の通りです:MYSQLクエリがなぜ遅いのかわかりません

SELECT 
    `b`.`business_name` AS `Name`, 
    `b`.`address` AS `Address`, 
    `b`.`city` AS `City`, 
    `b`.`phone_number` AS `Phone`, 
    `b`.`state` AS `Prov`, 
    `i`.`date` AS `Last_Observed`, 
    group_concat(`v`.`notes` separator ', ') AS `Notes`, 
    `v`.`critical` AS `Criticality`, 
    `i`.`type` AS `Inspection_Type`, 
    `i`.`rating` AS `Rating` 
FROM (`fs_v1_violation_table` `v` 
LEFT JOIN (`fs_v1_inspection_table` `i` 
LEFT JOIN `fs_v1_business_table` `b` ON((`b`.`id` = `i`.`business_id`))) 
ON((`i`.`id` = `v`.`inspection_id`))) 
WHERE `v`.`type` = 'Cleanliness' AND (
    b.city = 'North Vancouver' 
    OR b.city = 'Vancouver' 
    OR b.city = 'White Rock' 
    OR b.city = 'West Vancouver' 
    OR b.city = 'Burnaby' 
    OR b.city = 'Langley' 
    OR b.city = 'Maple Ridge' 
    OR b.city = 'Delta' 
    OR b.city = 'Surrey') 
GROUP BY `i`.`id` 
ORDER BY `i`.`date` desc; 

私はパフォーマンスを改善するためにどのような考えがありますか?クエリには約3分かかります。

Explain Query

+0

試してみてください:https://dev.mysql.com/doc/refman/5.7/en/explain.html –

+0

確認するには 'explain'メソッドを使用してください。 – urfusion

+0

b.cityにインデックスを作成しよう –

答えて

0

まず選択リストは、リストでグループに含まれていないフィールドが含まれ、またリストで機能的にグループ内のフィールドに依存しているので、あなたのクエリは、SQL標準に対してのようですmin()またはsum()などの集計関数を使用して集計されることもありません。残念ながら、MySQLでは、特定のSQLモード設定でこのようなクエリを実行することができます。幸いにも、この設定はデフォルトではオフになっています。

一連のORの代わりにIN (...)を使用し、fs_v1_business_tableテーブルのマルチカラムインデックスがテーブルのid, cityフィールドにあることを確認して、クエリを高速化してください。 fs_v1_inspection_tableテーブルのbusiness_id, id, dateフィールドにマルチカラムインデックスを作成することもできます。

1

すぐに行量を減らすようにしてください。

「b.city」列から索引を作成します。

例SQL。

SELECT 
    `b`.`business_name` AS `Name`, 
    `b`.`address` AS `Address`, 
    `b`.`city` AS `City`, 
    `b`.`phone_number` AS `Phone`, 
    `b`.`state` AS `Prov`, 
    `i`.`date` AS `Last_Observed`, 
    group_concat(`v`.`notes` separator ', ') AS `Notes`, 
    `v`.`critical` AS `Criticality`, 
    `i`.`type` AS `Inspection_Type`, 
    `i`.`rating` AS `Rating` 
FROM `fs_v1_violation_table` AS `v` 
LEFT JOIN `fs_v1_inspection_table` AS `i` ON `i`.`id` = `v`.`inspection_id` 
LEFT JOIN `fs_v1_business_table` AS `b` ON `b`.`id` = `i`.`business_id` AND b.city IN ('North Vancouver', 'Vancouver', 'White Rock', 'West Vancouver', 'Burnaby', 'Langley', 'Maple Ridge', 'Delta', 'Surrey') 
WHERE `v`.`type` = 'Cleanliness' 
GROUP BY `i`.`id` 
ORDER BY `i`.`date` desc; 
関連する問題