Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite3如何使用索引?_Sqlite_Indexing_Indices - Fatal编程技术网

SQLite3如何使用索引?

SQLite3如何使用索引?,sqlite,indexing,indices,Sqlite,Indexing,Indices,我正在研究SQLite3索引 这是一张桌子: 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 (

我正在研究SQLite3索引

这是一张桌子:

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的人,但我看到的人却低于50000

我也试着这样做:

SELECT * FROM COMPANY INDEXED BY salary_index;
然后我得到一个错误:没有查询解决方案 显然,我必须这样做: 从薪资>50000的按薪资指数索引的公司中选择*; 其中条件必须与索引中的条件相同


那么…如何使用索引呢?

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

索引对用户很有用

  • 在索引列上查找具有比较的记录:

    SELECT * FROM Company WHERE Salary = 20000.0;
    SELECT * FROM Company WHERE Salary BETWEEN 40000 AND 80000;
    
    它还包括索引列上的联接;及

  • 分类记录:

    SELECT * FROM Company ORDER BY Salary
    
    这也包括分组和不同的

有关详细信息,请参阅文档:


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

索引通常是衡量性能的工具。 如果没有字段的索引,那么对该字段的查询将需要对表进行完整的顺序扫描。如果表很小,但如果有上万行或以上的行,那么完整的顺序扫描就太慢了

因此,如果您想获得salary<50000的行,只需在表上创建一个索引,然后发出

SELECT * FROM COMPANY WHERE SALARY < 50000

字段的顺序很重要。此索引可用于具有关于薪资或薪资和年龄的WHERE子句的查询,但不包含薪资的年龄。也就是说,可以使用索引的任意数量的字段,只要它们在索引的前面是连续的,也就是说,在查询中,您可以省略结尾的字段,但不能省略开头或中间的字段

否,大多数数据库每个表只使用一个索引。在双索引示例中,数据库的查询优化器将选择使用哪个索引。此外,构建部分索引(并非所有数据库都支持它们)以匹配未来的查询也是不常见的。
salary
上的完整索引在作为部分索引响应您的查询时同样有用(并且能够满足部分索引无法满足的查询)。抱歉,我的评论错误。SQLite3支持多个索引,我的问题是关于SQLite3的。这是不正确的。SQLite将允许您创建多个索引(所有数据库都这样做),并允许您创建多列索引。但在查询中,它只会对每个表应用一个索引,用于对该表执行行筛选操作。您链接的文档(在基本层面上)解释了SQLite如何选择要使用的索引。选择最佳索引是一个复杂的问题,因为它不仅取决于索引的定义和查询的性质,还取决于索引的内容。具有1000个均匀分布值的索引优于仅具有2个值的索引,或者如果值分布不均匀,则具有1000个值的索引(除非搜索的是其中一个不常见的值)。数据库试图找到最佳索引,几乎在所有情况下都是成功的。如果您希望发出查询,包括
salary
index
的可优化表达式,并且需要这些查询尽可能快,那么维护复合索引是有意义的。否则,维护复合索引的开销将被浪费,没有产生好的效果。
CREATE INDEX salary_index WHERE salary < 50000;
CREATE INDEX age_index WHERE age < 40;
SELECT * FROM COMPANY WHERE salary < 50000 AND age < 40;
CREATE INDEX company_salary_age ON company (salary, age);