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. indesign排版标点挤压_我於\LaTeX 中文直排实践中所感受的排版需求
  2. 用scikit-learn学习K-Means聚类
  3. ArcGIS实验教程——实验十六:空间数据查询
  4. java 网格布局管理器,Java使用网格组布局管理器
  5. MySQL创建企业信息表,基于数据库mysql创建学生信息表(简易版)
  6. 一文搞懂 Flink如何移动计算
  7. win7计算机无法远程桌面连接,解决win7无法被远程桌面连接教程
  8. 你一生中要听的一百首英文电影插曲
  9. 简析 React Native 用户反馈功能实现
  10. eclipse中JSP文件编写乱码问题及解决方案
  11. 洛谷 - P3374 树状数组1
  12. suse linux乱码,轻松解决Suse中文乱码问题
  13. /usr/bin/ld: cannot find -lxxx 问题 解决方法总结
  14. Dubbo集群容错模式之Failsafe实现
  15. 高斯混合模型(GMM--Gaussian mixture model)
  16. mac安装软件允许任何来源(sudo spctl --master-disable)
  17. macos系统里面,蓝牙鼠标偶尔卡顿,飘的问题
  18. [转载自宋博士博客]如何在ANSYS WORKBENCH中进行多载荷步的静力分析?
  19. php相减获取网卡流量,linux下查看网卡实时流量工具
  20. 分布式基础通信协议:paxos,totem和gossip

热门文章

  1. ASAM_CCP_V2.1.0_cn
  2. 基于OpenCV双边滤波器的人脸美化 .
  3. 第1讲、Cadence Allergo绘制小马哥DragonFly四轴飞行器PCB四层板教程简介
  4. Python-matplotlib画图,柱状图,双柱图,折线图,散点图,饼图,线柱混合图。附代码模板与详细注释
  5. Appium+夜神模拟器模拟人为操作
  6. 百度AI Studio飞桨平台 “深度学习”结课总结
  7. Linux下线程池概念详解以及代码演示
  8. 给轮廓画出矩形和圆形边界
  9. 百度地图开发:H5获取GPS-wg84经纬度与百度定位API的偏差测试
  10. 当前 IT 行业,软件开发应该掌握的几种编程语言,你学会了几种?