我正在尝试使用此查询在多个时期之间查找个人的考试结果:
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 序列中的第一个。)
抱歉有任何错别字 - 我的键盘坏了,提前致谢。