gpt4 book ai didi

mysql - 如果哪里不包括主键组合的所有列,mysql超时?怎么了?

转载 作者:行者123 更新时间:2023-11-29 13:48:24 24 4
gpt4 key购买 nike

显示创建表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

有什么问题吗?

最佳答案

来自MySQL doc :“如果列不是从索引的最左边前缀开始,MySQL 就无法使用索引来执行查找。”

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

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

然后

其中 col1 = x AND col2 = y 并且其中 col1 = x AND col2 = y AND col3 = z

将使用索引,但是

其中 col2 = x 且 col3 = y

不会。

这是因为索引是通过连接列值创建的,因此如果 col1=x、col2=y 和 col3=z,则索引值将为 x-y-z。在最后一个 WHERE 子句中,MySQL 无法查看索引,因为未使用索引的第一个(最左边)部分。

在您的情况下,使用 (MeterID,DeviceID) 或 (MeterID,DeviceID,TimeStamp) 在 WHERE 子句中将导致索引搜索,但是例如(DeviceID,TimeStamp) 或 (DeviceID) 或 (TimeStamp) 将导致表扫描。

关于mysql - 如果哪里不包括主键组合的所有列,mysql超时?怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17088020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com