mysql数据库优化五步走
2007-11-11 15:46:04 来源:WEB开发网4:优化left join
在MySQL(和PHP搭配之最佳组合)中 a left join b按以下方式实现
a:表b依赖于表a
b:表a依赖于所有用在left join条件的表(除了b)
c:所有left join条件被移到where子句中
d:进行所有的联结优化,除了一个表总是在所有他依赖的表后读取.如果有一个循环依赖,那么将发生错误
e:进行所有的标准的where优化 f:如果在a中有一行匹配where子句,但是在b中没有任何匹配left join条件,那么,在b中生成的所有设置为NULL的一行
g:如果使用left join来找出某些表中不存在的行并且在where部分有column_name IS NULL测试(column_name为NOT NULL列).那么,MySQL(和PHP搭配之最佳组合)在它已经找到了匹配left join条件的一行后,将停止在更多的行后寻找
5:优化limit
a:如果用limit只选择一行,当MySQL(和PHP搭配之最佳组合)需要扫描整个表时,它的作用相当于索引
b:如果使用limit#与order by,MySQL(和PHP搭配之最佳组合)如果找到了第#行,将结束排序,而不会排序正个表
c:当结合limit#和distinct时,MySQL(和PHP搭配之最佳组合)如果找到了第#行,将停止
d:只要MySQL(和PHP搭配之最佳组合)已经发送了第一个#行到客户,MySQL(和PHP搭配之最佳组合)将放弃查询
e:limit 0一直会很快的返回一个空集合.
f:临时表的大小使用limit#计算需要多少空间来解决查询
6:优化insert
插入一条记录的是由以下构成:
a:连接(3)
b:发送查询给服务器(2)
c:分析查询(2)
d:插入记录(1*记录大小)
e:插入索引(1*索引)
f:关闭(1)
以上数字可以看成和总时间成比例
改善插入速度的一些方法:
6.1:如果同时从一个连接插入许多行,使用多个值的insert,这比用多个语句要快
6.2:如果从不同连接插入很多行,使用insert delayed语句速度更快
6.3: 用myisam,如果在表中没有删除的行,能在select:s正在运行的同时插入行
6.4: 当从一个文本文件装载一个表时,用load data infile.这个通常比insert快20 倍
6.5:可以锁定表然后插入--主要的速度差别是在所有insert语句完成后,索引缓冲区仅被存入到硬盘一次.一般与有不同的insert语句那样多次存入要快.如果能用一个单个语句插入所有的行,锁定就不需要.锁定也降低连接的整体时间.但是对某些线程最大等待时间将上升.例如:
thread 1 does 1000 inserts
thread 2,3 and 4 does 1 insert
thread 5 does 1000 inserts
如果不使用锁定,2,3,4将在1和5之前完成.如果使用锁定,2,3,4,将可能在1和5之后完成.但是整体时间应该快40%.因为insert,update,delete操作在MySQL(和PHP搭配之最佳组合)中是很快的,通过为多于大约5次连续不断的插入或更新一行的东西加锁,将获得更好的整体性能.如果做很多一行的插入,可以做一个lock tables,偶尔随后做一个unlock tables(大约每1000行)以允许另外的线程存取表.这仍然将导致获得好的性能.load data infile对装载数据仍然是很快的.
为了对load data infile和insert得到一些更快的速度,扩大关键字缓冲区.
7优化update的速度
它的速度依赖于被更新数据的大小和被更新索引的数量
使update更快的另一个方法是推迟修改,然后一行一行的做很多修改.如果锁定表,做一行一行的很多修改比一次做一个快
8优化delete速度
删除一个记录的时间与索引数量成正比.为了更快的删除记录,可以增加索引缓存的大小 从一个表删除所有行比删除这个表的大部分要快的多
第五步
1:选择一种表类型 1.1静态myisam
这种格式是最简单且最安全的格式,它是磁盘格式中最快的.速度来自于数据能在磁盘上被找到的难易程度.当锁定有一个索引和静态格式的东西是,它很简单,只是行长度乘以数量.而且在扫描一张表时,每次用磁盘读取来读入常数个记录是很容易的.安全性来源于如果当写入一个静态myisam文件时导致计算机down掉,myisamchk很容易指出每行在哪里开始和结束,因此,它通常能收回所有记录,除了部分被写入的记录.在MySQL(和PHP搭配之最佳组合)中所有索引总能被重建
1.2动态myisam
这种格式每一行必须有一个头说明它有多长.当一个记录在更改期间变长时,它可以在多于一个位置上结束.能使用optimize tablename或myisamchk整理一张表.如果在同一个表中有像某些varchar或者blob列那样存取/改变的静态数据,将动态列移入另外一个表以避免碎片.
1.2.1压缩myisam,用可选的myisampack工具生成
更多精彩
赞助商链接