-- =============================================================================
-- 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：已有合适索引
-- =============================================================================
