当前位置:七道奇文章资讯数据防范MySQL防范
日期: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-1

2、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城市保存字符串末尾的空格.
只分配真正需求的空间
利用varchar(5)和varchar(200)保存'hello'占用空间是一样的.——这里应当指的是磁盘上的空间.
那么利用较短列有何上风?——宏大的上风
  较大的列会利用更多的内存,因为MySQL普通会分配固定大小的内存块(如varchar(200)会用200个字符大小的内存空间)来保存值(然后对值举行trim操作,最后放入磁盘)或取值.——这对排序或利用基于内存的暂时表特别不好.

2、char   (1)固定长度.   (2)保存值时,去掉末尾的空格.

咱们再看看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字节存储空间.

普通利用TIMESTAMP,它比DATETIME更节俭空间.有时人们把Unix的时间戳保存为整数值,但是这普通没有任何好处.——这种格局处理起来不太便利,我们并不举荐它.

经验扳谈   1、我们在为列挑选数据范例的时刻,不但要考虑存储范例大小,还要考虑MySQL若何对它们举行计算和对比.比方:MySQL在内部把ENUM和SET范例保存为整数,但是在对比的时刻把它们转换为字符串.   2、我们要在相关表中利用一样的范例,范例之间要切确匹配,包含诸如UNSIGNED这样的属性.   3、混合差别的数据范例会招致性能问题,即便没有性能问题,隐式的范例转换也能招致难以发觉的错误.   4、挑选最小的数据范例要考虑将来留出的增长空间.如,中国的省份,我们知道不会有不计其数个,因此没必要用INT.TINYINT就充足了,它比INT小3字节.   5、整数普通是最佳的数据范例,因为它速度快,并且能利用AUTO_INCREMENT.   6、要尽大概避免字符串做为列的数据范例,因为它们占用了很多空间并且普通必整数范例要慢.MyISAM默许情形下为字符串利用了紧缩索引,这使查找更为迟钝.    总结 若有错误,望请大侠指教1、二,不胜感激! 参考文献:《高性能MYSQL》   以上是“MySQL 请挑选符合的列[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Windows 搭配 IIS7 PHP MySQL 环境
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • mysql数据库插入速度和读取速度的调整记录
  • MySQL Order By索引优化办法
  • MySQL Order By用法分享
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • MySQL Order By Rand()效率解析
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .