如何为更快的连接创建SQL索引?

时间:2013-09-07 12:06:31

标签: sql sqlite indexing android-sqlite

我有以下查询没有where子句,以获取所有员工及其订单的列表:

SELECT LastName, FirstName, OrderID, OrderDate
FROM Employees inner JOIN Orders 
 ON Employees.ID = Order.EmployeeID

我可以在列Employees.ID上定义两个索引: 1),在列Order.EmployeeID上定义 2)。如果我想只有一个索引,我应该为快速连接定义哪个索引?

我正在使用SQLite for Android

1 个答案:

答案 0 :(得分:2)

您的查询遗漏了很多细节,例如表格的大小和结构。但是,根据实体的名称,我可以推测一些细节。

首先,在SQLite中,每个表都有一个主键。您应该通过在每个表上定义主键来利用这一点。

假设Employees.IDEmployees上主键的候选者(即值是唯一的),则应将其定义为主键。这就像一个索引。

使用此结构,引擎应通过读取Orders表并查找Employees表中的值来处理查询。假设Orders表大于Employees,我认为这将是满足查询的最有效方法。

换句话说,只需确保Employees.ID是主键。

编辑:

您需要阅读这两个表格。基本上有三种选择。您可以对两个表进行排序,然后合并它们。这很昂贵,因为分拣很昂贵。

您可以按顺序读取任一表,也可以在另一个表中查找值。顺序读取表比进行随机读取(通过索引查找)更快。在较大的表上执行顺序读取的速度更快,大概是orders,在较小的表上使用索引查找,大概是employees

如果orders表非常宽(很多列),那么orders(id, orderdate)上的索引可能会有所改进。这是一个“覆盖”索引,因此不需要访问原始数据。