SQL最適化(一)
2038 ワード
SQL最適化
まずは索引から工夫します。
sqlの前に「explanin」をつけて性能を調べたらどうですか?
インデックスが使用されているかどうかを確認します。は、left join、inner joinまたはexistsを利用したほうがいいです。INで検索するのは遅いです。 。.existsがinより効率が高いという説は不正確である。 クエリの2つのテーブルのサイズが同じであれば、inとexistsでの違いは大きくない。 もし二つのテーブルの中の一つが小さいなら、一つは大きいテーブルで、サブクエリーテーブルの大きいのはexistsを使い、サブクエリーテーブルの小さいのはin: を使います。
inner join(left/right)
まずは索引から工夫します。
sqlの前に「explanin」をつけて性能を調べたらどうですか?
インデックスが使用されているかどうかを確認します。
show index from tableName
索引を追加ALTER TABLE tableName ADD INDEX ( );
インデックスを削除DROP INDEX (key_name) ON tableName
sql文から最適化inner join(left/right)
SELECT
t.t_advert_id,
IFNULL( sum( t.success_target_account ), 0 ) AS account_num,
IFNULL( sum( t.success_target_group ), 0 ) AS group_num
FROM
t_task_detail t
INNER JOIN t_device d ON d.device_id = t.device_id
INNER JOIN r_device_device_tag tag ON tag.t_device_id = d.t_device_id
WHERE
1 = 1
AND tag.t_device_tag_id = 9
GROUP BY
t.t_advert_id
existsSELECT
t.t_advert_id,
IFNULL( sum( t.success_target_account ), 0 ) AS account_num,
IFNULL( sum( t.success_target_group ), 0 ) AS group_num
FROM
t_task_detail t
WHERE
1 = 1
AND EXISTS (SELECT d.device_id FROM t_device_tag dt
INNER JOIN r_device_device_tag ddt ON ddt.t_device_tag_id = dt.t_device_tag_id
INNER JOIN t_device d ON d.t_device_id = ddt.t_device_id WHERE dt.t_device_tag_id =9
AND t.device_id = d.device_id )
GROUP BY
t.t_advert_id
inSELECT
t.t_advert_id,
IFNULL( sum( t.success_target_account ), 0 ) AS account_num,
IFNULL( sum( t.success_target_group ), 0 ) AS group_num
FROM
t_task_detail t
WHERE
1 = 1
AND t.device_id IN (SELECT d.device_id FROM t_device_tag dt
INNER JOIN r_device_device_tag ddt ON ddt.t_device_tag_id = dt.t_device_tag_id
INNER JOIN t_device d ON d.t_device_id = ddt.t_device_id
WHERE dt.t_device_tag_id = 9 )
GROUP BY
t.t_advert_id
転載先:https://www.cnblogs.com/chenshuquan/p/11378277.html