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

2016-01-29 13:47 5 1 收藏

MySQL手册版本 5.0.20-MySQL优化(二) (1)(4),MySQL手册版本 5.0.20-MySQL优化(二) (1)(4)

【 tulaoshi.com - PHP 】

下面的例子展示了如何通过 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个字符:

来源:http://www.tulaoshi.com/n/20160129/1491495.html

延伸阅读
标签: PHP
7.2.12 加速 INSERT 插入一条记录花费的时间由以下几个因素决定,后面的数字大致表示影响的比例: 连接:(3) 发送查询给服务器:(2) 解析查询:(2) 插入记录:(1 x 记录大小) 插入索引:(1 x 索引数量) 关闭:(1) 这里并没有考虑初始化时打开数据表的开销,因为每次运行查询只会做这么一次...
标签: PHP
6.4 设置同步 以下描述了如何快速设置 MySQL 同步服务器。假设你打算同步全部的数据库,并且之前没有设置过。需要关闭master服务器以完成全部的步骤。 本章描述的过程可以用于一个slave的情况,也可以用于多个slave的情况。 这只是一个最直接设置slave的办法,并不是只有一个。例如,已经有了master的数据快照...
标签: PHP
6 MySQL 同步 同步功能在MySQL 3.23.15就开始引进了,它可以把一个MySQL服务器上的数据复制到另一个服务器上去。本章描述了MySQL的各种复制特性。介绍了同步的概念,如何设置同步服务器,以及可用服务器的参照。还提供了一系列的常见问题及其答案,疑难解答。 "14.6 Replication Statements"中介绍了同步相关的SQL语句语...
标签: PHP
6.5 不同 MySQL 版本之间的同步兼容性 最早的二进制格式是在MySQL 3.23中开发出来的。在MySQL 4.0中改进了,MySQL 5.0又改进了。在配置同步时需要升级服务器的话,它们之间的因果关系在"6.6 Upgrading a Replication Setup"中描述了。 如果只关心同步,任何MySQL 4.1.x版本和MySQL 4.0.x是一样的,因为它们都使用...
六、优化应用 应该集中精力解决问题。 在编写应用时,应该决定什么是最重要的: 速度 操作系统间的可移植性 SQL服务器间的可移植性 使用持续的连接。. 缓存应用中的数据以减少SQL服务器的负载。 不要查询应用中不需要的列。 不要使用SELECT * FROM table_name... 测试应用的所有部分,...