MySQL数据库技术(22)[MySQL防范]
本文“MySQL数据库技术(22)[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
? 4.3 列范例挑选与查询效率
? ? 要挑选有助于使查询履行更快的列,应遵守以下法则(这里,"BLOB 范例"应当理解为即包含B L O B也包含TEXT 范例):
? ? ■ 利用定长列,不利用可变长列.这条原则对被常常改正,从而简单产生碎片的表来说分外重要.比方,应当挑选CHAR 列而不挑选VARCHAR 列.所要衡量的是利用定长列时,表所占用的空间更多,但假如可以承当这种空间的耗费,利用定长行将比利用可变长的行处理快得多.
? ? ■ 在较短的列可以满意要求时不要利用较长的列.假如正利用的是定长的CHAR 列,应当使它们尽大概短.假如列中所存储的最长值为40 个字符,那么就不要将其定义为CHAR ( 2 5 5 );只要定义为CHAR(40) 便可.假如可以利用MEDIUMINT 而不是BIGINT,表将会更小(磁盘I/O 也较少),其值在计算中也可以处理得更快.
? ? ■ 将列定义为NOT NULL.这样处理更快,所需空间更少.并且有时还能简化查询,因为不需求查抄能否存在特例N U L L.
? ? ■ 考虑利用ENUM 列.假若有一个只含有限数目的特定值的列,那么应当考虑将其转换为ENUM 列.ENUM 列的值可以更快地处理,因为它们在内部是以数值表示的.
? ? ■ 利用PROCEDURE ANALYSE( ).假如利用的是MySQL 3.23 或更新的版本,应当履行PROCEDURE ANALYSE( ),查看它所供应的关于表中列的信息:
? ? 呼应输出中有一列是关于表中每列的最佳列范例的倡议.第二个例子要求PROCEDURE ANALYSE( ) 不要倡议含有多于16 个值或取多于256 字节的ENUM 范例(可按照需求更改这些值).假如没有这样的限制,输出大概会很长;ENUM 的定义也会很难阅读.按照PROCEDURE ANALYSE( ) 的输出,会发现可以对表举行更改以操纵更有效的范例.假如但愿更改值范例,利用A LTER TABLE 语句便可.
? ? ■ 将数据装入B L O B.用BLOB 存储利用程序中包装或未包装的数据,有大概使本来需求几个检索操作才能完成的数据检索得以在单个检索操作中完成.并且还对存储尺度表构造不易表示的数据或随时间改变的数占据帮忙.在第3 章A LTER TABLE 语句的介绍中,有一个例子处理存储来自Web 问卷的后果的表.该例子中谈论了在问卷中增添问题时,怎样操纵A LTER TABLE 向该表追加列.
? ? 办理该问题的另一个办法是让处理Web 的利用程序将数据包装成某种数据构造,然后将其插入单个BLOB 列.这样会增添利用程序对数据举行解码的开销(并且从表中检索出记录后要对其举行编码),但是简化了表的构造,并且不用在更改问卷时对表举行更改.另一方面, BLOB 值也有自己的固有问题,分外是在举行大量的DELETE 或UPDATE 操作时更是如此.删除BLOB 会在表中留下一个大空白,在今后将需用一个记录或大概是差别大小的多个记录来填充.
? ? ■ 对简单产生碎片的表利用OPTIMIZE TA B L E.大量举行改正的表,分外是那些含有可变长列的表,简单产生碎片.碎片不好,因为它在存储表的磁盘块中产生不利用的空间.随着时间的增长,必须读取更多的块才能取到有效的行,从而降低了性能.肆意具有可变长行的表都存在这个问题,但这个问题对BLOB 列更为突出,因为它们尺寸的改变非常大.常常利用OPTIMIZE TABLE 有助于保持性能不下降.
? ? ■ 利用合成索引.合成索引列有时很有效.一种技术是按照其他列成立一个散列值,并将其存储在一个独立的列中,然后可通过搜索散列值找到行.这只对切确匹配的查询有效.(散列值对具有诸如" <"或" > ="这样的操作符的范围搜索没有效处).在MySQL 3.23版及以上版本中,散列值可操纵MD5( ) 函数产生.散列索引对BLOB 列分外有效.有一事要注意,在MySQL 3.23.2 从前的版本中,不能索引BLOB 范例.乃至是在3.23.2 或更新的版本中,操纵散列值作为标识值来查找BLOB 值也比搜索BLOB 列本身更快.
? ? ■ 除非有必要,不然应避免检索较大的BLOB 或TEXT 值.比方,除非必定WHERE 子句可以将后果刚好限制在所想要的行上,不然SELECT * 查询不是一个好办法.这样做大概会将非常大的BLOB 值无目的地从网络上拖过来.这是存储在另一列中的BLOB 标识信息很有效的另一种情形.可以搜索该列以肯定想要的行,然后从限定的行中检索BLOB 值.
? ? ■ 将BLOB 值断绝在一个独立的表中.在某些情形下,将BLOB 列从表中移出放入另一个副表大概具有一定的意义,条件是移出BLOB 列后可将表转换为定长行格局.这样会削减主表中的碎片,并且能操纵定长行的性能上风.
以上是“MySQL数据库技术(22)[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |