我在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/