sql - SQLite使用自动索引代替我自己的索引

标签 sql indexing sqlite pysqlite

我在UNIQUE表中有SQLite自动索引的问题。我已经创建了如下表。

c.execute('''CREATE TABLE user(
    id INTEGER PRIMARY KEY,
    email TEXT NOT NULL UNIQUE,
    password TEXT NOT NULL,
    name TEXT NOT NULL,
    );'''
)
c.execute('CREATE INDEX USR on user(email, password);')


但是当我使用解释查询计划进行检查时,SQLite使用了自身提供的自动索引。如何避免使用我自己的索引而不是自动索引?
我如何尝试:

c.execute('EXPLAIN QUERY PLAN SELECT id, name FROM social WHERE email = "a@a.com" AND password = 'password'')


结果是:

(0, 0, 0, 'SEARCH TABLE social USING INDEX sqlite_autoindex_user_1(email=?))

最佳答案

在您的情况下,我认为“ sqlite_autoindex_user_1”是SQLite用于实现对“电子邮件”的声明约束的索引。尽管有名称,它是一个内部索引,而不是自动索引。


不要将自动索引与内部索引混淆(具有
诸如“ sqlite_autoindex_table_N”之类的名称有时会创建为
实现PRIMARY KEY约束或UNIQUE约束。自动
此处描述的索引仅在单个查询期间存在,
永远不会持久化到磁盘,并且仅对单个数据库可见
连接。内部索引是PRIMARY实现的一部分
KEY和UNIQUE约束是持久的,并持久存在磁盘中,
并且对所有数据库连接可见。术语“自动索引”
出于传统原因出现在内部索引的名称中,并且确实
不表示内部索引和自动索引相关。


Source

查询优化器决定使用“电子邮件”上的索引最快。可能是对的。



若要查看SQLite如何使用覆盖索引“ medp”,请构建一个这样的测试表。

create table social_test (
  id integer primary key, 
  name text not null,    -- no UNIQUE constraint for testing
  tampil integer not null
);

create index medp on social (name, tampil);


如果需要,请插入一百万行。

analyze social;
explain query plan select * from social where name = 'facebook' and tampil = 6;
0|0|0|SEARCH TABLE social USING COVERING INDEX medp (name=? AND tampil=?)

关于sql - SQLite使用自动索引代替我自己的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35625812/

相关文章:

sql - 谁能解释一下数据库中的 "storing"和 "indexing"?

sqlite - 无法加载 DLL 'sqlite3' : The specified module could not be found.(HRESULT 异常:0x8007007E)

mysql - SQL - 在另一个表上查找至少两个不同/单独/不同的值

MySQL 表和查询优化

sql - transact sql 如何知道我在这个子查询中引用哪个表?

sql - 如何在 SQLite 中使用条件(如 if 语句等)

python - pandas 的错误/功能,其中按日期过滤的多索引数据框在提取日期索引级别时返回所有未过滤的日期

MySQL EXPLAIN 语句显示所有类型

sqlite - SVN - SQLite - 磁盘 I/O 错误

c++ - 非托管类的成员不能有 ref 类类型或接口(interface)类类型