日期:2012-06-02 15:07:00 来源:本站整理
MySQL 请挑选符合的列[MySQL防范]
本文“MySQL 请挑选符合的列[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
思维导图
点击图片,可查看大图.
介绍 情形:假如你的表构造计划不良或你的索引计划不佳,那么请你优化你的表构造计划和赐与符合的索引,这样你的查询性能就可以提高几个数目级.——数据越大,索引的代价越能表现出来. 我们要提高性能,需求考虑的因素: 1、计划架构 2、计划索引 3、评价查询性能 本日要讲的是表列的计划,暂不谈索引计划.我会在下一章讲索引计划. 挑选数据范例 挑选精确的数据范例,关于提高性能至关重要. 下面给出几种原则,有利于帮忙你挑选何种范例. 1、更小普通更好. 利用最小的数据范例.——更少的磁盘空间,内存和CPU缓存.并且需求的CPU的周期也更少. 2、简单就好. 整数代价小于字符.——因为字符集和排序法则使字符对比更复杂. 1>mysql内建范例(如timestamp,date)优于利用字符串保存. 2>利用整数保存ip地址. 3、尽大概避免NULL——假如筹划对摆列行索引,尽大概避免把列设置为NULL 尽大概把字段定义为NOT NULL.——可以安排一个默许值,如‘',0,特别字符串. 缘由: (1)MYSQL难以优化NULL列.NULL列会使索引,索引统计和值越发复杂. (2)NULL列需求更多的存储空间,还需求在MYSQL内部举行特别处理. (3)NULL列加索引,每条记录都需求一个额外的字节,还招致MyISAM中固定大小的索引变成可变大小的索引.
决意列的数据范例,我们应当遵守下面两步.
第一步、大致决意数据范例.——判断是数字,字符串还是时间等.这普通很直观.
第二步、肯定特定的范例.
很大都据范例可以保存同范例的数据,但是我们要发现,他们在存储的范围,精度和物理空间之间的差别(磁盘或内存空间).如:datetime和timestamp能保存一样范例的数据:日期和时间.——timestamp利用datetime一半的空间;能保存时区;拥有特别的自动更新本领.
品味数据范例 整数 1、存储范例——数据范围为-2^(n-1)到2^(n-1)-1,这里的n是所需存储空间的位数. 范例名称 占用位数 数据范围 TINYINT 8 -2^7 ~ 2^7-1 SMALLINT 16 -2^15~2^15-1 MEDIUMINT 24 -2^23~2^23-1 INT 32 -2^31~2^23-1 BIGINT 64 -2^63~2^63-12、unsigned属性表示不答应负数,并大致把正上限提高了一倍.如TINYINT UNSIGNED保存的范围为0到255而不是-127到128
3、MYSQL对整数范例定义宽度,比方int(1)和int(22)关于存储和计算是一样的.只规定了MYSQL的交互工具(如号令行客户端)用来显示字符的个数.
实数 实数有分数部份(小数部份). 存储范例:FLOAT和DOUBLE,DECIMAL. 占用大小:FLOAT 4个字节,DOUBLE 8个字节.DECIMAL遭到MYSQL版本影响,早期版本254个数字,5.0以上65个数字. 辨别:1、FLOAT和DOUBLE支持尺度浮点运算举行近似计算. 2、DECIMAL举行DECIMAL运算,CPU并不支持对它举行直接计算.浮点运算会快一点,因为计算直接在CPU上举行. 3、DECIMAL只是一个存储格局,在计算时会被转换为DOUBLE范例. 4、DECIMAL(18,9)利用9个字节,小数点前4个字节,小数点1个字节,小数点后4个字节. 5、DECIMAL只有对小数举行切确计算的时刻才利用它,如保存金融数据. 字符串范例 1、varchar (1)保存可变长字符串. 理解:比固定长度占用更少的存储空间,因为它只占用自己需求的空间.例外情形:利用ROW_FORMAT=FIXED成立的MyISAM表,它为每行利用固定长度的空间,大概会造成浪费. (2)存储长度信息.假如定义的列小于或等于255,则利用1个字节存储长度值,假定利用latin1字符集,如varchar(10)将占用11个字节的存储空间.反过来,varchar(1000),则占用1002个字节的存储空间. (3)节俭空间,对性能有帮忙. (4)5.0版本以上,无论是取值还是保存,MySQL城市保存字符串末尾的空格.
只分配真正需求的空间2、char (1)固定长度. (2)保存值时,去掉末尾的空格.
利用varchar(5)和varchar(200)保存'hello'占用空间是一样的.——这里应当指的是磁盘上的空间.
那么利用较短列有何上风?——宏大的上风
较大的列会利用更多的内存,因为MySQL普通会分配固定大小的内存块(如varchar(200)会用200个字符大小的内存空间)来保存值(然后对值举行trim操作,最后放入磁盘)或取值.——这对排序或利用基于内存的暂时表特别不好.
咱们再看看varchar
(3)char常用于很短字符串或长度近似相同的字符串的时刻很有效.如存储用户密码的MD5哈希值,它的长度老是一样的. char优于varchar的地方? 1>> 关于常常改变的值,char优于varchar,因为固定长度行不简单产生碎片.——当最长长度宏大于平均长度,并且很少发生更新的时刻,普通合适利用varchar. 2>>关于很短的列,char的效率也是高于varchar的.如关于单字节字符集(如latin1),char(1)只会占用1个字节,而varchar(2)会占用2个字节(有一个字节用来存储长度的信息). 3、text 用于保存大量数据. (1)InnoDB在它们较大的时刻会利用"外部"存储区域来举行保存.——所以需求充足的外部存储空间来保存实际的值. (2)排序方法差别于其他字符范例,不会按照完好长度举行排序,而只是按照max_sort_length规定的前若干个字节举行排序. 4、利用ENUM替换字符串范例 (1)ENUM列可以存储65 535个差别的字符串. (2)以紧凑方法保存.按照列表中值的数目,把它们紧缩到1到2个字节中. (3)MySQL在内部把每个值都保存为整数,以表示值在列表中的位置. (4)保存了一份"查找表",来表示整数和字符串在表的.frm文件中的映射关系. (5)ENUM字符列是固定的,增添、删除字符串须利用ALTER TABLE. (6)利用案例:权限表中利用ENUM来保存Y值和N值. 利用办法:
在对enum列利用order by的时刻,是按数字排序的,而不是字符串排序.
日期和时间范例
DATETIME:保存大范围的值.封装格局:YYYYMMDDHHMMSS.——与时区无关,利用8字节存储空间.TIMESTAMP:保存自1970年1月1日午夜(格林尼治尺度时间)以来的秒数.——利用4字节存储空间.
经验扳谈 1、我们在为列挑选数据范例的时刻,不但要考虑存储范例大小,还要考虑MySQL若何对它们举行计算和对比.比方:MySQL在内部把ENUM和SET范例保存为整数,但是在对比的时刻把它们转换为字符串. 2、我们要在相关表中利用一样的范例,范例之间要切确匹配,包含诸如UNSIGNED这样的属性. 3、混合差别的数据范例会招致性能问题,即便没有性能问题,隐式的范例转换也能招致难以发觉的错误. 4、挑选最小的数据范例要考虑将来留出的增长空间.如,中国的省份,我们知道不会有不计其数个,因此没必要用INT.TINYINT就充足了,它比INT小3字节. 5、整数普通是最佳的数据范例,因为它速度快,并且能利用AUTO_INCREMENT. 6、要尽大概避免字符串做为列的数据范例,因为它们占用了很多空间并且普通必整数范例要慢.MyISAM默许情形下为字符串利用了紧缩索引,这使查找更为迟钝. 总结 若有错误,望请大侠指教1、二,不胜感激! 参考文献:《高性能MYSQL》 以上是“MySQL 请挑选符合的列[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:普通利用TIMESTAMP,它比DATETIME更节俭空间.有时人们把Unix的时间戳保存为整数值,但是这普通没有任何好处.——这种格局处理起来不太便利,我们并不举荐它.
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论