【发布时间】:2015-09-30 10:38:26
【问题描述】:
我的查询跨越索引良好的JOIN 上的 4 个表,最多约 500 行。然而,查询通常需要几分钟才能完成。
我错过了什么?
EXPLAIN
SELECT
homework.id AS homework_id,
homework.description
FROM homework
JOIN student_homework_assn
ON homework.id = student_homework_assn.homework_id
JOIN class_student_assn
ON student_homework_assn.student_id = class_student_assn.student_id
JOIN class
ON class_student_assn.class_id = class.id
WHERE homework.grade IS NULL
AND homework.homework_date > DATE_ADD(NOW(), INTERVAL -1 DAY)
AND class.class_status_id = 2
LIMIT 1000;
*** row 1 ***
table: class
type: ref
possible_keys: PRIMARY,class_status_id,class_multi_1
key: class_status_id
key_len: 4
ref: const
rows: 539
Extra: Using index
*** row 2 ***
table: class_student_assn
type: ref
possible_keys: student_id_2,student_id
key: student_id_2
key_len: 4
ref: class.id
rows: 1
Extra: Using index
*** row 3 ***
table: student_homework_assn
type: ref
possible_keys: PRIMARY,idx_homework_id,idx_student_id
key: idx_student_id
key_len: 8
ref: class_student_assn.student_id
rows: 262
Extra: Using index
*** row 4 ***
table: homework
type: eq_ref
possible_keys: PRIMARY,id,homework_date
key: PRIMARY
key_len: 8
ref: student_homework_assn.homework_id
rows: 1
Extra: Using where
简要表说明:
Table # Rows
homework 200M
student_homework_assn 25M
class_student_assn 2k
class 3k
接下来我应该在哪里查看以减少此查询的运行时间?
【问题讨论】:
-
BETWEEN DATE_ADD(NOW(), INTERVAL -1 DAY) AND DATE_ADD(NOW(), INTERVAL -0 DAY)=>BETWEEN DATE_ADD(NOW(), INTERVAL -1 DAY) AND NOW() -
感谢@lad2025 的评论和编辑。我尝试了
homework_date BETWEEN ... AND NOW()和homework_date > DATE_ADD(NOW(), INTERVAL -1 DAY)。两个结果都一样长(200-300 秒!),并且与原始查询时间相似。下一步是什么? -
在这三个中,
homework_date > DATE_ADD...始终更快,但生产速度仍然慢(从不低于 90 秒)。
标签: mysql sql query-optimization