我有以下查询没有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
答案 0 :(得分:2)
您的查询遗漏了很多细节,例如表格的大小和结构。但是,根据实体的名称,我可以推测一些细节。
首先,在SQLite中,每个表都有一个主键。您应该通过在每个表上定义主键来利用这一点。
假设Employees.ID
是Employees
上主键的候选者(即值是唯一的),则应将其定义为主键。这就像一个索引。
使用此结构,引擎应通过读取Orders
表并查找Employees
表中的值来处理查询。假设Orders
表大于Employees
,我认为这将是满足查询的最有效方法。
换句话说,只需确保Employees.ID
是主键。
编辑:
您需要阅读这两个表格。基本上有三种选择。您可以对两个表进行排序,然后合并它们。这很昂贵,因为分拣很昂贵。
您可以按顺序读取任一表,也可以在另一个表中查找值。顺序读取表比进行随机读取(通过索引查找)更快。在较大的表上执行顺序读取的速度更快,大概是orders
,在较小的表上使用索引查找,大概是employees
。
如果orders
表非常宽(很多列),那么orders(id, orderdate)
上的索引可能会有所改进。这是一个“覆盖”索引,因此不需要访问原始数据。