2009-09-21 14 views

答えて

14

わかりやすいグラフィカルなツールはありませんが、私が探している情報はすべてEXPLAINというキーワードから入手できます。

 
sqlite> explain select * from users where name='foo'; 
0|Trace|0|0|0||00| 
1|String8|0|1|0|foo|00| 
2|Goto|0|18|0||00| 
3|OpenRead|0|2|0|2|00| 
4|OpenRead|1|3|0|keyinfo(1,BINARY)|00| 
5|IsNull|1|15|0||00| 
6|Affinity|1|1|0|bb|00| 
7|SeekGe|1|15|1|1|00| 
8|IdxGE|1|15|1|1|01| 
9|IdxRowid|1|2|0||00| 
10|Seek|0|2|0||00| 
11|Column|1|0|3||00| 
12|Column|0|1|4||00| 
13|ResultRow|3|2|0||00| 
14|Next|1|8|0||00| 
15|Close|0|0|0||00| 
16|Close|1|0|0||00| 
17|Halt|0|0|0||00| 
18|Transaction|0|0|0||00| 
19|VerifyCookie|0|5|0||00| 
20|TableLock|0|2|0|users|00| 
21|Goto|0|3|0||00| 
:名前を前提とクエリが user_namesインデックスを使用しますに対し

 
sqlite> explain select * from users where email='foo'; 
0|Trace|0|0|0||00| 
1|String8|0|1|0|foo|00| 
2|Goto|0|13|0||00| 
3|OpenRead|0|2|0|2|00| 
4|Rewind|0|11|0||00| 
5|Column|0|1|2||00| 
6|Ne|1|10|2|collseq(BINARY)|6a| 
7|Column|0|0|4||00| 
8|Column|0|1|5||00| 
9|ResultRow|4|2|0||00| 
10|Next|0|5|0||01| 
11|Close|0|0|0||00| 
12|Halt|0|0|0||00| 
13|Transaction|0|0|0||00| 
14|VerifyCookie|0|5|0||00| 
15|TableLock|0|2|0|users|00| 
16|Goto|0|3|0||00| 

 
sqlite> create table users (name, email); 
sqlite> create index user_names on users (name); 

emailを前提クエリがインデックスを使用しません。

は、このデータベースを考えてみましょう

EXPLAINを使用する場合はSQLiteのの仮想マシン、VDBEでグリップに来る:

http://www.sqlite.org/vdbe.html

しかし、これは、ハード、それは見た目ほどではない、とあなたのクエリについての完全な物語を提供します。

+28

'QUERY PLAN'は、VMの指示なしに、インデックスの使用に関する情報を提供しますEXPLAIN。 – outis

+1

コマンドラインで.explainオプションを有効にすることで、出力形式を改善することもできます。 ".explain ON | OFF EXPLAINに適した出力モードをオンまたはオフにします。 – Wade

+0

上記のリンクは古くなっていますので、ここで仮想マシンに関する情報をご覧ください:http://www.sqlite.org/opcode.html – Fabian

17

outisが言ったように:(?インデックス)あなたは、単にあなたがインデックスにヒットしていることを確認するためにそれを使用している私のような場合

EXPLAIN QUERY PLAN SELECT * FROM FOO 

は、より読みやすい出力でトリックをい

+1

このコマンドの出力についての良い説明は、https://www.sqliteです。 .org/eqp.html – JoshB

関連する問題