SQLITE:如何使索引工作适合您?

时间:2016-01-07 06:58:28

标签: sql sqlite indexing query-optimization

我有一个拥有大约一百万个条目的员工的sqlite数据库。

company:

emp_id(primary) | first_name | last_name | company_name | job_title

数据库只包含10个不同的公司名称(即让我们说每个公司有大约10万名员工) 我在公司名称上创建了一个索引:

CREATE INDEX cmp_name ON company(company_name)

但我在执行查询时没有获得任何速度:

WITH INDEX:

select * from company INDEXED BY cmp_name where company_name = 'XYZ corp';
Time: 88.45 sec

没有索引:

select * from company where company_name = 'XYZ corp';
Time: 89.12 sec

我做错了什么?

1 个答案:

答案 0 :(得分:3)

数据库组织成页面。如果页面中有超过十行,那么平均而言,读取所有“XYZ Corp”行仍然需要读取大多数页面。此外,由于索引条目与表行的顺序不同,因此不再按顺序读取表格的页面。

加快此查询的唯一方法是使用covering index。首先,将读取的列数减少到实际需要的绝对最小值,然后将所有这些列添加到公司名称索引中(INTEGER PRIMARY KEY列隐含地是每个索引的一部分):

CREATE INDEX cmp_name_and_other_stuff ON company(company_name, last_name);

SELECT emp_id, last_name FROM company WHERE company_name = 'XYZ Corp';

为每个查询执行此操作将浪费大量存储空间。