为什么解释说它使用类型所有的竞赛表,虽然竞赛表有chid作为主键?
mysql> explain SELECT contests.chid, contests.diff_level from contests, contest_users where contests.chid=contest_users.chid;
+----+-------------+-----------------+------+---------------------+---------------------+---------+-------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+---------------------+---------------------+---------+-------------------------------+-------+-------------+
| 1 | SIMPLE | contests | ALL | PRIMARY | NULL | NULL | NULL | 37660 | |
| 1 | SIMPLE | contest_users | ref | contest_users_idx | contest_users_idx | 4 | fbtable.contests.chid | 2 | Using index |
+----+-------------+-----------------+------+---------------------+---------------------+---------+-------------------------------+-------+-------------+
2 rows in set (0.00 sec)mysql> desc contests;
+------------+------------------+------+-----+----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+----------+----------------+
| chid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| puzzle | char(81) | YES | | NULL | |
| solution | char(81) | YES | | NULL | |
| isComplete | tinyint(1) | YES | | 0 | |
| diff_level | char(7) | YES | | NULL | |
| time | time | YES | | 00:00:00 | |
+------------+------------------+------+-----+----------+----------------+
6 rows in set (0.00 sec)mysql> desc contest_users;
+------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------------------+------+-----+---------+-------+
| chid | int(10) unsigned | NO | MUL | NULL | |
| uid | bigint(20) unsigned | YES | | NULL | |
| gamestate | char(81) | YES | | NULL | |
| score | int(10) unsigned | YES | | 0 | |
| no_correct | smallint(5) unsigned | YES | | 0 | |
| no_wrong | smallint(5) unsigned | YES | | 0 | |
| time | time | YES | | NULL | |
| isComplete | tinyint(1) | YES | | 0 | |
+------------+----------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)发布于 2011-02-28 00:52:14
我猜是因为很少有行。
当您有数千行时,查询优化器可能会做出不同的决定。
发布于 2011-05-06 11:21:58
我的(迟)建议是在竞赛表上添加一个键,它必须包括用于连接(chid) 和的列,以及您希望从该查询中得到的列。
这将导致mysql实际使用索引来获取数据,而不是扫描整个表(type=" index“,extra=解释结果中的”使用索引“)。
由于chid位于结果集中,也处于联接条件中,所以在您的示例中,它将如下所示:
alter table contests add key `chid_diffLevel` (chid, diff_level);我希望它对你有用。我在我的一个数据库上试过了,我知道它对我有用。
https://stackoverflow.com/questions/2361054
复制相似问题