TechTarget中国网站推荐

MySQL Explain详解(四)

2008-8-19  选择字号:  | |
打印本文章

  (2).const

  表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!

  const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时。在下面的查询中,tbl_name可以用于const表:


select * from tbl_name where primary_key=1; 
select * from tbl_name where primary_key_part1=1和 primary_key_part2=2; 

  例如:

mysql> explain select * from t3 where id=3952602; 
  +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ 
  | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
  +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ 
  | 1 | SIMPLE | t3 | const | PRIMARY,idx_t3_id | PRIMARY | 4 | const | 1 | | 
  +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ 


  (3). eq_ref

  对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。

  eq_ref可以用于使用= 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。

  在下面的例子中,MySQL可以使用eq_ref联接来处理ref_tables:


select * FROM ref_table,other_table 
  where ref_table.key_column=other_table.column; 
  select * FROM ref_table,other_table 
  where ref_table.key_column_part1=other_table.column 
  AND ref_table.key_column_part2=1; 
  


  例如


mysql> create unique index idx_t3_id on t3(id) ; 
  Query OK, 1000 rows affected (0.03 sec) 
  Records: 1000 Duplicates: 0 Warnings: 0 
  mysql> explain select * from t3,t4 where t3.id=t4.accountid; 
  +----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+ 
  | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
  +----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+ 
  | 1 | SIMPLE | t4 | ALL | NULL | NULL | NULL | NULL | 1000 | | 
  | 1 | SIMPLE | t3 | eq_ref | PRIMARY,idx_t3_id | idx_t3_id | 4 | dbatest.t4.accountid | 1 | | 
  +----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+ 
  (4).ref

  对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。

  ref可以用于使用=或<=>操作符的带索引的列。

  在下面的例子中,MySQL可以使用ref联接来处理ref_tables:


select * FROM ref_table where key_column=expr; 
select * FROM ref_table,other_table 
where ref_table.key_column=other_table.column; 
select * FROM ref_table,other_table 
where ref_table.key_column_part1=other_table.column 
AND ref_table.key_column_part2=1; 


MySQL Explain 详解
 MySQL Explain详解(一)
 MySQL Explain详解(二)
 MySQL Explain详解(三)
 MySQL Explain详解(四)
 MySQL Explain详解(五)
 MySQL Explain详解(六)

原文出处:http://space.itpub.net/7364032/viewspace-421320
来源:BLOG    作者:yxyup    
相关的专家答疑
MYSQL是一种小型的,紧密的数据服务器,支持标准SQL。它在UNIX和WINDOWS环境下都能够使用。
MySQLDriverCS是MySQL数据库的一个免费开源的.NET驱动程序。和Sql .NET Data Provider是为Sql Server一样,它是专门为MySQL设计的,可以叫做MySQL .NET Data Provider。
如何在.NET中访问MySQL数据库呢?也许很多人马上会说:用OLEDB嘛,但是事实上采用.NET OleDb Data Provider并不能访问MySQL,如果你使用的话,系统就会提示你……
单一文件大小有如下几个因素:1、文件系统的限制;2、某一程序进程所能存取的第一文件最大尺寸(例如apache在Linux EXT3下能存取的最大尺寸为2G,诸如日志)……
在论坛发表回复时出现“The table is full”的提示,字面意义上是数据表已满的意思。本文将以我此次问题的解决过程,介绍问题发生的原因及对策。
本篇文章主要介绍SQL Server数据存储的物理对象和原理,包括SQL Server 2005和2008里的物理数据存储、SQL Server 2008数据类型(即Datetime、字符串、自定义及等)、在SQL Server数据库中加强数据的完整性……
本文为SQL Server 2008初学者指南,主要介绍SQL Server2008 T-SQL支持的基本元素和基本操作。
本篇技术专题主要内容包括SQL Server整合、SQL Server数据库设计灾难、SQL Server数据库查询设计以及SQL Server数据库同步、复制、报告显示。
最新更新
专家答疑
技巧
Brian Peasland
我在使用这个工具的时候就出现了以上的错误。由于出现了这个错误,我就没有顺利地完成备份。你能告诉我是什么原因吗?
Rudy Limeback
我想把这些日期按照月份聚集在一起,这样我们就能查看每个售货员每个月的销售量了。我怎么才能将这些月份的日期聚集在一起呢?
Maria Anderson
我得到了一个错误信息,如“DIM-00019:创建服务错误。”我用你寄给我的解决方案解决这一问题,即:“手动创建和启动服务。”你能告诉我如何手动安装该服务吗?