首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下面的指数是好的吗?

问下面的指数是好的吗?
EN

Database Administration用户
提问于 2020-07-27 10:54:45
回答 1查看 44关注 0票数 0

以下查询的适当索引计划是什么?

查询1:

代码语言:javascript
复制
select id 
from room_participants 
where roomId=1 
  and userId=1 
  and status=1 
  and isMuted=0

查询2:

代码语言:javascript
复制
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相同的列吗?

代码语言:javascript
复制
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;

请给我带路。谢谢。

EN

回答 1

Database Administration用户

发布于 2020-07-28 05:55:38

这两种查询的最佳选择如下:

代码语言:javascript
复制
INDEX(roomId, status,   -- first, in either order
      userId,           -- 3rd
      isMuted)

备注:

  • 在InnoDB中,PRIMARY KEY被附加到每个二级索引的末尾(这样它就可以到达记录)。
  • 所有5列(包括id)都在该索引中,因此它是第一个查询的“覆盖”。
  • 在这两个查询中,WHERE子句中的测试完全由前几列处理。
  • 在第二个查询中,userId is available, so the index is covering for that query, too. (The extra is `并不有害。)
  • 我假设id是b的PK,所以这也是最优的。
  • 如果添加我的索引,请删除combine4。(左侧完全匹配。)
  • 更多:http://mysql.rjweb.org/doc.php/index_烹饪书_mysql
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/271712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档