-1

mysql クエリの応答時間をテストしていますが、select ステートメントにテキスト型フィールドを 1 つだけ追加すると、クエリがほぼ 10 倍以上遅くなることに気付きました。mysql は FULL OUTER JOIN ステートメントをサポートしていないため、次の回避策を使用しています。

select 
a.idACCOUNT,p.idPROJECT,p.projectName,t.TRAINING_idPROJECT,t.idTRAINING,t.trainingName,m.MODULE_idTRAINING,m.idMODULE,m.moduleName,c.idCONTENT,c.contentName,
s.idSUBCONTENT
from ACCOUNT as a
   left outer join PROJECT as p on a.idACCOUNT = p.PROJECT_idACCOUNT
   left outer join TRAINING as t on a.idACCOUNT = t.TRAINING_idACCOUNT AND p.idPROJECT = t.TRAINING_idPROJECT
   left outer join MODULE as m on a.idACCOUNT = m.MODULE_idACCOUNT AND p.idPROJECT = m.MODULE_idPROJECT AND t.idTRAINING = m.MODULE_idTRAINING 
   left outer join CONTENT as c on a.idACCOUNT = c.CONTENT_idACCOUNT AND p.idPROJECT = c.CONTENT_idPROJECT AND t.idTRAINING = c.CONTENT_idTRAINING AND 
m.idMODULE = c.CONTENT_idMODULE 
   left outer join SUBCONTENT as s on a.idACCOUNT = s.SUBCONTENT_idACCOUNT AND p.idPROJECT = s.SUBCONTENT_idPROJECT AND t.idTRAINING = s.SUBCONTENT_idTRAINING 
AND m.idMODULE = s.SUBCONTENT_idMODULE AND c.idCONTENT =    s.SUBCONTENT_idCONTENT
WHERE a.idACCOUNT='1'
union all
select 
a.idACCOUNT,p.idPROJECT,p.projectName,t.TRAINING_idPROJECT,t.idTRAINING,t.trainingName,m.MODULE_idTRAINING,m.idMODULE,m.moduleName,c.idCONTENT,c.contentName,
s.idSUBCONTEN
from ACCOUNT as a
   right outer join PROJECT as p on a.idACCOUNT = p.PROJECT_idACCOUNT
   right outer join TRAINING as t on a.idACCOUNT = t.TRAINING_idACCOUNT AND p.idPROJECT = t.TRAINING_idPROJECT
   right outer join MODULE as m on a.idACCOUNT = m.MODULE_idACCOUNT AND p.idPROJECT = m.MODULE_idPROJECT AND t.idTRAINING = m.MODULE_idTRAINING 
   right outer join CONTENT as c on a.idACCOUNT = c.CONTENT_idACCOUNT AND p.idPROJECT = c.CONTENT_idPROJECT AND t.idTRAINING = c.CONTENT_idTRAINING AND 
m.idMODULE = c.CONTENT_idMODULE 
   right outer join SUBCONTENT as s on a.idACCOUNT = s.SUBCONTENT_idACCOUNT AND p.idPROJECT = s.SUBCONTENT_idPROJECT AND t.idTRAINING = 
s.SUBCONTENT_idTRAINING AND m.idMODULE = s.SUBCONTENT_idMODULE AND c.idCONTENT = s.SUBCONTENT_idCONTENT
WHERE a.idACCOUNT is null;

上記のクエリには、最大 255 の varchars と INT 11 フィールドのみが含まれています。このクエリは次の速度で結果を返します: クエリに 0.0010 秒かかりました。

ここで、選択セクションに少なくとも 1 つのテキスト フィールド クエリを追加すると、クエリ時間が 0.0337 秒に跳ね上がり、単一のテストが 0.1 秒に達することもあります

重要ではありませんが、テキスト フィールドに対して別のクエリを実行すると、次の速度ではるかに高速になります。クエリに 0.0004 秒かかりました。

これは、2 つのクエリを分離し、コメントなどのテキスト フィールドに対して特定のクエリを作成し、varchar やその他のインデックスに対して個別のクエリを作成する方が高速であるように思えます。

ここで私の質問は、選択部分にフィールドされたテキストを1つだけ追加すると、クエリ時間にそれほど影響するのはなぜですか? そして、予想される時間枠内で別のクエリが実行されるのはなぜですか?

お時間とご協力いただきありがとうございます。

4

1 に答える 1