【发布时间】:2013-09-25 14:51:44
【问题描述】:
我正在尝试使用此查询在多个时期之间查找个人的考试结果:
SELECT * FROM RESULTS AS R, Define_Times AS T
WHERE R.PERSONID = T.PERSONID AND (
(R.DATE BETWEEN T.Previous_Month_Start AND T.Previous_Month_End) OR
(R.DATE BETWEEN T.Next_Month_Start AND T.Next_Month_End) OR
(R.DATE BETWEEN T.Six_Month_Start AND T.Six_Month_End) OR
(R.DATE BETWEEN T.One_Year_Start AND T.One_Year_End) OR
(R.DATE BETWEEN T.Two_Year_Start AND T.Two_Year_End) OR
(R.DATE BETWEEN T.Three_Year_Start AND T.Three_Year_End) OR
(R.DATE BETWEEN T.Four_Year_Start AND T.Four_Year_End) )
Previous/Next/One_Year 等因人而异。
解释给出:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | T | ALL | PEOPLE | NULL | NULL | NULL | 75775 | |
| 1 | SIMPLE | R | ref | IDX3,IDX2 | IDX3 | 5 | T.PERSONID | 3550 | Using where |
结果表有大约 3 亿行。 Define_Times 有 75,000 个。
需要 AGES 时间。
我看到第一种类型是 ALL,这很糟糕。但如果情况如此糟糕,为什么不使用它认为可能的 PERSONID(称为 PEOPLE)上的索引?我能做些什么来改善这一点?
我也无法使用日期索引来查看它 - R.DATE 上有一个。 (它是 IDX2 索引中 5 序列中的第一个。)
抱歉有任何错别字 - 我的键盘坏了,提前致谢。
【问题讨论】:
-
您是否尝试过使用
join来选择这两个表? -
确实使用了连接,只是语义不同。
-
Define_Times 中的每一行在 Results 中是否都有对应的人?
-
你能重组数据库以规范Define_Times吗?
-
第一行 R.DATE 是否正确,还是 R.ETRDATE 的错字?
标签: mysql sql performance indexing between