2016-10-06 3 views
1

テーブルは、約20Kの行があり、作成し、次のコード:テーブルがインデックスされていても、クエリが1000行をチェックしているのはなぜですか?

CREATE TABLE `inventory` (
     `ID` int(11) NOT NULL AUTO_INCREMENT, 
     `TID` int(11) DEFAULT NULL, 
     `RID` int(11) DEFAULT NULL, 
     `CID` int(11) DEFAULT NULL, 
     `value` text COLLATE utf8_unicode_ci, 
     PRIMARY KEY (`ID`), 
     KEY `index_TID_CID_value` (`TID`,`CID`,`value`(25)) 
    ); 

、これは、約13K説明クエリ

mysql> explain select rowID from inventory where TID=4 and CID=28 and value=3290843588097; 
+----+-------------+------------+------+------------------------+-----------------------+---------+-------------+------+-------------+ 
| id | select_type | table  | type | possible_keys   | key     | key_len | ref   | rows | Extra  | 
+----+-------------+------------+------+------------------------+-----------------------+---------+-------------+------+-------------+ 
| 1 | SIMPLE  | inventory | ref | index_TID_CID_value | index_TID_CID_value | 10  | const,const | 9181 | Using where | 
+----+-------------+------------+------+------------------------+-----------------------+---------+-------------+------+-------------+ 
1 row in set (0.00 sec) 

TID = 4およびCID = 28の組み合わせの結果を有しています表の行。

私の質問は以下のとおりです。

  1. 理由を説明する結果が周り9K行が は、最終的な結果を得るために検討されることを私に言っていますか?

  2. なぜカラムrefのみconst,const 3以降の列は、複数列インデックスに含まれて表示されているがrefconst,const,constすべきではありませんか?

アップデート2016年10月7日

問合せ:

select rowID from inventory where TID=4 and CID=28 and value=3290843588097; 

私はそれを約10回を走り、最後の5つの時間を要した(彼らは同じであった)

  • インデックスなし - 0.02秒
  • 指数(TID、CID) - 0.03秒
  • 指数(TID、CID、値) - 0.00秒

また同じクエリが今日異なって見える説明、か??キーlenが88に変更され、照会がconst,const,constに変更され、検査する行が2に縮小されていることに注意してください。

mysql> explain select rowID from inventory where TID=4 and CID=28 and value='3290843588097'; 
+----+-------------+-----------+------+----------------------+---------------------+---------+-------------------+------+-------------+ 
| id | select_type | table  | type | possible_keys  | key     | key_len | ref    | rows | Extra  | 
+----+-------------+-----------+------+----------------------+---------------------+---------+-------------------+------+-------------+ 
| 1 | SIMPLE  | inventory | ref | index_TID_CID_value | index_TID_CID_value | 88  | const,const,const | 2 | Using where | 
+----+-------------+-----------+------+----------------------+---------------------+---------+-------------------+------+-------------+ 
1 row in set (0.04 sec) 
+0

テーブルにTID、CID、valueの組み合わせがいくつありますか? – Mackers

+1

imo、そのクエリのインデックスを使用する点はあまりありません。ただ1つのテーブルをスキャンするほうが速くなりますか?あなたは 'mysql analyze table' - https://dev.mysql.com/doc/refman/5.5/en/analyze-table.htmlを使っていますか?つまり、それらのインデックスはどのように選択的ですか? –

+0

@Mackers 1の組み合わせ –

答えて

0

質問に明示的に回答する。

  1. 説明計画は〜あなたに起因するエンジンがあなたのWHERE句の条件に一致する行IDを見つけるために、インデックスツリーを検索する必要があるという事実のために照会9K行を与えています。索引は、索引列値の可能な各組み合わせの、その組合せに関連付けられた行IDのリストへのマッピングを生成します。事実、エンジンはこれらの組み合わせを検索して正しいものを見つけます。これは組み合わせを走査することによって行われ、したがって〜9kの量が走査される。

  2. where節の条件に3つのインデックス列がすべて含まれているため、エンジンは最初の2つの列のインデックスを利用して検索を最適化してから3番目の列を短絡し、組み合わせ。

具体的な使用例では、検索のパフォーマンスを最適化したいと考えています。 TIDとCID(値ではない)にインデックスを作成することをお勧めします。これは、現在、〜20k個のレコードのうち、これらの値の組み合わせが2つしかないためです。つまり、わずか2列のインデックスを使用すると、エンジンは3つの値すべてを検索するときにレコードの半分をほぼ即座に切り捨てることができます。 (これはすべて、このインデックスがより大きなデータセットを持つテーブルに適用されることを前提としています)。メトリックは小さいデータセットに基づいているため、インデックスを使用する場合と使用しない場合のパフォーマンスの差の大きさの順序は見えない場合があります。

+0

インデックスを使用するために100K行が大きなデータセットと見なされますか? –

+0

インデックスに3列すべてを含めると、時間がかからず、新しいテスト用の更新された質問が表示されますが、TIDとCIDだけをインデックスする必要があると感じていますか? –

関連する問題