首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么解释说它使用类型所有的竞赛表,虽然竞赛表有chid作为主键?

为什么解释说它使用类型所有的竞赛表,虽然竞赛表有chid作为主键?
EN

Stack Overflow用户
提问于 2010-03-02 05:14:35
回答 2查看 347关注 0票数 0

为什么解释说它使用类型所有的竞赛表,虽然竞赛表有chid作为主键?

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2011-02-28 00:52:14

我猜是因为很少有行。

当您有数千行时,查询优化器可能会做出不同的决定。

票数 0
EN

Stack Overflow用户

发布于 2011-05-06 11:21:58

我的(迟)建议是在竞赛表上添加一个键,它必须包括用于连接(chid) 的列,以及您希望从该查询中得到的列。

这将导致mysql实际使用索引来获取数据,而不是扫描整个表(type=" index“,extra=解释结果中的”使用索引“)。

由于chid位于结果集中,也处于联接条件中,所以在您的示例中,它将如下所示:

代码语言:javascript
运行
复制
alter table contests add key `chid_diffLevel` (chid, diff_level);

我希望它对你有用。我在我的一个数据库上试过了,我知道它对我有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2361054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档