Mysql 共享主键同一列的键概念

标签 mysql primary-key

如下代码,我将chat_id和student_id设置为主键,以便为另一个student_id添加相同的聊天。当它投入生产时,记录会很多。我是否应该仅为 Student_id 添加一个索引,以便每个用户返回屏幕查看最近消息时的搜索速度更快?

CREATE TABLE `tim_chat_recipients` (
`chat_id` INT(11) NOT NULL,
`student_id` INT(11) NOT NULL,
`message_status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '1:New, 2:Read, 3:Deleted',
PRIMARY KEY (`chat_id`, `student_id`))COLLATE='latin1_swedish_ci' ENGINE=InnoDB;

最佳答案

如果代码要搜索 student_id 没有 chat_id,则索引至少超过 student_id必需的,否则查询将导致不可扩展的表/集群扫描..这是因为隐式集群/索引 (chat_id ,student_id) 不能在没有提供chat_id的情况下用于索引/归约。

此二级索引 - INDEX(student_id, [可选其他列]) - 可能包含其他列,作为索引的一部分或包含,尽管“适当的选择” “很大程度上取决于查询。在这种情况下,包含 message_status 列可能是有意义的,以便能够使用“未看到的消息”作为具有最小读取 IO 的过滤器,因为它可以避免探测回表/集群。 (索引是关于平衡维护/磁盘成本和查询 yield 。)

简而言之:查询规划器在 SARGABLE query 中选择索引,索引的左侧部分必须已知并在 WHERE 或有时在 JOIN .. ON 子句中提及。

关于Mysql 共享主键同一列的键概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040084/

相关文章:

php - 需要插入表 "doctors"(id 是自动增量)。不知道查询出了什么问题。我收到错误 -"webpage not available "。帮助解决它

java - 使用复合主键更新 JPA 实体会导致重复输入错误

.net-core - .Net Core 自动生成字符串主键

mysql - 如何给主键添加前缀?

同时具有主键和唯一键约束的 MySQL 表

php - 显示数据库中的类别

php - 使用 WordPress 中的变量批量编辑已发布的帖子

mysql - 在数据库中存储位置数据

php - 2个不同表的SQL查询

php - 重新排列主键