SQLite INDEXED BY 子句
SQLite INDEXED BY
关键字强制执行 SQL 语句时使用某个索引
虽然这个命令看起来非常有用,但现在不推荐,因为数据库的 SQL 分析引擎已经足够智能,它会自己判定用不用索引和使用哪个索引
语法
SQLite INDEXED BY
字句的语法如下,它可以与 DELETE、UPDATE 或 SELECT 语句一起使用
SELECT|DELETE|UPDATE column1, column2... INDEXED BY (index_name) table_name WHERE (CONDITION);
index-name
是需要使用的索引名
如果索引名 index-name
不存在或不能用于查询,SQLite 语句会返回失败
NOT INDEXED
与 INDEXED BY
对应的还有一个 NOT INDEXED
NOT INDEXED
子句规定当访问前面的表 ( 包括由 UNIQUE 和 PRIMARY KEY 约束创建的隐式索引) 时,没有使用索引
范例
先运行下面的 SQLite SQL 语句创建测试数据
DROP TABLE tbl_employee; CREATE TABLE tbl_employee ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name CHAR(64) NOT NULL, age INTEGER NOT NULL, city CHAR(64), salary REAL ); INSERT INTO tbl_employee (name,age,city,salary) VALUES ('张三', 25, 'pek', 102400.00 ), ('李四', 18, 'shanghai', 88888.00 ), ('王五', 22, 'hangzhou', 22000.00 ), ('孙六', 32, 'pek', 32000.00 ), ('钱七', 25, 'shanghai', 25000.00 ), ('赵二', 45, 'pek', 45800.00 ), ('冯九', 37, 'chengdu', 15000.00 );
然后使用下面的 SQL 语句在 salary
字段上创建一个索引 salary
CREATE INDEX isalary ON tbl_employee(salary);
现在就可以使用 INDEXED BY
子句强制使用 isalary
索引了
SELECT * FROM tbl_employee INDEXED BY isalary WHERE salary > 5000;
输出结果如下
id name age city salary ---------- ---------- ---------- ---------- ---------- 7 冯九 37 chengdu 15000.0 3 王五 22 hangzhou 22000.0 5 钱七 25 shanghai 25000.0 4 孙六 32 pek 32000.0 6 赵二 45 pek 45800.0 2 李四 18 shanghai 88888.0 1 张三 25 pek 102400.0
我们可以使用 explain 关键字 来分析一下我们的查询
EXPLAIN QUERY PLAN SELECT * FROM tbl_employee INDEXED BY isalary WHERE salary > 5000;
可以从数据结果中看到有一列 detail
,如下
detail -------------------------------------------- SEARCH TABLE tbl_employee USING INDEX isalary (salary>?)
USING INDEX isalary
就表示使用了 isalary
索引
注意
为什么我们不推荐使用 INDEXED BY
,因为我们不它,SQLite
引擎也会使用 isalary
索引
不信的话可以运行下面的语句
EXPLAIN QUERY PLAN SELECT * FROM tbl_employee WHERE salary > 5000;
可以看到 detail
字段和上面的一模一样
detail -------------------------------------------- SEARCH TABLE tbl_employee USING INDEX isalary (salary>?)
```