详解MySQL 数据库优化方法(2)
时间:2010-08-12 14:50:00
sql优化方法
,EXPLAIN 输出的结果格式改变了,使得它更适合例如 UNION 语句、子查询以及派生表的结构。更令人注意的是,它新增了2个字段: id 和 select_type。当你使用早于MySQL 4.1的版本就看不到这些字段了。
EXPLAIN 结果的每行记录显示了每个表的相关信息,每行记录都包含以下几个字段:
id
本次 Select 的标识符。在查询中每个 Select 都有一个顺序的数值。
select_type
Select 的类型,可能会有以下几种:
SIMPLE
简单的 Select (没有使用 UNION 或子查询)
PRIMARY
最外层的 Select。
UNION
第二层,在Select 之后使用了 UNION 。
DEPENDENT UNION
UNION 语句中的第二个 Select,依赖于外部子查询
SUBQUERY
子查询中的第一个 Select
DEPENDENT SUBQUERY
子查询中的第一个 SUBQUERY 依赖于外部的子查询
DERIVED
派生表 Select(FROM 子句中的子查询)
table
记录查询引用的表。
type
表连接类型。以下列出了各种不同类型的表连接,依次是从最好的到最差的:
system
表只有一行记录(等于系统表)。这是 const 表连接类型的一个特例。
const
表中最多只有一行匹配的记录,它在查询一开始的时候就会被读取出来。由于只有一行记录,在余下的优化程序里该行记录的字段值可以被当作是一个恒定值。const 表查询起来非常快,因为只要读取一次!const 用于在和 PRIMARY KEY 或 UNIQUE 索引中有固定值比较的情形。下面的几个查询中,tbl_name 就是 const 表了:
Select*FROMtbl_nameWhereprimary_key=1;
Select*FROMtbl_name
Whereprimary_key_part1=1ANDprimary_key_part2=2;
eq_ref
从该表中会有一行记录被读取出来以和从前一个表中读取出来的记录做联合。与 const 类型不同的是,这是最好的连接类型。它用在索引所有部分都用于做连接并且这个索引是一个 PRIMARY KEY 或 UNIQUE 类型。eq_ref 可以用于在进行"="做比较时检索字段。比较的值可以是固定值或者是表达式,表达式中可以使用表里的字段,它们在读表之前已经准备好了。以下的几个例子中,MySQL使用了 eq_ref 连接来处理 ref_table:
Select*FROMref_table,other_table
Whereref_table.key_column=other_table.column;
Select*FROMref_table,other_table
Whereref_table.key_column_part1=other_table.column
ANDref_table.key_column_part2=1;
ref
该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref 用于连接程序使用键的最左前缀或者是该键不是 PRIMARY KEY 或 UNIQUE 索引(换句话说,就是连接程序无法根据键值只取得一条记录)的情况。当根据键值只查询到少数几条匹配的记录时,这就是一个不错的连接类型。ref 还可以用于检索字段使用 = 操作符来比较的时候。以下的几个例子中,MySQL将使用 ref 来处理 ref_table:
Select*FROMref_tableWherekey_column=expr;
Select*FROMref_table,other_table
Whereref_table.key_column=other_table.column;
Select*FROMref_table,other_table
Whereref_table.key_column_part1=other_table.column
ANDref_table.key_column_part2=1;
ref_or_null
这种连接类型类似 ref,不同的是MySQL会在检索的时候额外的搜索包含 NULL 值的记录。这种连接类型的优化是从MySQL 4.1.1开始的,它经常用于子查询。在以下的例子中,MySQL使用 ref_or_null 类型来处理 ref_table:
Select*FROMref_table
Wherekey_column=exprORkey_columnISNULL;
index_merge
这种连接类型意味着使用了 Index Merge 优化方法。这种情况下,key字段包括了所有使用的索引,key_len 包括了使用的键的最长部分。详情请看"7.2.5 How MySQL Optimizes or Clauses"。
unique_subquery
这种类型用例如一下形式的 IN 子查询来替换 ref:
value IN (Select primary_key FROM single_table Where some_expr)
unique_subquery 只是用来完全替换子查询的索引查找函数效率更高了。
index_subquery
这种连接类型类似 unique_subquery。它用子查询来代替 IN,不过它用于在子查询中没有唯一索引的情况下,例如以下形式:
value IN (Select key_column FROM single_table Where some_expr)
range
只有在给定范围的记录才会被取出来,利用索引来取得一条记录。key 字段表示使用了哪个索引。key_len 字段包括了使用的键的最长部分。这种类型时 ref 字段值是 NULL。range 用于将某个字段和一个定植用以下任何操作符比较时 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, 或 IN:
tmp_table_size = 256M
max_connections = 768指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。
max_connect_errors = 10000000
wait_timeout = 10指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。
thread_concurrency = 8该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4 × 2 = 8
skip-networking开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库教程服务器则不要开启该选项!否则将无法正常连接!
标签:mysql,数据库优化
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
您需要了解的DIV+CSS网页布局的8条面试题目
2010-01-29 13:22:00
SQL中自己创建函数 分割字符串
2008-11-20 16:13:00
如何用Cookie进行登录验证?
2010-06-12 12:34:00
asp的日期转换星座函数
2010-06-09 21:05:00
ExtJS 开发总结
2009-04-28 13:05:00
![](https://img.aspxhome.com/file/UploadPic/20094/28/extanim64_3-91s.gif)
mysql5存储过程编写实践
2008-12-24 16:32:00
利用SQL语句对不同数据库进行高效果分页
2008-11-28 14:44:00
用jquery写的自动提示效果
2008-06-17 14:27:00
数字格式化转换
2010-08-03 12:22:00
javascript中类的创建和继承
2008-05-08 12:07:00
剑走偏锋:体验ebay的AIR
2008-11-13 11:51:00
![](https://img.aspxhome.com/file/UploadPic/200811/13/01-14s.jpg)
HTML在线编辑器的原理分析(整理)
2007-12-22 10:25:00
Overflow Auto && Position Relative
2009-09-03 12:02:00
条件CSS的介绍
2009-03-13 13:57:00
Select 控件Combox加强版(IE Only)
2008-07-23 13:26:00
IE多版本共存的解决方案——IETester(推荐)
2009-03-26 12:47:00
![](https://img.aspxhome.com/file/UploadPic/20093/26/ietester-24s.gif)
基于ASP的站内多值搜索
2010-05-11 20:03:00
用一个例子来认识innerText,innerHTML
2007-12-24 17:17:00
plsql与tsql的语法不同
2009-09-13 17:33:00
asp如何读取Windows的信息文件(.ini)?
2009-11-20 18:27:00