我有一个拥有大约一百万个条目的员工的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
我做错了什么?
答案 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';
为每个查询执行此操作将浪费大量存储空间。