高性能MySql进化论(二):数据类型的优化_下

标签: 性能 mysql 进化论 | 发表时间:2013-09-05 06:49 | 作者:sun7545526
出处:http://blog.csdn.net

·        BLOB/TEXT
在实际的应用程序中往往需要存储两种体积较大的数据,一种是较大的Binary数据,e.g. 一张10M的图片,另外一种是 较大的文本 e.g.一篇几万字的文章。在Oracle中有BOLB和CLOB来应对这两种数据,而在MySQL中对应的是BLOB以及TEXT.
鉴于这两种数据类型的特殊性,在MySQL中对BLOB以及TEXT的存储和操作做了特殊的处理:
          1) BLOB/TEXT 的值往往是作为对象来处理,这些对象有自己的ID,以及独立的存储空间
          2) BLOB/TEXT的值被用来排序的时候,只有前N个字节会被使用,N 对应的是数据库中的一个常量值 ( max_sort_length), 如果你想指定更多的字节被用来排序,那么你可以增加 max_sort_length的值或者是使用 ORDER BY SUBSTRING(column, length)函数来处理
          3) 当BLOB/TEXT 被用作索引或者排序的时候,不能使用整个字段的值.
在万不得已的情况下要避免把BOLB/TEXT用作索引或是排序

因为MySQL 的Memory 引擎不支持BLOB 和TEXT 类型,所以,如果查询的过程中涉及到BLOB /TEXT,则需要使用MyISAM 磁盘临时表,即使只有几行数据也是如此(在最新的Percona Server 的Memory 引擎支持BLOB 和TEXT 类型)。

Memory引擎频繁的访问磁盘临时表会产生严重的性能开销,最好的解决方案是尽量避免使用BLOB 和TEXT 类型。如果实在无法避免,有一个技巧是在所有用到BLOB 字段的地方都使用SUBSTRING(column, length) 将列值转换为字符串(在ORDER BY 子句中也适用),这样就可以使用内存临时表了。但是要确保截取的子字符串足够短,不会使临时表的大小超过max_heap_table_size 或tmp_table_size,超过以后MySQL 会将内存临时表转换为MyISAM 磁盘临时表。

 

最坏情况下的长度分配对于排序的时候也是一样的,所以这一招对于内存中创建大临时表和文件排序,以及在磁盘上创建大临时表和文件排序这两种情况都很有帮助。例如,假设有一个1 000 万行的表,占用几个GB 的磁盘空间。其中有一个utf8字符集的VARCHAR(1000) 列。每个字符最多使用3 个字节,最坏情况下需要3 000字节的空间。如果在ORDER BY 中用到这个列,并且查询扫描整个表,为了排序就需要超过30GB 的临时表


·       DATETIME/TIMESTAMP
在MySQL中包含两种时间格式 DATETIME,TIMESTAMP, 通常在使用的过程中这两种类型区别不是很大,但是在细节上还是存在差别

 

DATETIME

TIMESTAMP

占用空间

8Bytes

4Bytes

可表示区间(年)

1001-9999

1970-2038

是否与时区有关

存储内容

日期和时间封装到格式为YYYYMMDDHHMMSS 的整数中

保存了从1970 年1 月1 日午夜(格林尼治标准时间)以来的秒数,它和UNIX 时间戳相同

显示方式是否与时区有关

否(ANSI 标准定义的日期和时间表示方法)

特殊属性

 

(1)TIMESTAMP 列默认为NOT NULL,默认值为当前时间

因为TMESSTAMP会占用更小的存储空间,所以可以使用它作为默认的时间格式

·       ENUM
这种类型的字段主要是通过枚举的方式来保存列的值,因为在使用的过程中会涉及到枚举位置与实际值的转换,所以对于整体的性能可能会有 一定的影响,而且枚举的值是存储在 .frm(数据表结构定义文件)中,所以当建立完ENUM的列后,如果你想对EMUM的内容进行更新,也就相当于做了表结构的更新。
下面是个简单建立ENUM列的例子:

mysql> CREATE TABLEenum_test(

->  e ENUM('fish', 'apple', 'dog') NOT NULL

-> );

mysql> INSERT INTOenum_test(e) VALUES('fish'), ('dog'), ('apple');


·        BIT
如果需要让你设计一个表示布尔值的字段要求占用的空间最少,你会如何去设计?用INT,还是用CHAR(1)?相比INT以及CHAR(1)而言BIT(1)或许是个更好的选择,因为它占用的空间只是一个BIT。它可以通过BIT(N)的方式来表达多个BIT的值,这种方式最大支持到BIT(64)。

在MySQL5.0之前的版本中,BIT被认为是和TINYINT等同的,在新的版本中被作为两种完全不同的类型来对待。

当你把一个BIT字段从数据库中检索出来显示在控制台上时,值会被显示成ASCII编码,当字段的值出在一个数字运算的上下文时,它会被当成是BIT的十进制的值,下面的一个例子可以很清楚的说明这两种情况


mysql>CREATE TABLE bittest(a bit(8));

mysql> INSERT INTObittest VALUES(b'00111001');

mysql> SELECT a, a+ 0 FROM bittest;
+------+-------+

| a | a + 0 |

+------+-------+

| 9 | 57 |

+------+-------+

上面的这个例子或许会让你感到困惑,很有可能让你不再想使用这种机制来存储单个的位,作为一种替代方案可以把相关字段设置成 CHAR(0) NULL用来表示False, ””(Empty String)表示True


更多内容请参考 

高性能MySql进化论(一):数据类型的优化_上


作者:sun7545526 发表于2013-9-4 22:49:49 原文链接
阅读:76 评论:0 查看评论

相关 [性能 mysql 进化论] 推荐:

高性能MySql进化论(二):数据类型的优化_下

- - CSDN博客数据库推荐文章
在实际的应用程序中往往需要存储两种体积较大的数据,一种是较大的Binary数据,e.g. 一张10M的图片,另外一种是 较大的文本 e.g.一篇几万字的文章. 在Oracle中有BOLB和CLOB来应对这两种数据,而在MySQL中对应的是BLOB以及TEXT. 鉴于这两种数据类型的特殊性,在MySQL中对BLOB以及TEXT的存储和操作做了特殊的处理:.

高性能MySql进化论(四):Summary,Cache,Counter表的使用

- - CSDN博客数据库推荐文章
在实际的应用中,往往会定期的对一个周期内的系统数据进行统计分析. 例如某购物网站定期的统计商品在一个月/年期内的销售情况,如果采用扫描所有相关表的方式在某个时间点进行统计分析, 由于数据量很大,以及表结构的复杂,性能可能会是很大的问题. 针对这种情况可以通过使用Summary,Cache,Counter 数据表的方式来提高分析的效率.

高性能MySql进化论(一):数据类型的优化_上

- - CSDN博客数据库推荐文章
在数据库的性能调优的过程中会涉及到很多的知识,包括字段的属性设置是否合适,索引的建立是否恰当,表结构涉及是否合理,数据库/操作系统 的设置是否正确…..其中每个topic可能都是一个领域. 在我看来,在数据库性能提升关键技术中,对字段的优化难度相对较低且对性能的影响也非常的大. 由于Mysql支持的数据类型比较多,且每个类型都有其独特的特性,但是有时候在选择一个具体的数据类型时,往往都是随意的选择一个能用的类型,而不会考虑到这个类型是否是最优的.

MySQL 性能

- - 谁主沉浮
这里罗列了一些基本的 MySQL 性能提示,但不是放之四海而皆准,需要根据实际的应用情况而决定. 使用标准化设计(数据库三范式),记住表的联合查询(join)性能不会差. 选择合适的字符集,虽然UTF16无所不能,但需要两倍的存储;UTF8适合各种字符,但比latin1慢,尽可能选用latin1(此条不适合中文).

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

Mysql性能优化

- - 数据库 - ITeye博客
MySQL性能优化.   性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间. 性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等.   数据库管理人员可以使用SHOW STATUS语句来查询MySQL数据库的性能. 语法:SHOW STATUE LIKE ‘value’;其中value参数是常用的几个统计参数.

mysql 5.6性能vs mysql 5.5的讨论

- - ITeye博客
这几天老外就mysql 5.6和5.5,MariaDB的benchmark讨论的很热烈,参考http://t.cn/zYoXNND一文,而法国朋友身先士卒,在http://t.cn/zYKgDmk中一连做了多个评测. 1) 在大名顶顶的percona公司的Peter Zaitsev 一文中(http://www.mysqlperformanceblog.com/2013/02/18/is-mysql-5-6-slower-than-mysql-5-5/).

mysql性能优化教程

- coolzsb - caoz的和谐blog

mysql性能最大化

- - CSDN博客数据库推荐文章
#跳过外部锁定 只对MyISAM. #禁用tcp socket连接,只能使用unix/linux socket连接. #禁用DNS解析,提高连接速度. #跳过授权表,忘记root密码时使用. #服务器关闭一个交互连接前等待的秒数,默认28800. #线程缓存数,直接利用空闲连接来创建新连接,1G  —> 8 2G  —> 16 3G  —> 32 >3G  —> 64.

MySQL性能建议者:mysqltuner.pl

- - CSDN博客数据库推荐文章
一些简单的命令可从 --help 查阅. 输出结果简单明了,读者有兴趣可参阅官网博客. 作者:linwaterbin 发表于2013-10-23 0:13:37 原文链接. 阅读:147 评论:0 查看评论.