-- ============================================================================= -- EAI MySQL 建议索引(结合 Mapper / 服务层查询,与 eai 库结构一致) -- 执行前请:1) 在从库或备份后执行 2) 用 SHOW INDEX / EXPLAIN 确认与线上一致 -- 若报 Duplicate key / 索引名已存在,则跳过该条 -- MySQL 8.0+ InnoDB -- ============================================================================= USE eai; -- --------------------------------------------------------------------------- -- 1) assignment -- 依据:AssignmentMapper selectByCourseId + ORDER BY create_time DESC -- 仅 idx_course_id 时常见 Using filesort;联合索引可兼顾过滤与排序 -- --------------------------------------------------------------------------- -- 若线上已有单列 idx_course_id 且会保留本联合索引,可视 EXPLAIN 结果再决定是否删除单列 CREATE INDEX idx_assignment_course_create_time ON assignment (course_id, create_time); -- 门户/教师维度按 teacher_portal_id 拉作业(若业务有此类查询,且列非空时选择性更好) -- CREATE INDEX idx_assignment_teacher_portal_id ON assignment (teacher_portal_id); -- --------------------------------------------------------------------------- -- 2) course_student -- 依据:CourseStudentMapper:按 course_id 拉人、按 student_id 拉课、dropCourse 等值双条件 -- 原 eai.sql 无二级索引 -- --------------------------------------------------------------------------- CREATE INDEX idx_course_student_course_id ON course_student (course_id); CREATE INDEX idx_course_student_student_id ON course_student (student_id); -- 若需强制「同一学生同一课一条」且已清洗完重复数据,可再考虑: -- ALTER TABLE course_student ADD CONSTRAINT uk_cs UNIQUE (course_id, student_id); -- --------------------------------------------------------------------------- -- 3) users -- 依据:UserMapper selectByOfficialNumber / Phone / OfficialEmail、selectNameByPid、 -- IN (official_number)、登录态 id 等 -- 原 eai.sql 无二级索引 -- --------------------------------------------------------------------------- CREATE INDEX idx_users_official_number ON users (official_number); CREATE INDEX idx_users_pid ON users (pid); CREATE INDEX idx_users_phone ON users (phone); CREATE INDEX idx_users_official_email ON users (official_email); -- --------------------------------------------------------------------------- -- 4) ai_speaking_assignment -- 依据:按 assignment_id 反查口语任务扩展信息 -- --------------------------------------------------------------------------- CREATE INDEX idx_ai_speaking_assignment_fk ON ai_speaking_assignment (assignment_id); -- --------------------------------------------------------------------------- -- 5) student_window_switch_record -- 依据:WindowSwitchRecordMapper:WHERE assignment_id = ?(且 GROUP BY 学生); -- 现有多为 (student_id, assignment_id) 时,无法很好支持仅 assignment 过滤 -- 注意:表需在库中存在、列名与下划线一致(与 MyBatis-Plus 默认驼峰一致) -- --------------------------------------------------------------------------- CREATE INDEX idx_window_switch_assignment_student ON student_window_switch_record (assignment_id, student_id); -- 若上表已有 idx_student_assignment(student_id, assignment_id) 可保留,两者用途不同、可并存 -- --------------------------------------------------------------------------- -- 6) 可选清理:与唯一约束重复的二级索引(减少写入与空间) -- --------------------------------------------------------------------------- -- phone_verification 上若已有 UNIQUE(phone),则普通索引 verification_phone_index 可删: -- ALTER TABLE phone_verification DROP INDEX verification_phone_index; -- course 上 idx_time_range 与 idx_course_time_range 若列完全一致,保留一个即可: -- ALTER TABLE course DROP INDEX idx_course_time_range; -- 或 DROP INDEX idx_course_time_range 保留 idx_course_time_range 其一 -- ============================================================================= -- 已在 eai.sql 中覆盖较好、一般无需再补(仅作说明) -- - student_assignment:uk(assignment_id, student_id) + idx(student_id, assignment_id) -- - evaluation / overall_evaluation / sentence_evaluation:唯一键与 idx_student_assignment -- - student_assignment_history:uk 与 idx(assignment, student, submit_time) -- - translations、sign_*、class:已有合适索引 -- =============================================================================