数据库索引与主键

时间:2018-03-06 17:46:56

标签: database sqlite indexing

我想开始说我不是数据库大师,但我对基础知识很不错。

我有一组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)

1 个答案:

答案 0 :(得分:2)

阅读Query Planning以了解索引的工作方式,并The SQLite Query Optimizer Overview了解将应用哪些具体优化。

在这种情况下,sampleTimestamp上的过滤器使用不等式比较,因此,根据section 1.0,它必须是索引中的最后一列(在显式索引中,或者在三个中 - 列主键):

CREATE INDEX SomethingBetter ON IOData(machineId, ioId, sampleTimestamp);