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>?)

```

SQLite 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.