当前位置: 首页 > 图文教程 > 网络编程 > PHP > MySQL手册版本 5.0.20-MySQL优化(二) (1)(4)

PHP
PHP函数:php中rename()函数的妙用
PHP实例:PHP验证码
PHP实例:PHP无限极分类
PHP实例:PHP操作文件类
PHP实例 PHP实现定时生成HTML网站首页
php脚本中include文件报错解决方法
在PHP中显示格式化的用户输入
PHP教程:在PHP中将图片存放ORACLE中
PHP5中的this,self和parent关键字详解
PHP实例:PHP的拼写检查函数库
PHP教程实例:用PHP打造动态聊天室系统
PHP基础:PHP4和PHP5的配置异同比较
使用PHP4.2.0及以后版本的注意事项
一个非常全面获取图象信息的PHP函数
比较测试PHP+MYSQL分页机制两种方案
PHP中用正则表达式验证中文的问题
php程序如何生成验证码图片
用php或js获取图片大小高宽尺寸
phpMyAdmin2.6以上版本数据乱码问题
巧学巧用:如何使用PHP中的字符串函数

PHP 中的 MySQL手册版本 5.0.20-MySQL优化(二) (1)(4)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 48 ::
收藏到网摘: n/a

下面的例子展示了如何通过 EXPLAIN 提供的信息来较大程度地优化多表联合查询的性能。

假设有下面的 SELECT 语句,正打算用 EXPLAIN 来检测:

EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,

tt.ProjectReference, tt.EstimatedShipDate,

tt.ActualShipDate, tt.ClientID,

tt.ServiceCodes, tt.RepetitiveID,

tt.CurrentProcess, tt.CurrentDPPerson,

tt.RecordVolume, tt.DPPrinted, et.COUNTRY,

et_1.COUNTRY, do.CUSTNAME

FROM tt, et, et AS et_1, do

WHERE tt.SubmitTime IS NULL

AND tt.ActualPC = et.EMPLOYID

AND tt.AssignedPC = et_1.EMPLOYID

AND tt.ClientID = do.CUSTNMBR;

在这个例子中,先做以下假设:

要比较的字段定义如下:

Table Column Column Type
tt ActualPC CHAR(10)
tt AssignedPC CHAR(10)
tt ClientID CHAR(10)
et EMPLOYID CHAR(15)
do CUSTNMBR CHAR(15)

数据表的索引如下:

Table Index
tt ActualPC
tt AssignedPC
tt ClientID
et EMPLOYID (primary key)
do CUSTNMBR (primary key)

tt.ActualPC 的值是不均匀分布的。

在任何优化措施未采取之前,经过 EXPLAIN 分析的结果显示如下:

table type possible_keys key key_len ref rows Extra

et ALL PRIMARY NULL NULL NULL 74

do ALL PRIMARY NULL NULL NULL 2135

et_1 ALL PRIMARY NULL NULL NULL 74

tt ALL AssignedPC, NULL NULL NULL 3872

ClientID,

ActualPC

range checked for each record (key map: 35)

由于字段 type 的对于每个表值都是 ALL,这个结果意味着MySQL对所有的表做一个迪卡尔积;这就是说,每条记录的组合。这将需要花很长的时间,因为需要扫描每个表总记录数乘积的总和。在这情况下,它的积是 74 * 2135 * 74 * 3872 = 45,268,558,720 条记录。如果数据表更大的话,你可以想象一下需要多长的时间。

在这里有个问题是当字段定义一样的时候,MySQL就可以在这些字段上更快的是用索引(对 ISAM 类型的表来说,除非字段定义完全一样,否则不会使用索引)。在这个前提下,VARCHAR 和 CHAR是一样的除非它们定义的长度不一致。由于 tt.ActualPC 定义为 CHAR(10),et.EMPLOYID 定义为 CHAR(15),二者长度不一致。

为了解决这个问题,需要用 ALTER TABLE 来加大 ActualPC 的长度从10到15个字符: