我想开始说我不是数据库大师,但我对基础知识很不错。
我有一组IO数据,我存储在两个表中,这些表由'ioid'和'machinenum'唯一标识。
我有2个表:IOConfig唯一标识点(所有标识信息和主键:ConfigID)。以及包含这些项目样本的数据表。
下面的表格布局是使用主键+索引而不是仅使用索引进行测试,因此我知道存在重复数据。
想想IOConfig表:
ConfigId(PK) machineNum ioId ioType
将IOData表视为:
Timestamp ConfigId machineNum ioId value
如果我使用ConfigID主键,索引为(timestamp,ConfigId),我的查询是这样的:
select * from AnalogInput
where sampleTimestamp>=1520306916007000000 and sampleTimestamp<=1520351489939000000
and configId in (1112)
"0" "0" "0" "SEARCH TABLE IOData USING INDEX cfgIndexAnalogInput (configId=? AND sampleTimestamp>? AND sampleTimestamp<?)"
如果我避免使用ConfigID,则查询如下:
select * from AnalogInput
where sampleTimestamp>=1520306916007000000 and sampleTimestamp<=1520351489939000000
and ioId in (1)
and machineid=1111
"0" "0" "0" "SEARCH TABLE IOData USING INDEX tsIndexAnalogInput (sampleTimestamp>? AND sampleTimestamp<?)"
为什么我不能使用索引(timestamp,machineNum,ioid)获得第一个查询+第二个查询的索引(timestamp,configid)的改进?我问,因为machineNum和ioid用于定义创建configId主键的唯一点...所以人们会期望它们等同?
模式:
CREATE TABLE 'IOData'(
'sampleTimestamp' INTEGER,
'configId' INTEGER,
'machineId' INTEGER,
'ioId' INTEGER,
'value' REAL);
CREATE TABLE 'IOConfig'(
'sampleTimestamp' INTEGER,
'configId' INTEGER PRIMARY KEY,
'machineId' INTEGER,
'ioId' INTEGER,
'ioType' INTEGER);
CREATE INDEX `Something` ON `IOData` (`sampleTimestamp` ASC,`machineId` ASC,`ioId` ASC)
CREATE INDEX cfgIndexAnalogInput ON IOData(configId,sampleTimestamp)
CREATE INDEX tsIndexAnalogInput ON IOData(sampleTimestamp)
答案 0 :(得分:2)
阅读Query Planning以了解索引的工作方式,并The SQLite Query Optimizer Overview了解将应用哪些具体优化。
在这种情况下,sampleTimestamp
上的过滤器使用不等式比较,因此,根据section 1.0,它必须是索引中的最后一列(在显式索引中,或者在三个中 - 列主键):
CREATE INDEX SomethingBetter ON IOData(machineId, ioId, sampleTimestamp);