0

以下の説明を返すクエリがあります:

id  select_type  table  type         possible_keys                                                                                        key                                                      key_len  ref  rows  Extra                                                                                  
1   SIMPLE       this_  index_merge  CategoryId,Deleted,PublishedOn,_ComputedDeletedValue,_Temporary_Flag,Published,_TestItemSessionGuid  Deleted,_ComputedDeletedValue,_Temporary_Flag,Published  1,1,1,1       6203  Using intersect(Deleted,_ComputedDeletedValue,_Temporary_Flag,Published); Using where  

これは、クエリがどこでもインデックスを使用していることを示していますか、それとも他のインデックスを追加することで改善できますか?これに基づいて:http ://dev.mysql.com/doc/refman/5.1/en/explain-output.html 、key列には実際に使用されたインデックスが表示されていると記載されています。すべての列にインデックスがあります。

問題のクエリは次のとおりです。

SELECT SQL_NO_CACHE count(*) FROM 

article this_ 


WHERE 


(this_._Temporary_Flag = 0 OR this_._Temporary_Flag = NULL) AND 
this_.Published = 1 AND 
(this_.PublishedOn IS NULL OR this_.PublishedOn <= '2012-10-30 18:46:18 ') AND 
(this_.Deleted = 0 OR this_.Deleted = NULL) AND 
(this_._ComputedDeletedValue = 0 OR this_._ComputedDeletedValue = NULL) AND
((this_._TestItemSessionGuid IS NULL OR this_._TestItemSessionGuid = ''))

 AND NOT (this_.CategoryId IS NULL) 

テーブルには約140,000レコードがあります。このクエリの実行には3秒かかり、結果として135,725が返されます。

4

1 に答える 1

1

この説明は、MySQLがキー長1,1,1,1の4つの個別のインデックスからマージされたインデックスを使用していることを示しています。これは、4つの列すべてが検索ツリーのトラバースに使用されることを意味します。

ただし、通常、すべての列に個別のインデックスを設定するのが最も効率的な方法ではありません。特にあなたの場合、4つのインデックスをマージするのに時間がかかることがあります。実際の実行はより高速になる可能性がありますが、インデックスの作成には1〜2秒かかる場合があります。

これらの列に複合インデックスを作成することをお勧めします。それらの順序が重要です。条件が等しいものを取得し、カーディナリティの順に並べます(カーディナリティが大きい方が最初になります)。最後の列は範囲クエリ(この場合はPublishedOn)になります。

例えば:

create index my_query_IDX on article (Deleted, _Temporary_Flag, _ComputedDeletedValue, PublishedOn)

私が提案するもう1つのことは、_Temporary_Flag、Deleted、_ComputedDeletedValue、_Publishedなどの列をNOTNULLDEFAULT'0'に変更することです。null許容列とnull値のインデックスは、nullでない列よりも効果が低く、key_lengthによると、これらの列はBOOLEANSまたはTINYINTです(ちなみに同じです)。

于 2012-10-31T10:47:47.210 に答える