mysql数据库优化五步走
2007-11-11 15:46:04 来源:WEB开发网1.2.2内存
这种格式对小型/中型表很有用.对拷贝/创建一个常用的查找表到洋heap表有可能加快多个表联结,用同样数据可能要快好几倍时间.
select tablename.a,tablename2.a from tablename,tablanem2,tablename3 where
tablaneme.a=tablename2.a and tablename2.a=tablename3.a and tablename2.c!=0;
为了加速它,可以用tablename2和tablename3的联结创建一个临时表,因为用相同列(tablename1.a)查找.
CREATE TEMPORARY TABLE test TYPE=HEAP
SELECT
tablename2.a as a2,tablename3.a as a3
FROM
tablenam2,tablename3
WHERE
tablename2.a=tablename3.a and c=0;
SELECT tablename.a,test.a3 from tablename,test where tablename.a=test.a1;
SELECT tablename.a,test,a3,from tablename,test where tablename.a=test.a1 and ....;
1.3静态表的特点
1.3.1默认格式.用在表不包含varchar,blob,text列的时候
1.3.2所有的char,numeric和decimal列填充到列宽度
1.3.3非常快
1.3.4容易缓冲
1.3.5容易在down后重建,因为记录位于固定的位置
1.3.6不必被重新组织(用myisamchk),除非是一个巨量的记录被删除并且优化存储大小
1.3.7通常比动态表需要更多的存储空间
1.4动态表的特点
1.4.1如果表包含任何varchar,blob,text列,使用该格式
1.4.2所有字符串列是动态的
1.4.3每个记录前置一个位.
1.4.4通常比定长表需要更多的磁盘空间
1.4.5每个记录仅仅使用所需要的空间,如果一个记录变的很大,它按需要被分成很多段,这导致了记录碎片
1.4.6如果用超过行长度的信息更新行,行被分段.
1.4.7在系统down掉以后不好重建表,因为一个记录可以是多段
1.4.8对动态尺寸记录的期望行长度是3+(number of columns+7)/8+(number of char columns)+packed size of numeric columns+length of strings +(number of NULL columns+7)/8
对每个连接有6个字节的惩罚.无论何时更改引起记录的变大,都有一个动态记录被连接.每个新连接至少有20个字节,因此下一个变大将可能在同一个连接中.如果不是,将有另外一个连接.可以用myisamchk -恶毒检查有多少连接.所有连接可以用myisamchk -r删除.
1.5压缩表的特点
1.5.1一张用myisampack实用程序制作的只读表.
1.5.2解压缩代码存在于所有MySQL(和PHP搭配之最佳组合)分发中,以便使没有myisampack的连接也能读取用myisampack压缩的表
1.5.3占据很小的磁盘空间
1.5.4每个记录被单独压缩.一个记录的头是一个定长的(1~~3个字节)这取决于表的最大记录.每列以不同的方式被压缩.一些常用的压缩类型是:
a:通常对每列有一张不同的哈夫曼表 b:后缀空白压缩 c:前缀空白压缩 d:用值0的数字使用1位存储
e:如果整数列的值有一个小范围,列使用最小的可能类型来存储.例如:如果所有的值在0到255之间,一个bigint可以作为一个tinyint存储
g:如果列仅有可能值的一个小集合,列类型被转换到enum h:列可以使用上面的压缩方法的组合
1.5.5能处理定长或动态长度的记录,去不能处理blob或者text列 1.5.6能用myisamchk解压缩
MySQL(和PHP搭配之最佳组合)能支持不同的索引类型,但一般的类型是isam,这是一个B树索引并且能粗略的为索引文件计算大小为(key_length+4)*0.67,在所有的键上的总和.
字符串索引是空白压缩的。如果第一个索引是一个字符串,它可将压缩前缀如果字符串列有很多尾部空白或是一个总部能甬道全长的varchar列,空白压缩使索引文件更小.如果很多字符串有相同的前缀.
1.6内存表的特点
MySQL(和PHP搭配之最佳组合)内部的heap表使用每偶溢出去的100%动态哈希并且没有与删除有关的问题.只能通过使用在堆表中的一个索引来用等式存取东西(通常用'='操作符)
堆表的缺点是:
1.6.1想要同时使用的所有堆表需要足够的额外内存
1.6.2不能在索引的一个部分搜索
1.6.3不能按顺序搜索下一个条目(即,使用这个索引做一个order by)
1.6.4MySQL(和PHP搭配之最佳组合)不能算出在2个值之间大概有多少行.这被优化器使用是用来决定使用哪个索引的,但是在另一个方面甚至不需要磁盘寻道
更多精彩
赞助商链接