0

SHOW CREATE TABLE Meter_data 返回 -

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

它出什么问题了?

4

1 回答 1

1

来自MySQL 文档:“如果列没有从索引的最左侧前缀开始,MySQL 就不能使用索引来执行查找。”

问题不在于不是复合键的所有部分都包含在 WHERE 子句中,而是列不是从最左边的索引列开始时。

例如,如果你有 index(col1, col2, col3) 在这种情况下最左边的索引列是 col1,

然后

WHERE col1 = x AND col2 = yWHERE 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) 将导致表扫描。

于 2013-06-13T13:35:34.630 回答