Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为更快的联接创建SQL索引?_Sql_Sqlite_Indexing_Android Sqlite - Fatal编程技术网

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

如何为更快的联接创建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

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

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。可能不会。您希望尽可能便宜地执行完整表扫描。这是一个完整的表扫描,而不是像索引那样使用随机读取。