MySQL 数据库设计总结

本文由云+社区发表

作者:漆洪凯

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。

注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节。另外MyISAM数据和索引是分开,而InnoDB的数据存储是按聚簇(cluster)索引有序排列的,主键是默认的聚簇(cluster)索引,因此MyISAM虽然在一般情况下,查询性能比InnoDB高,但InnoDB的以主键为条件的查询性能是非常高的。

规则2:命名规则。

  1. 数据库和表名应尽可能和所服务的业务模块名一致
  2. 服务与同一个子模块的一类表应尽量以子模块名(或部分单词)为前缀或后缀
  3. 表名应尽量包含与所存放数据对应的单词
  4. 字段名称也应尽量保持和实际数据相对应
  5. 联合索引名称应尽量包含所有索引键字段名或缩写,且各字段名在索引名中的顺序应与索引键在索引中的索引顺序一致,并尽量包含一个类似idx的前缀或后缀,以表明期对象类型是索引。
  6. 约束等其他对象也应该尽可能包含所属表或其他对象的名称,以表明各自的关系

规则3:数据库字段类型定义

  1. 经常需要计算和排序等消耗CPU的字段,应该尽量选择更为迅速的字段,如用TIMESTAMP(4个字节,最小值1970-01-01 00:00:00)代替Datetime(8个字节,最小值1001-01-01 00:00:00),通过整型替代浮点型和字符型
  2. 变长字段使用varchar,不要使用char
  3. 对于二进制多媒体数据,流水队列数据(如日志),超大文本数据不要放在数据库字段中

规则4:业务逻辑执行过程必须读到的表中必须要有初始的值。避免业务读出为负或无穷大的值导致程序失败

规则5:并不需要一定遵守范式理论,适度的冗余,让Query尽量减少Join

规则6:访问频率较低的大字段拆分出数据表。有些大字段占用空间多,访问频率较其他字段明显要少很多,这种情况进行拆分,频繁的查询中就不需要读取大字段,造成IO资源的浪费。

规则7:大表可以考虑水平拆分。大表影响查询效率,根据业务特性有很多拆分方式,像根据时间递增的数据,可以根据时间来分。以id划分的数据,可根据id%数据库个数的方式来拆分。

一.数据库索引

规则8:业务需要的相关索引是根据实际的设计所构造sql语句的where条件来确定的,业务不需要的不要建索引,不允许在联合索引(或主键)中存在多于的字段。特别是该字段根本不会在条件语句中出现。

规则9:唯一确定一条记录的一个字段或多个字段要建立主键或者唯一索引,不能唯一确定一条记录,为了提高查询效率建普通索引

规则10:业务使用的表,有些记录数很少,甚至只有一条记录,为了约束的需要,也要建立索引或者设置主键。

规则11:对于取值不能重复,经常作为查询条件的字段,应该建唯一索引(主键默认唯一索引),并且将查询条件中该字段的条件置于第一个位置。没有必要再建立与该字段有关的联合索引。

规则12:对于经常查询的字段,其值不唯一,也应该考虑建立普通索引,查询语句中该字段条件置于第一个位置,对联合索引处理的方法同样。

规则13:业务通过不唯一索引访问数据时,需要考虑通过该索引值返回的记录稠密度,原则上可能的稠密度最大不能高于0.2,如果稠密度太大,则不合适建立索引了。

当通过这个索引查找得到的数据量占到表内所有数据的20%以上时,则需要考虑建立该索引的代价,同时由于索引扫描产生的都是随机I/O,生其效率比全表顺序扫描的顺序I/O低很多。数据库系统优化query的时候有可能不会用到这个索引。

规则14:需要联合索引(或联合主键)的数据库要注意索引的顺序。SQL语句中的匹配条件也要跟索引的顺序保持一致。

注意:索引的顺势不正确也可能导致严重的后果。

规则15:表中的多个字段查询作为查询条件,不含有其他索引,并且字段联合值不重复,可以在这多个字段上建唯一的联合索引,假设索引字段为 (a1,a2,...an),则查询条件(a1 op val1,a2 op val2,...am op valm)m<=n,可以用到索引,查询条件中字段的位置与索引中的字段位置是一致的。

规则16:联合索引的建立原则(以下均假设在数据库表的字段a,b,c上建立联合索引(a,b,c))

  1. 联合索引中的字段应尽量满足过滤数据从多到少的顺序,也就是说差异最大的字段应该房子第一个字段
  2. 建立索引尽量与SQL语句的条件顺序一致,使SQL语句尽量以整个索引为条件,尽量避免以索引的一部分(特别是首个条件与索引的首个字段不一致时)作为查询的条件
  3. Where a=1,where a>=12 and a<15,where a=1 and b<5 ,where a=1 and b=7 and c>=40为条件可以用到此联合索引;而这些语句where b=10,where c=221,where b>=12 and c=2则无法用到这个联合索引。
  4. 当需要查询的数据库字段全部在索引中体现时,数据库可以直接查询索引得到查询信息无须对整个表进行扫描(这就是所谓的key-only),能大大的提高查询效率。 当a,ab,abc与其他表字段关联查询时可以用到索引
  5. 当a,ab,abc顺序而不是b,c,bc,ac为顺序执行Order by或者group不要时可以用到索引
  6. 以下情况时,进行表扫描然后排序可能比使用联合索引更加有效 a.表已经按照索引组织好了 b.被查询的数据站所有数据的很多比例。

规则17:重要业务访问数据表时。但不能通过索引访问数据时,应该确保顺序访问的记录数目是有限的,原则上不得多于10.

二.Query语句与应用系统优化

规则18:合理构造Query语句

  1. Insert语句中,根据测试,批量一次插入1000条时效率最高,多于1000条时,要拆分,多次进行同样的插入,应该合并批量进行。注意query语句的长度要小于mysqld的参数 max_allowed_packet
  2. 查询条件中各种逻辑操作符性能顺序是and,or,in,因此在查询条件中应该尽量避免使用在大集合中使用in
  3. 永远用小结果集驱动大记录集,因为在mysql中,只有Nested Join一种Join方式,就是说mysql的join是通过嵌套循环来实现的。通过小结果集驱动大记录集这个原则来减少嵌套循环的循环次数,以减少IO总量及CPU运算次数
  4. 尽量优化Nested Join内层循环。
  5. 只取需要的columns,尽量不要使用select *
  6. 仅仅使用最有效的过滤字段,where 字句中的过滤条件少为好
  7. 尽量避免复杂的Join和子查询 Mysql在并发这块做得并不是太好,当并发量太高的时候,整体性能会急剧下降,这主要与Mysql内部资源的争用锁定控制有关,MyIsam用表锁,InnoDB好一些用行锁。

规则19:应用系统的优化

  1. 合理使用cache,对于变化较少的部分活跃数据通过应用层的cache缓存到内存中,对性能的提升是成数量级的。
  2. 对重复执行相同的query进行合并,减少IO次数。
  3. 事务相关性最小原则

此文已由腾讯云+社区在各渠道发布

获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

原文地址:https://www.cnblogs.com/qcloud1001/p/10509688.html

时间: 2024-08-26 13:06:54

MySQL 数据库设计总结的相关文章

mysql数据库设计开发规范

1.设计 1. 一般都使用INNODB存储引擎,除非读写比率<1%,才考虑使用MYISAM存储引擎:其他存储引擎请在DBA的建议下使用. 2. Stored procedure (包括存储过程,函数,触发器)对于MYSQL来说还不是很成熟,没有完善的出错记录处理,不建议使用. 3. UUID(),USER()这样的MYSQL INSIDE函数对于复制来说是很危险的,会导致主备数据.不一致.所以请不要使用.如果一定要使用UUID作为主键,让应用程序来产生. 4. 请不要使用外键约束,如果数据存在外

mysql数据库设计

2.MySQL之选择字段数据类型 1.http://blog.itpub.net/29660208/viewspace-1208352/ 3.http://www.cnblogs.com/HondaHsu/p/3640180.html 数据库设计纪要上面是下面的解决办法1.表中特有的字段,与公共的字段,共享字段问题2.对某些值数据类型的选择问题3.数据库字符集问题 本篇文章对于设计表时,数据列的选择进行了一些探寻.好的表设计不仅仅是能满足业务需求,还能够满足对性能的优化.英语与网址都是公共的表

MySQL数据库设计常犯的错以及对性能的影响

1.过分的反范式化为表建立太多的列 我们在设计数据库的结构时,比较容易犯的第一个错误就是对表进行了过分的反范式化的设计,这就容易造成了表中的列过多,虽然说Mysql允许为一个表建立很多的列,但是由于Mysql的插件式架构的原因,前面博客已经有介绍,Mysql的服务器层和存储引擎层是分离的,Mysql的存储引擎API工作时需要把服务器层和存储引擎层之间通过缓冲格式来拷贝数据,然后在服务器层将缓冲层的数据解析成各个列,这个操作过程成本是非常高的,特别是对于MyISAM的变长结构,和Innodb这种行

MYSQL数据库设计之字段选择原则

关于字段的选择其实很多地方都有进行详细的介绍,我这里只写一下我在使用过程中的心得感受.如果想要全面的了解的话,大家可以去看高性能MYSQL这一本书籍,里面有一章节介绍的特别全面,基本涉及MYSQL中全部的字段的介绍. 我这里给大家介绍的就一些常用的字段,例如:int.float.double. decimal.varchar.char. date.datetime等八种常用的类型. 在数据库设计过程中我们要本着够用的原则,如果一味的把数据字段范围设为最大或者默认值的话,会导致存储空间大量的浪费.

高性能可扩展MySQL数据库设计及架构优化 电商项目

第1章 数据库开发规范的制定    俗话说:"没有规矩不成方圆".这一章,我们就先来制定数据库开发的各种规范,包括:数据库命名规范.数据库基本设计规范.数据库索引设计规范.数据库字段设计规范.SQL开发规范以及数据库操作规范.通过这些规范的制定可以指导并规范我们后续的开发工作,为我们以后的工作提供一个良好的基础.... 第2章 电商实例数据库结构设计    数据库开发规范的基础之上,如何更好的利用规范设计出易于维护和伸缩性良好的数据库结构,是我们的学习目的.这一章我们根据常用电商项目需

范式及其在mysql数据库设计中的应用

一.什么是范式 1.1.范式:Normal Format,是离散数学的知识,是为了解决数据的存储与优化而提出来的.要求存储数据后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余. 1.2.范式是一种分层的规范,分为6层,每一层都比上一层更加严格,若要满足下一层范式,前提是满足上一层范式.6层范式:1NF,2NF...6NF:1NF是最底层,要求最低,6NF最高层,要求最严格. 1.3.mysql属于关系型数据库,有空间浪费,表设计时也要致力于节省存储空间.这与范式

MySQL 数据库设计 笔记与总结(2)逻辑设计

[实例演示 —— 实体之间的关系] [逻辑设计的工作] ① 将需求转化为数据库的逻辑模型 ② 通过 ER 图的形式对逻辑模型进行展示 ③ 同所选用的具体的 DBMS 系统无关 [名词解释] 候选码可以简单理解为数据库的主键或唯一索引 主码即主键 [ER图例说明] [ER图实例——小型电商网站] [设计范式概要] 常见的数据库设计范式包括:第一范式,第二范式,第三范式 及 BC 范式.第四范式和第五范式等. [数据库操作异常及数据冗余] 数据冗余:相同的数据在多个地方存在,或者说表中的某个列可以由

MySQL 数据库设计 笔记与总结(1)需求分析

数据库设计的步骤 ① 需求分析 ② 逻辑设计 使用 ER 图对数据库进行逻辑建模 ③ 物理设计 ④ 维护优化 a. 新的需求进行建表 b. 索引优化 c. 大表拆分 [需求分析] ① 了解系统中所要存储的数据(对象 / 实体) a. 实体与实体之间的关系(1 对 1,1 对 多,多 对 多) b. 实体所包含的属性有哪些 c. 哪些属性或属性的组合可以唯一标识一个实体 ② 了解数据的存储特点 ③ 了解数据的生命周期 [例] 一个小型电商网站,核心模块包括:用户.商品.订单.购物车.供应商. ①

MySQL 数据库设计

一.数据库设计:将数据库中的数据实体以及这些实体之间的关系,进行规划和结构化的过程. 设计过程: 需求分析:分析客户的业务和数据处理需求. 概要设计:绘制数据库的ER图,确认需求信息的正确性和完整性. 详细设计:将ER图转换为多张表,进行逻辑设计,取人哥表的主键外键,并应用数据库设计的三大范式进行审核.最后选择具体的数据库. 二.数据库设计的三大范式: (1)第一范式 目标:确保每列的原子性. 如果每列都是不可再分的最小数据单元(最小原子单元),则满足第一范式. (2)第二范式 目标:确保表中每

MySQL 数据库设计 笔记与总结(3)物理设计

[物理设计的工作] ① 选择合适的数据库管理系统:Oracle,SQLServe,MySQL,PgSQL ② 定义数据库.表及字段的命名规范 ③ 根据所选的 DBMS 系统选择合适的字段类型 ④ 反范式化设计 —— 考虑读效率,在一些表中增加适当的冗余(空间换时间) [数据库选择] [MySQL 常用的存储引擎] 注:Archive 主要用于存储日志:Ndb cluster 是 MySQL 集群(内存型集群)所使用的存储引擎. [表及字段的命名规则] [建立数据库及表结构 —— 字段类型的选择原