我正在使用 MySQL 5.5.37。目前无法升级。我有这张桌子
CREATE TABLE `my_classroom` (
`ID` varchar(32) COLLATE utf8_bin NOT NULL DEFAULT '',
`CLASSROOM_NAME` varchar(100) COLLATE utf8_bin NOT NULL,
`ACCESS_CODE_ID` varchar(32) COLLATE utf8_bin DEFAULT NULL,
`TEACHER_ACCESS_CODE_ID` varchar(32) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `UK_my_classroom` (`ACCESS_CODE_ID`),
UNIQUE KEY `UK2_my_classroom` (`TEACHER_ACCESS_CODE_ID`),
KEY `FK2_my_classroom` (`CLASSROOM_SCHEDULE_ID`),
CONSTRAINT `FK3_my_classroom` FOREIGN KEY (`TEACHER_ACCESS_CODE_ID`) REFERENCES `my_reg_code` (`ID`) ON UPDATE NO ACTION,
CONSTRAINT `FK_my_classroom` FOREIGN KEY (`ACCESS_CODE_ID`) REFERENCES `my_reg_code` (`ID`) ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
注意 ACCESS_CODE_ID 和 TEACHER_ACCESS_CODE_ID 列上的索引。然而,当这个查询运行时(它是由 Hibernate 生成的,这就是为什么它看起来有点奇怪),注意正在发生的全表扫描……</p>
mysql> explain select davesclass0_.id as id1_7_, davesclass0_.ACCESS_CODE_ID as ACCESS_13_7_,
davesclass0_.CLASSROOM_NAME as CLASSROO7_7_, davesclass0_.TEACHER_ACCESS_CODE_ID as TEACHER15_7_
from my_classroom davesclass0_
left outer join my_reg_code myregcode1_ on davesclass0_.ACCESS_CODE_ID=myregcode1_.ID
left outer join my_reg_code accesscode2_ on davesclass0_.TEACHER_ACCESS_CODE_ID=accesscode2_.ID
where myregcode1_.ACCESS_CODE='ABCDEF' or accesscode2_.ACCESS_CODE='ABCDEF';
+----+-------------+--------------+--------+---------------+---------+---------+-------------------------------------------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+--------+---------------+---------+---------+-------------------------------------------+---------+-------------+
| 1 | SIMPLE | davesclass0_ | ALL | NULL | NULL | NULL | NULL | 1914867 | |
| 1 | SIMPLE | myregcode1_ | eq_ref | PRIMARY | PRIMARY | 98 | my_db.davesclass0_.ACCESS_CODE_ID | 1 | |
| 1 | SIMPLE | accesscode2_ | eq_ref | PRIMARY | PRIMARY | 98 | my_db.davesclass0_.TEACHER_ACCESS_CODE_ID | 1 | Using where |
+----+-------------+--------------+--------+---------------+---------+---------+-------------------------------------------+---------+-------------+
有什么办法可以重写它以返回相同的结果,但让 MySQL 理解使用 my_classroom 表上的索引?
编辑:响应lsemi的建议,MySql的解释计划......
mysql> explain select davesclass0_.id as id1_7_, davesclass0_.ACCESS_CODE_ID as ACCESS_13_7_, davesclass0_.TEACHER_ACCESS_CODE_ID as TEACHER15_7_ from my_classroom davesclass0_ where davesclass0_.ACCESS_CODE_ID in (select myregcode1_.ID from my_reg_code myregcode1_ where myregcode1_.ACCESS_CODE='ABCDEF') or davesclass0_.TEACHER_ACCESS_CODE_ID in (select myregcode2_.ID from my_reg_code myregcode2_ where myregcode2_.ACCESS_CODE='ABCDEF');
+----+--------------------+--------------+------+---------------+------+---------+------+--------+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+--------------+------+---------------+------+---------+------+--------+-----------------------------------------------------+
| 1 | PRIMARY | davesclass0_ | ALL | NULL | NULL | NULL | NULL | 216280 | Using where |
| 3 | DEPENDENT SUBQUERY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables |
| 2 | DEPENDENT SUBQUERY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables |
+----+--------------------+--------------+------+---------------+------+---------+------+--------+-----------------------------------------------------+
编辑2:解释计划
mysql> explain select davesclass0_.id as id1_7_, davesclass0_.ACCESS_CODE_ID as ACCESS_13_7_, davesclass0_.TEACHER_ACCESS_CODE_ID as TEACHER15_7_ from mY_classroom davesclass0_ where davesclass0_.ACCESS_CODE_ID in (select myregcode1_.ID from my_reg_code myregcode1_ where myregcode1_.ACCESS_CODE='0008F0');
+----+--------------------+--------------+-------+---------------------------+-------------------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+--------------+-------+---------------------------+-------------------+---------+-------+--------+-------------+
| 1 | PRIMARY | davesclass0_ | ALL | NULL | NULL | NULL | NULL | 216280 | Using where |
| 2 | DEPENDENT SUBQUERY | myregcode1_ | const | PRIMARY,UK_my_reg_code | UK_my_reg_code | 98 | const | 1 | Using index |
+----+--------------------+--------------+-------+---------------------------+-------------------+---------+-------+--------+-------------+
2 rows in set (0.00 sec)
mysql> explain select davesclass0_.id as id1_7_, davesclass0_.ACCESS_CODE_ID as ACCESS_13_7_, davesclass0_.TEACHER_ACCESS_CODE_ID as TEACHER15_7_ from mY_classroom davesclass0_ where davesclass0_.ACCESS_CODE_ID = 'ABCEF';
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+