如下代码,我将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/