如何为更快的联接创建SQL索引?
我有以下查询不带where子句,用于获取所有员工及其订单的列表:如何为更快的联接创建SQL索引?,sql,sqlite,indexing,android-sqlite,Sql,Sqlite,Indexing,Android Sqlite,我有以下查询不带where子句,用于获取所有员工及其订单的列表: SELECT LastName, FirstName, OrderID, OrderDate FROM Employees inner JOIN Orders ON Employees.ID = Order.EmployeeID 我可以定义两个索引:1)在Employees.ID列上,以及2)在Order.EmployeeID列上。如果我只想有一个索引,我应该为更快的连接定义哪一个 我正在使用SQLite for Andro
SELECT LastName, FirstName, OrderID, OrderDate
FROM Employees inner JOIN Orders
ON Employees.ID = Order.EmployeeID
我可以定义两个索引:1)在Employees.ID列上,以及2)在Order.EmployeeID列上。如果我只想有一个索引,我应该为更快的连接定义哪一个
我正在使用SQLite for Android您的查询遗漏了很多细节,例如表的大小和结构。然而,根据实体的名称,我可以推测一些细节
首先,在SQLite中,每个表都有一个主键。您应该通过在每个表上定义主键来利用这一点
假设Employees.ID
是Employees
上主键的候选项(即,值是唯一的),则应将其定义为主键。这就像一个索引
使用这种结构,引擎应该通过读取订单
表并在员工
表中查找值来处理查询。假设Orders
表大于Employees
,我认为这将是满足查询的最有效方法
换句话说,只需确保Employees.ID
是主键
编辑:
你需要阅读两个表格。基本上有三种选择。您可以对两个表进行排序,然后合并它们。这很昂贵,因为排序很昂贵
您可以按顺序读取任一表,并在另一个表中查找值。顺序读取表比随机读取(通过索引查找)更快。在较大的表(可能是orders
)上进行顺序读取,在较小的表(可能是employees
)上进行索引查找,速度更快
如果orders
表很宽(很多列),那么orders(id,orderdate)
上的索引可能是一种改进。这是一个“覆盖”索引,因此不需要访问原始数据。除了主键EmployeeID
EmployeeID
之外,添加另一个索引顺序不是更好吗。假设id
是一个整数字段,则您有一个整数主键,并且声明会自动创建索引。我明白了。现在我的问题是在外键上添加另一个索引。在外键Order.EmployeeID
上添加另一个索引是一个好主意吗?@breceivemail。可能不会。您希望尽可能便宜地执行完整表扫描。这是一个完整的表扫描,而不是像索引那样使用随机读取。