代码之家  ›  专栏  ›  技术社区  ›  Phil Hannent

如何分析SQLite查询执行?

  •  22
  • Phil Hannent  · 技术社区  · 17 年前

    我有一个sqlite数据库,我想检查索引是否正确。MS SQL Analyzer非常擅长分解查询执行并使用索引。

    sqlite是否有类似的工具?

    3 回复  |  直到 14 年前
        1
  •  14
  •   David Crawshaw    17 年前

    我不知道有什么漂亮的图形工具,但是你所寻找的所有信息都可以从 EXPLAIN 关键字。

    考虑此数据库:

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

    谓词为的查询 email 不使用索引:

    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|
    

    而基于名称的查询将使用 user_names 索引:

    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|
    

    使用 解释 是否需要使用sqlite的虚拟机vdbe:

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

    但这并不像看上去那么难,并为您提供了关于您的查询的完整故事。

        2
  •  19
  •   Chris    15 年前

    正如奥蒂斯所说:

    EXPLAIN QUERY PLAN SELECT * FROM FOO
    

    如果像我一样,你只是使用它来确保你达到了索引(索引),那么这个技巧是否具有更可读的输出?