Forráskód Böngészése

请求超时时间 20s

jinxia.mo 1 hónapja
szülő
commit
05a86fe73c

+ 2 - 1
back-ui/src/api/learn/student.js

@@ -48,6 +48,7 @@ export function statisticStudyRecord(query) {
   return request({
     url: '/learn/student/statisticStudyRecord',
     method: 'get',
-    params: query
+    params: query,
+    timeout: 20000  // 设置超时时间为20秒
   })
 }

+ 1 - 1
back-ui/src/utils/request.js

@@ -17,7 +17,7 @@ const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: import.meta.env.VITE_APP_BASE_API,
   // 超时
-  timeout: 10000
+  timeout: 20000
 })
 
 // request拦截器

+ 57 - 0
optimize_statistic_study_record_answer_indexes.sql

@@ -0,0 +1,57 @@
+-- ============================================
+-- 优化 statisticStudyRecordAnswer 查询的索引
+-- 根据慢SQL日志分析,该查询耗时约9.87秒,需要优化
+-- ============================================
+
+-- 1. learn_answer 表索引优化(最关键)
+-- 支持按state和时间范围过滤,以及JOIN examinee_id
+CREATE INDEX IF NOT EXISTS idx_learn_answer_state_examinee_time ON learn_answer(state, examinee_id, create_time);
+CREATE INDEX IF NOT EXISTS idx_learn_answer_state_student_time ON learn_answer(state, student_id, create_time);
+CREATE INDEX IF NOT EXISTS idx_learn_answer_examinee_state ON learn_answer(examinee_id, state);
+
+-- 2. learn_examinee 表索引优化
+-- 支持按state和时间范围过滤,以及JOIN examinee_id
+CREATE INDEX IF NOT EXISTS idx_learn_examinee_state_examinee_time ON learn_examinee(state, examinee_id, end_time);
+CREATE INDEX IF NOT EXISTS idx_learn_examinee_state_student_time ON learn_examinee(state, student_id, end_time);
+CREATE INDEX IF NOT EXISTS idx_learn_examinee_examinee_state ON learn_examinee(examinee_id, state);
+CREATE INDEX IF NOT EXISTS idx_learn_examinee_paper_type_state_id ON learn_examinee(paper_type, state, paper_id);
+
+-- 3. sys_user 表索引优化(如果还没有)
+-- 支持JOIN操作
+CREATE INDEX IF NOT EXISTS idx_sys_user_user_id ON sys_user(user_id);
+CREATE INDEX IF NOT EXISTS idx_sys_user_card_id ON sys_user(card_id);
+
+-- 4. dz_cards 表索引优化
+-- 支持WHERE条件过滤和JOIN
+CREATE INDEX IF NOT EXISTS idx_dz_cards_card_id ON dz_cards(card_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_dept_id ON dz_cards(dept_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_school_id ON dz_cards(school_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_class_id ON dz_cards(class_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_campus_id ON dz_cards(campus_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_campus_class_id ON dz_cards(campus_class_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_agent_id ON dz_cards(agent_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_leaf_agent_id ON dz_cards(leaf_agent_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_card_no ON dz_cards(card_no);
+
+-- 5. dz_teacher_class 表索引优化(用于teacherId过滤)
+CREATE INDEX IF NOT EXISTS idx_dz_teacher_class_teacher_id ON dz_teacher_class(teacher_id);
+CREATE INDEX IF NOT EXISTS idx_dz_teacher_class_teacher_class ON dz_teacher_class(teacher_id, class_id, out_date);
+
+-- ============================================
+-- 索引使用说明
+-- ============================================
+-- 1. 复合索引的顺序很重要:
+--    - 过滤条件字段在前(state)
+--    - JOIN字段在中间(examinee_id, student_id)
+--    - 时间字段在后(create_time, end_time)
+--
+-- 2. 如果表数据量很大,建议定期分析表并更新统计信息:
+--    ANALYZE TABLE learn_answer;
+--    ANALYZE TABLE learn_examinee;
+--    ANALYZE TABLE sys_user;
+--    ANALYZE TABLE dz_cards;
+--
+-- 3. 如果某些索引使用率很低,可以考虑删除以节省存储空间
+--
+-- 4. 建议在业务低峰期执行索引创建,避免影响正常业务
+

+ 58 - 0
optimize_study_record_statistics_indexes.sql

@@ -0,0 +1,58 @@
+-- ============================================
+-- 学习记录统计查询优化索引
+-- 用于优化 statisticStudyRecord 查询性能
+-- ============================================
+
+-- 1. learn_answer 表索引优化
+-- 支持按时间范围和状态过滤
+CREATE INDEX IF NOT EXISTS idx_learn_answer_state_time ON learn_answer(state, create_time);
+CREATE INDEX IF NOT EXISTS idx_learn_answer_examinee_state_time ON learn_answer(examinee_id, state, create_time);
+CREATE INDEX IF NOT EXISTS idx_learn_answer_student_state_time ON learn_answer(student_id, state, create_time);
+
+-- 2. learn_examinee 表索引优化
+-- 支持按状态和时间范围过滤,以及JOIN条件
+CREATE INDEX IF NOT EXISTS idx_learn_examinee_state_end_time ON learn_examinee(state, end_time);
+CREATE INDEX IF NOT EXISTS idx_learn_examinee_examinee_state_time ON learn_examinee(examinee_id, state, end_time);
+CREATE INDEX IF NOT EXISTS idx_learn_examinee_student_state_time ON learn_examinee(student_id, state, end_time);
+CREATE INDEX IF NOT EXISTS idx_learn_examinee_paper_type_state ON learn_examinee(paper_type, state, paper_id);
+
+-- 3. b_customer_video_watches 表索引优化
+-- 支持按时间范围过滤和JOIN
+CREATE INDEX IF NOT EXISTS idx_customer_video_watches_time ON b_customer_video_watches(time);
+CREATE INDEX IF NOT EXISTS idx_customer_video_watches_customer_time ON b_customer_video_watches(customerCode, time);
+
+-- 4. sys_user 表索引优化(如果还没有)
+-- 支持JOIN操作
+CREATE INDEX IF NOT EXISTS idx_sys_user_user_id ON sys_user(user_id);
+CREATE INDEX IF NOT EXISTS idx_sys_user_card_id ON sys_user(card_id);
+
+-- 5. dz_cards 表索引优化
+-- 支持WHERE条件过滤和JOIN
+CREATE INDEX IF NOT EXISTS idx_dz_cards_card_id ON dz_cards(card_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_dept_id ON dz_cards(dept_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_school_id ON dz_cards(school_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_class_id ON dz_cards(class_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_campus_id ON dz_cards(campus_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_campus_class_id ON dz_cards(campus_class_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_agent_id ON dz_cards(agent_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_leaf_agent_id ON dz_cards(leaf_agent_id);
+CREATE INDEX IF NOT EXISTS idx_dz_cards_card_no ON dz_cards(card_no);
+
+-- 6. dz_teacher_class 表索引优化(用于teacherId过滤)
+CREATE INDEX IF NOT EXISTS idx_dz_teacher_class_teacher_id ON dz_teacher_class(teacher_id);
+CREATE INDEX IF NOT EXISTS idx_dz_teacher_class_teacher_class ON dz_teacher_class(teacher_id, class_id, out_date);
+
+-- 7. learn_student 表索引优化(如果还没有)
+CREATE INDEX IF NOT EXISTS idx_learn_student_student_id ON learn_student(student_id);
+
+-- ============================================
+-- 索引使用说明
+-- ============================================
+-- 1. 复合索引的顺序很重要,应该按照查询条件的使用频率和选择性排序
+-- 2. 时间字段的索引可以显著提升范围查询性能
+-- 3. 如果表数据量很大,建议定期分析表并更新统计信息:
+--    ANALYZE TABLE learn_answer;
+--    ANALYZE TABLE learn_examinee;
+--    ANALYZE TABLE b_customer_video_watches;
+-- 4. 如果某些索引使用率很低,可以考虑删除以节省存储空间
+