以下查询的适当索引计划是什么?
查询1:
select id
from room_participants
where roomId=1
and userId=1
and status=1
and isMuted=0查询2:
select group_concat(b.phone)
from room_participants as a
left join users as b on b.id=a.userId
where a.roomId = 1
and a.status = 1按照下面的例子,做索引是一种明智的方法吗?这就是我们所称的冗余索引,因为索引combine3与索引combine4具有相同的列,索引combine2具有与索引combine1相同的列吗?
CREATE TABLE `room_participants` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`roomId` int(11) NOT NULL,
`userId` int(11) NOT NULL,
`isAdmin` tinyint(1) DEFAULT '0',
`isMuted` tinyint(1) NOT NULL DEFAULT '0',
`joinTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`leftTime` timestamp NULL DEFAULT NULL,
`kickTime` timestamp NULL DEFAULT NULL,
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1=join, 2=kicked, 3=left',
PRIMARY KEY (`id`),
KEY `userId` (`userId`),
KEY `combine2` (`isAdmin`,`userId`,`joinTime`,`leftTime`,`kickTime`,`status`),
KEY `combine1` (`kickTime`,`userId`),
KEY `combine3` (`roomId`,`userId`,`status`,`isMuted`),
KEY `combine4` (`roomId`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=567 DEFAULT CHARSET=latin1;请给我带路。谢谢。
发布于 2020-07-28 05:55:38
这两种查询的最佳选择如下:
INDEX(roomId, status, -- first, in either order
userId, -- 3rd
isMuted)备注:
PRIMARY KEY被附加到每个二级索引的末尾(这样它就可以到达记录)。id)都在该索引中,因此它是第一个查询的“覆盖”。WHERE子句中的测试完全由前几列处理。userId is available, so the index is covering for that query, too. (The extra is `并不有害。)id是b的PK,所以这也是最优的。combine4。(左侧完全匹配。)https://dba.stackexchange.com/questions/271712
复制相似问题