SQLite3如何使用索引?

时间:2014-05-09 19:18:45

标签: sqlite indexing indices

我正在研究SQLite3索引。

这是一张桌子COMAPNY:

CREATE TABLE COMPANY(
ID INT PRIMARY KEY     NOT NULL,
NAME           TEXT    NOT NULL,
AGE            INT     NOT NULL,
ADDRESS        CHAR(50),
SALARY         REAL
);

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'David', 27, 'Texas', 85000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );

INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );

=============================================== ======

SELECT * FROM COMPANY;

结果:

1|Paul|32|California|20000.0
2|Allen|25|Texas|15000.0
3|Teddy|23|Norway|20000.0
4|Mark|25|Rich-Mond |65000.0
5|David|27|Texas|85000.0
6|Kim|22|South-Hall|45000.0
7|James|24|Houston|10000.0

让我们创建一个索引salary_index,

CREATE INDEX IF NOT EXISTS salary_index on COMPANY (SALARY);

它做什么以及如何使用它?

这次我在删除旧版之后制作了这样的索引:

CREATE INDEX IF NOT EXISTS salary_index on COMPANY (SALARY) 
WHERE SALARY > 50000;

添加索引后,我做了:

SELECT * FROM COMPANY;

期待我只看到薪水高于50000的人,但我看到的人低于这个。

我也尝试过这样做:

SELECT * FROM COMPANY INDEXED BY salary_index;

然后我得到错误:没有查询解决方案 显然我必须这样做: SELECT * FROM COMPANY INDEXED BY salary_index WHERE SALARY> 50000; 条件必须与索引中的条件相同。

那么......我如何使用指数?

2 个答案:

答案 0 :(得分:6)

索引永远不会改变查询的含义。 他们能做的是加快你的一些疑问;如果可能,它们会自动使用。

索引对

很有用
  • 通过对索引列进行比较来查找记录:

    SELECT * FROM Company WHERE Salary = 20000.0;
    SELECT * FROM Company WHERE Salary BETWEEN 40000 AND 80000;
    

    还包括索引列的连接;以及

  • 排序记录:

    SELECT * FROM Company ORDER BY Salary
    

    还包括GROUP BY和DISTINCT。

有关详细信息,请参阅文档:
Query Planning
The SQLite Query Planner

答案 1 :(得分:2)

以下是我与其中一位代码大师的对话(谢谢S.P。):

索引通常是性能的工具。 如果您没有字段的索引,则对该字段的查询将需要对该表执行完整的顺序扫描。如果表很小但是如果你有数万或更多的行,那么这不是问题,那么完整的顺序扫描就太慢了。

所以如果你想得到薪水< 50000,只需在表上创建一个索引,然后发出

SELECT * FROM COMPANY WHERE SALARY < 50000

只要索引SALARY字段

,它就会自动使用正确的索引

所以如果我们有两个索引,比如

CREATE INDEX salary_index WHERE salary < 50000;
CREATE INDEX age_index WHERE age < 40;

然后我们运行像

这样的查询
SELECT * FROM COMPANY WHERE salary < 50000 AND age < 40;

自动使用上述2个索引进行查询。

在大多数RDBMS中,可以在单个查询中使用多个索引,是的,如果它们适用,它们会自动使用。但是可能存在限制,并且它们具有特定的RBDMS。但更好的想法是创建一个包含多个字段的索引。

在最佳情况下,您将在单个索引中拥有查询所需的所有字段 因此,如果您希望员工的收入超过5万美元且年龄小于40岁 你会定义一个像这样的索引:

CREATE INDEX company_salary_age ON company (salary, age);

字段的顺序很重要。此索引可用于对工资或工资和年龄而非年龄没有工资的WHERE子句的查询中。也就是说,只要它们在索引的前面是连续的,就可以使用索引的任意数量的字段。也就是说,查询中的可以省略结尾的字段,但不能在开头或中间省略< /强>