1、优化的数据类型(只列举了常用的数据类型)
1.1整数类型
整数类型有:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 。分别使用8,16,24,32,64位存储空间,存储的值的范围是从-2^(N-1) 到 2^(N-1)-1,其中N 是存储空间的位数。
整数类型有可选的UNSIGNED属性,表示不允许负值,可以让正数的上限提高一倍。例如 TINYINT,UNSIGNED可以存储的范围是0-255,而TINYINT的存储范围是-128~127。
有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根基实际情况选择合适的类型。
MySQL可以为整数类型指定宽度,例如INT(11),但实际上对大多数应用是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。

  1.2 字符串类型VARCHARVARCHAR用于存储可变长字符串,是最常见的字符串数据类型,它比定长类型更节省空间,因为它仅使用必要的空间(越短的字符串使用越少的空间)。有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储,这会很浪费空间。VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。虽然VARCHAR节省了存储空间,对性能有帮助。但是,由于行是变长的,在UPDATE时可能使行变的比原来更长,这需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MyISAM会将行拆分成不同的片段存储,InnoDB需要分裂页来使行可以放进页内。适合使用VARCHAR的情况:字符串的最大长度比平均长度大很多;列的更新很少,所以碎片不是问题;使用UTF-8复杂的字符集,每个字符使用不同的字节数进行存储。在5.0或者更高版本,MySQL在存储和检索时会保留末尾空格。InnoDB则更灵活,它可以把过长的VARVHAR存储为BLOB。CHARCHAR类型是定长的:MySQL会根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除所有的末尾空格,CHAR适合存储很短的字符串,或者所有值都接近同一个长度,例如:CHAR非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上也更有效率。例如用CHAR(1)来存储只有Y和N的值,如果采用CHAR类型只需要一个字节,但是VARCHAR(1)却需要两个字节,因为还有一个记录长度的额外字节。1.3日期和时间类型DATETIME这个类型能保存大范围的值,从1001到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMDDHHMMSS的数据种,与时区无关。使用8个字节的存储空间。默认情况下,MySQL以一种可排序的,无歧义的格式显示DATETIME值,例如“2009-12-01 12:22:04”。TIMESTAMPTIMESTAMP类型保存从1970年1月1日午夜以来的秒数,它和UNIX时间戳相同。TIMESTAMP只使用4个字节的存储空间,只能表示从1970年到2038年。MySQL提供了FROM_UNIXTIME()函数把UNIX时间戳转换为日期,并提供了UNIX_TIMESTAMP()函数把日期转换为UNIX时间戳。TIMESTAMP显示值会依赖时区,不同的时区显示的值不一样。TIMESTAMP也有DATETIME没有的特殊属性。默认情况下,如果插入时没有指定第一个TIMESTAMP列的值,MySQL会设置这个列的值为当前时间。除了特殊行为之外,通常也应该尽量使用TIMESTAMP,它比DATETIME空间效率更高。

2、缓存表与汇总表
缓存表:存储可以比较简单从shema其他表获取(但是每次获取的速度比较慢)数据的表(逻辑上冗余的数据)
汇总表:保存的使用GROUP BY语句聚合数据的表(数据不是逻辑上冗余的)
3、加快ALTER TABLE操作的速度
MySQL的ALTER TABLE操作的性能对大表来说是大问题。MySQL执行大部分修改表结构操作的方式是用新的结构创建一个空表,从旧表查询所有数据插入新表,然后删除旧表。这样操作一般会花费大量时间,如果内存不足而表又很大,而且还有很多索引的情况下尤其如此。很多人都有这样的经验,ATER TABLE 操作需要花费数个小时甚至数天才能完成。
一般而言,大部分ALTER TABLE 操作将导致MySQL服务中断。对常见的场景,能使用的技巧只有两种:一种是先在一台不提供服务的机器上执行ALTER TABLE操作,然后和提供服务的主库进行切换;另外一种技巧是“影子拷贝”。影子拷贝的技巧是用要求的表结构来创建一张和源表无关的信标,然后通过重命名和删表操作交换两张表。
不是所有的ALTER TABLE操作都会引起表重建。例如,有两种方法可以改变或者删除一个列的默认值(一种方法很快,另外一种则很慢)。
很慢的方式:ALTER TABLE A MODEIFY COLUMN a TINYINT(3) NOT NULL DEFAULT 5;
通过SHOW STATUS显示这个语句做了1000次读和1000次插入操作。它拷贝了整张表到一张新表,甚至列的类型、大小和可否为NULL属性都没改变。
理论上,MySQL可以跳过创建新表的步骤。列的默认值实际上存储表的.frm文件中,所以可以直接修改这个文件而不需要改动表本身。然而MySQL还没有采用这种优化的方法,所有的MODIFY COLUMN 操作都会导致表重建。
另外一种方式是通过ALTER COLUMN
ALTER TABLE A ALTER COLUMN a TINYINT(3) DEFAULT 5;这个语句会直接修改.frm文件而不涉及表数据。所以,这个操作是非常快的。
下面这些操作是有可能不需要重建表的:
1、移除一个列的AUTO_INCREMENT属性。
2、增加、移除,或更改ENUM和SET常量。如果移除的是已经有行数据用到其值的常量,查询将会返回一个空自串值。
基本的技术是为想要的表结构创建一个新的.frm文件,然后用它替换掉已经存在的那张表的.frm文件,像下面这样:
1、创建一张相同结构的空表,并进行所需要的修改(例如增加ENUM常量)
2、执行FLUSH TABLES WITH READ LOCK。这会关闭所有正在所用的表,并且禁止任何表被打开。
3、交换.frm文件
4、执行UNLOCK TABLS 来释放第2步的读锁。

总结:
简单设计数据库的原则:
1、使用小而简单的合适数据类型,尽可能的避免使用NULL值。
2、尽量使用整型定义标识列。
3、避免使用MSQL已经遗弃的特性,例如指定浮点数的精度,或者整数的显示宽度。

Shema与数据类型优化相关推荐

  1. mysql 数值 字符 优化,教你如何进行Mysql数据类型优化

    1. 版本 1)操作系统版本 cat /proc/version Linux version 3.10.0-957.5.1.el7.x86_64 (mockbuild@kbuilder.bsys.ce ...

  2. MySQL查询过程及Scheme设计与数据类型优化

    MySQL查询过程 我们总是希望MySQL能够获得更高的查询性能,最好的办法是弄清楚MySQL是如何优化和执行查询的.一旦理解了这一点,就会发现:很多的查询优化工作实际上就是遵循一些原则让MySQL的 ...

  3. mysql表设计很多非常大的varchar_聊一聊数据库(MySQL)设计中的数据类型优化

    良好的逻辑设计和物理设计事高性能的基石,在进行数据库设计时,我们应该要考虑到未来将会执行的查询语句,这就需要对各种因素进行权衡.本文将会聊一聊数据库(MySQL)设计中有关数据类型优化的一些内容.以下 ...

  4. 【2. 表结构设计和数据类型优化】

    表结构设计和数据类型优化 数据库表设计 ​ 良好的表结构设计是高性能的基石,应该根据系统将要执行的业务查询来设 计,这往往需要权衡各种因素.糟糕的表结构设计,会浪费大量的开发时间,严 重延误项目开发周 ...

  5. 高性能Mysql--Schema与数据类型优化

    目录 选择优化的数据类型 选择数据类型的原则 数据类型 整数 实数 字符串 日期和时间 选择标识符 schema设计中的陷阱 范式和反范式 缓存表和汇总表 物化视图 计算器表 加快ALTER TABL ...

  6. mysql schema数据混乱_MySQL之Schema与数据类型优化

    选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好 一般情况下,应该尽量使 ...

  7. Mysql高性能笔记(一):Schema与数据类型优化

    1.数据类型 1.1.几个参考优化原则 a.  更小的通常更好 i.更小的数据类型,占用更少磁盘.内存和CPU缓存,需要的CPU周期更少 ii.如果无法确定哪个数据类型是最好的,就选择不会超过范围的最 ...

  8. mysql eva模型_第四章 Schema 与数据类型优化

    1.选择优化的数据类型 更小的通常更好 一般情况下选择可以正确存储数据的最小数据类型.更小的类型通常更快,占用更少的硬盘.内存.CPU等.但要确保没有递归需要存储的值的范围. 简单就好 简单数据类型的 ...

  9. 【MySQL】Schema与数据类型优化

    目录 选择优化的数据类型 整数类型 实数类型 字符串类型 日期和时间类型 位置据类型 选择标识符 特殊类型数据 MySQL schema 设计中的陷阱 范式和反范式 缓存表和汇总表 加快 ALTER ...

最新文章

  1. 计算机二年级考试word,计算机二年级MSOffice真题.docx
  2. unittest框架(三)unittest+yaml数据驱动
  3. 关于 Oracle分页数据重复的问题
  4. 机器学习:分类_机器学习基础:K最近邻居分类
  5. java null转换jason_常见java问题及解决办法汇总(干货可收藏)
  6. 人的“肥胖”基因FTO可促进水稻和土豆增产50% - 中国粮食、中国饭碗
  7. python订单管理系统软件_有什么订单管理软件系统是好用的?
  8. html5自动生成图片,HTML5拖放API如何实现自动生成相框功能 HTML5拖放API实现自动生成相框功能代码...
  9. java中static修饰函数_详解java中static关键词的作用
  10. 响应式网站设计 - 最佳实践
  11. 从人工到自动,泛微云上自动化部署实践
  12. javaktv点歌系统项目(java点歌系统)java点歌管理系统
  13. 线性代数的本质(第二部分)
  14. 解决:No routes matched location “/“
  15. jquery中的data-icon和data-role
  16. vcs -xprop的理解
  17. 微信墙java源码_高仿微信java代码
  18. Python基于time库对时间分钟等级进行运算
  19. pk 与fk mysql_什么是MySQL FK的正确命名约定?
  20. Ubuntu17.10如何安装网易云音乐并解决无法打开

热门文章

  1. 双端口USB Type-C控制器 CYPD6227 (CYPD6227-96BZXI)
  2. 降本增效,合作伙伴营销助力业绩增长
  3. 珞珈-B生所学 跟学笔记 PPT(一)
  4. 我的世界基岩版超简单红石教程3
  5. tbf格式用什么打开_TBF的完整形式是什么?
  6. 爱沙尼亚LHV银行矢志不渝,设立区…
  7. Linux命令 ln
  8. VMware解决:未能将管道连接到虚拟机: 所有的管道范例都在使用中。
  9. 咏南开发框架之日志管理
  10. javaFX实现登录界面并跳转