bitsCN.com

思维导图

点击图片,可查看大图。

介绍 情况:如果你的表结构设计不良或你的索引设计不佳,那么请你优化你的表结构设计和给予合适的索引,这样你的查询性能就能提高几个数量级。――数据越大,索引的价值越能体现出来。 我们要提高性能,需要考虑的因素: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默认情况下为字符串使用了压缩索引,这使查找更为缓慢。    总结 若有错误,望请大侠指教一、二,不胜感激! 参考文献:《高性能MYSQL》bitsCN.com

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

什么时候不选择mysql_MySQL请选择合适的列_MySQL相关推荐

  1. 解决FileZilla 报错“无法和 SFTP 服务器建立 FTP 连接,请选择合适的协议”

    FileZilla是一个免费开源的FTP软件,可以快速方便的实现PC与服务器之间文件传输. 建立SFTP连接流程: 1. 云服务器创建 SSH 登录账号和密码 2.确认云服务器允许端口号20/21/2 ...

  2. html基本标签斜体,请选择产生斜体字的HTML标签:

    请选择产生斜体字的HTML标签: 答: 齐白石学习下列哪位书法家的行草 答:何绍基 智慧职教: 以下程序的运行结果是: def increment(): x=0 x+=1 print(x,end='' ...

  3. 文件夹的位置_win10添加网络位置向导 提示:‘输入的文件夹似乎无效。请选择另一个’解决方法...

    添加网络位置向导 提示:输入的文件夹似乎无效.请选择另一个. 出现这个错误的原因:新到手的电脑,用的是最新版的win10,根据Windows官方提示没有默认安装服务器消息块版本1 (SMBv1) 网络 ...

  4. 通过数据库绑定的dropdownlist,如何让其第一条默认显示--请选择--

    第一种方法 DropDownList1.Items.Insert(0,"请选择XXX"); 第二种方法 在第一个位置插入一个项就可以 DropDownList1.Items.Ins ...

  5. 在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则。

    在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则. 参考答案: 磁盘簇(或i节点密度)是文件系统调度文件的基本单元.磁盘簇的大小,直接影响系统调度磁盘空间 ...

  6. 试分析下列程序段:请选择(L1、L2、L3或L4)填入相应的括弧中

    试分析下列程序段:请选择(L1.L2.L3或L4)填入相应的括弧中ADD AX, BXJNO L1JNC L2JS L3JMP SHORT L4如果AX=147BH.BX=147BH时,程序转向(①) ...

  7. 用ArrayList作数据源为ComboBox绑定,带“请选择...”

    这几天一直想给ComboBox加个"请选择..."项,不过老提示使用DataSource后不能修改其属性 上网查了查,自己试了试,终于成功了...呵呵.... 用ArrayList ...

  8. ewebeditor在上传文件时,总是提示“请选择一个有效的文件”,

    用ewebeditor在上传文件时,总是提示"请选择一个有效的文件",可我上传的文件格式明明是正确的,而且在XP上测试时一切正常啊,难道是程序有问题?经过研究终于找到了问题所在. ...

  9. linq绑定下拉列表,combobox中增加listitem的方法,增加“请选择”

    第一步:自定义一个类ListItem public class ListItem     {         private string text = string.Empty;         p ...

最新文章

  1. 百分点大数据技术团队:数据治理“PAI”实施方法论
  2. 超详细的 Bert 文本分类源码解读 | 附源码
  3. pip install mysqlclient报错: error: command ‘gcc‘ failed with exit status 1 OSError: mysql_config no
  4. 我不建议你这样进军人工智能……
  5. 人工智能 信道估计 深度学习_DEMO演示|基于IVP02D 人工智能工作站的深度学习引擎,实现人群热力估计...
  6. 第二阶段个人博客总结7
  7. Tomcat 添加为系统服务 开机自动启动
  8. 联想ghost重装系统_联想一键ghost重装系统步骤
  9. 【ICLR2020】基于模型的强化学习算法玩Atari【附代码】
  10. rocketMq配置外网IP
  11. SpringBoot、SpringCloud版本中GA/PRE/SNAPSHOT的详解
  12. c#上位机plc通讯读位
  13. kanzi学习第二天-----创建一个状态机
  14. php获取视频信息,支持优酷土豆新浪腾讯等多家网站
  15. mysql 创建外部表_Greenplum
  16. Swoole进阶——02 内存之Table
  17. c语言数字的写法田字格,数字100田字格怎么写
  18. MacBook到底该怎么选?
  19. 【linux kernel】基于ARM64分析linux内核的链接脚本vmlinux.lds.S
  20. 程序员来聊一聊信用卡(三)——信用卡的一些基本分类

热门文章

  1. win创建linux目录,Windows与Linux上的文件创建时间
  2. 歌曲信息管理c语言,歌曲信息管理系统——C语言
  3. 基于matlab 系统仿真学报,基于MATLAB/Simulink的混合动力汽车正向仿真软件的开发...
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的大学生考勤管理系统及智能分析系统
  5. 基于JAVA+Servlet+JSP+MYSQL的失物招领系统
  6. Linux—文件命令之touch命令
  7. 20155310 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
  8. 偶然发现SQL2005中文版里有vs2005中文安装包
  9. printf输出16进制数
  10. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)