効率MySQLのINとEXISTS、および最適化を実行

多くは、オンラインでその引数を見つけることができます:

同程度の大きさのクエリ二つのテーブル場合は、使用中とほとんど差が存在します。
小、大テーブル内の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を行います

そして、問題の大きさを考慮する必要の文字列の後。

 

現時点では、時間が経過した後、その後慎重に熟考、ということが理解されます。

   

 

おすすめ

転載: www.cnblogs.com/aldcd/p/11464801.html