多くは、オンラインでその引数を見つけることができます:
同程度の大きさのクエリ二つのテーブル場合は、使用中とほとんど差が存在します。
小、大テーブル内の2つのテーブルは、テーブルのサブクエリとは、小さなテーブルサブクエリと、大存在する場合:で
例:表A(小表)、表B(大テーブル)
1:
SELECT * CC WHERE (にCCを選択、非効率的なBから)、インデックステーブルCCカラムを使用しSELECT * からWHEREは(EXISTS CCを選択BからテーブルBを用いる、高効率CC = a.cc)インデックスccの列。代わりの2:SELECT * BからWHERE CC における(CC選択高い効率でAから)を、インデックステーブルCCカラムBの使用; SELECT * Bから(EXISTS CCを選択Aから非効率CC = B.cc) 、テーブルのインデックスのCCカラムを使用します。
次の文は、最適化を実行されます。
選択数(UID)からユーザーのuid 中(SELECTが行ったデモから)。
選択カウント(UID)からユーザが存在する(SELECT 1 デモFROM ここdemo.did = user.uid)。
各外部操作の内部と比較した場合、理由が遅いことに留意されたいテーブルのトラバースを必要とする、他の方法は、複数のトラバース動作を回避する、一つのネストされたサブクエリを使用することができます
SELECT カウント(DID)デモFROM (存在UID SELECT (FROM UID SELECT からユーザ)をBとしてここb.uid = demo.did)。
2. 2番目のクエリの最適化は、文の最初の子がフィールドを接続するためにGROUP_CONCATを使用して、実行されています、
文字列の長さが十分でない場合に使用することができる:SETセッションgroup_concat_max_len = 102400。
元のSQL:
SELECT
c.id
FROM
数据712995条有此表C
LEFTはuがON c.user_id = u.id JOIN
LEFTはc.doctor_id = doc.id ON docのJOIN
LEFTがc.meal_id = s.idのSをJOIN
WHERE
s.renew = 1
AND c.orderstatus = 1
AND c.endtime <UNIX_TIMESTAMP()
AND c.org_type = 'C'
AND u.is_doctor = 0
AND u.active = 1
AND IN doc.is_doctor(4、5)
AND doc.is_family_doctor = 1
AND doc.active = 1
AND NOT IN c.user_id(
SELECT
USER_ID
FROM
D此表有934455条数据
WHERE
d.log LIKE '%の结束'
)。
- 実行時間2.265s
最適化後:
SETセッションのgroup_concat_max_len = 102400;
GROUP_CONCAT Dからの選択(USER_ID) LIKE「%の末端を」d.logは; - 0.521sを行います
SELECT
c.id
FROM
C
LEFTはuがON c.user_id = u.id JOIN
LEFTはc.doctor_id = doc.id ON docのJOIN
LEFTがc.meal_id = s.idのSをJOIN
WHERE
s.renew = 1
AND c.orderstatus = 1
AND c.endtime <UNIX_TIMESTAMP()
AND c.org_type = 'C'
AND u.is_d = 0
AND u.active = 1
AND IN doc.is_d(4、5)
AND doc.is_f_d = 1
AND doc.active = 1
とは..............................、24986,24986,24986,24986,24986,24986(NOT IN c.user_id ................大概5千个ID)。
- 実行時間1.579s
以下0.686s実行時間が、GROUP_CONCAT(USER_ID)はまた、(大きさの電流オーダー)ので、全体は時間差が存在しない、0.521sを行います
そして、問題の大きさを考慮する必要の文字列の後。
現時点では、時間が経過した後、その後慎重に熟考、ということが理解されます。