技术开发 频道

mysql数据库的优化

    第五步

    1:选择一种表类型

    1.1静态myisam

    这种格式是最简单且最安全的格式,它是磁盘格式中最快的.速度来自于数据能在磁盘上被找到的难易程度.当锁定有一个索引和静态格式的东西是,它很简单,只是行长度乘以数量.而且在扫描一张表时,每次用磁盘读取来读入常数个记录是很容易的.安全性来源于如果当写入一个静态myisam文件时导致计算机down掉,myisamchk很容易指出每行在哪里开始和结束,因此,它通常能收回所有记录,除了部分被写入的记录.在mysql中所有索引总能被重建

    1.2动态myisam

    这种格式每一行必须有一个头说明它有多长.当一个记录在更改期间变长时,它可以在多于一个位置上结束.能使用optimize tablename或myisamchk整理一张表.如果在同一个表中有像某些varchar或者blob列那样存取/改变的静态数据,将动态列移入另外一个表以避免碎片.

    1.2.1压缩myisam,用可选的myisampack工具生成

    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分发中,以便使没有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能支持不同的索引类型,但一般的类型是isam,这是一个B树索引并且能粗略的为索引文件计算大小为(key_length+4)*0.67,在所有的键上的总和.

    字符串索引是空白压缩的。如果第一个索引是一个字符串,它可将压缩前缀如果字符串列有很多尾部空白或是一个总部能甬道全长的varchar列,空白压缩使索引文件更小.如果很多字符串有相同的前缀.

    1.6内存表的特点

    mysql内部的heap表使用每偶溢出去的100%动态哈希并且没有与删除有关的问题.只能通过使用在堆表中的一个索引来用等式存取东西(通常用'='操作符)

    堆表的缺点是: 1.6.1想要同时使用的所有堆表需要足够的额外内存 1.6.2不能在索引的一个部分搜索

    1.6.3不能按顺序搜索下一个条目(即,使用这个索引做一个order by)

    1.6.4mysql不能算出在2个值之间大概有多少行.这被优化器使用是用来决定使用哪个索引的,但是在另一个方面甚至不需要磁盘寻道 

0
相关文章