SHOW CREATE TABLE meter_data returns -
CREATE TABLE `meter_data` (
`DeviceID` varchar(45) NOT NULL,
`MeterID` int(11) NOT NULL,
`TimeStamp` int(11) NOT NULL,
`W` float NOT NULL,
`F` float NOT NULL,
`PF1` float NOT NULL,
`V1` float NOT NULL,
`A1` float NOT NULL,
`PF2` float NOT NULL,
`A2` float NOT NULL,
`PF3` float NOT NULL,
`A3` float NOT NULL,
`FwdHr` float NOT NULL,
PRIMARY KEY (`DeviceID`,`MeterID`,`TimeStamp`),
KEY `MeterID` (`MeterID`,`DeviceID`,`TimeStamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
怎么了?
From MySQL doc: "如果列不是从索引最左边的前缀开始,MySQL不能使用索引执行查找。"
问题不在于WHERE子句中包含组合键的不是所有部分,而在于列不是从最左边的索引列开始。
。如果您有索引(col1, col2, col3),在这种情况下最左边的索引列是col1,
然后 WHERE col1 = x AND col2 = y
和WHERE col1 = x AND col2 = y AND col3 = z
将使用索引,但是
WHERE col2 = x AND col3 = y
不会。
这是因为索引是通过连接列值创建的,所以如果col1=x, col2=y和col3=z,那么索引值将是x-y-z
。在最后一个WHERE子句中,MySQL不能查看索引,因为索引的第一部分(最左边)没有被使用。
在您的例子中,在WHERE子句中使用(MeterID
, DeviceID
)或(MeterID
, DeviceID
, TimeStamp
)将导致索引搜索,但例如(DeviceID
, TimeStamp
)或(DeviceID
)或(TimeStamp
)将导致表扫描。