2019独角兽企业重金招聘Python工程师标准>>>

版权声明:本文由漆洪凯原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/119

来源:腾云阁 https://www.qcloud.com/community

规则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://my.oschina.net/u/2987407/blog/779325

MySQL数据库设计总结相关推荐

  1. 不属于mysql常量的是_MySQL中,下面______常量的写法是不正确的?-智慧树MySQL数据库设计与应用章节答案...

    MySQL数据库设计与应用:MySQL中,下面______常量的写法是不正确的?[?ж???] A:'2.1E5 B:0x123abc C:b'121' D:null MySQL数据库设计与应用章节测 ...

  2. mysql数据库设计的原则_MySQL数据库设计原则

    转自 http://www.supidea.com/post/mysql_design_database.aspx MySQL数据库设计原则 MySQL对于成为一个非常快速的数据库服务器有着当之无愧的 ...

  3. MYSQL数据库设计原则

    一.MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大 ...

  4. 数据库-优化-MYSQL数据库设计原则

    MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大sq ...

  5. mysql数据库设计原则_mysql数据库设计总结

    作者:腾讯云技术社区 链接:https://www.zhihu.com/question/19719997/answer/154809252 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...

  6. mysql数据库慕课答案_智慧树MySQL数据库设计与应用慕课答案

    智慧树MySQL数据库设计与应用慕课答案 更多相关问题 [单选] TDD-LTE中一个子帧包含()时隙, [多选] 调整天线下倾角可以改变:() [单选] 多级破碎时,总破碎比等于多机破碎比的(). ...

  7. mysql函数包含的意思_MySQL存储函数的特性说明中,______表示函数体不包含SQL语句。-智慧树MySQL数据库设计与应用章节答案...

    MySQL数据库设计与应用:MySQL存储函数的特性说明中,______表示函数体不包含SQL语句.[?????] A:containssql B:modifiessqldata C:nosql D: ...

  8. mysql数据库设计与应用答案智慧树_智慧树MySQL数据库设计与应用完整免费答案...

    智慧树MySQL数据库设计与应用完整免费答案 更多相关问题 [问答题,简答题] 保育员在教师组织教育活动时应做哪些配合工作? [填空题] 幼儿园的安全教育包括防火.防触电.放走失.防烫伤.防食物.防摔 ...

  9. 互联网产品mysql数据库设计总结

    mysql数据库性能不比oracle数据库,所以设计上,和oracle有一些不同.下面总结一些互联网产品的数据库设计. 1.主键 主键可以使用bigint(20) unsigned也可以使用varch ...

  10. mysql数据库设计实践_MYSQL教程分享20个数据库设计的最佳实践

    <MYSQL教程分享20个数据库设计的最佳实践>要点: 本文介绍了MYSQL教程分享20个数据库设计的最佳实践,希望对您有用.如果有疑问,可以联系我们. MYSQL教程数据库设计是整个程序 ...

最新文章

  1. .net平台性能很不错的轻型ORM类Dapper(转)
  2. C++ 和 Java,你选哪个? | 每日趣闻
  3. b+树时间复杂度_深入理解数据库系统之存储存引擎(二叉搜索树)
  4. python一箭穿心代码怎样复制,Python Decimal copy_sign()用法及代码示例
  5. php xml 增删改查,PHP实现对xml进行简单的增删改查(CRUD)操作示例
  6. 鸿蒙osppt,Mate40 Pro鸿蒙OS快速上手体验+一点个人看法
  7. 【NOIP模拟题】“与”(位运算)
  8. 中石油训练赛 - Match Matching(完全背包)
  9. java父类序列化_父类的序列化与 Transient 关键字
  10. 7 操作系统第二章 进程管理 进程同步与互斥
  11. 【VB.NET】VB.NET字符串数组排序
  12. 前端 页面无刷新方案一
  13. java 字符串每隔两位插入一个字符
  14. Spring框架配置文件 application.xml 示例
  15. 高亮显示不区分大小写的关键字——ASP
  16. 《微观动机与宏观行为》精髓:个人的微观动机,是如何影响宏观行为结果的?
  17. Python爬虫教程,利用Python采集QQ群成员信息
  18. R语言学习(五)——聚类分析
  19. python制作表情,使用Python制作滑稽表情
  20. PHP爬虫微博某个话题的所有内容,GitHub - wansho/sina_weibo_crawl: 爬取新浪微博某一话题的数据,可以替代微博搜索接口...

热门文章

  1. SecureCRT 7 序列号
  2. 算法 排序 python 实现--快速排序
  3. 平安京服务器维护不能打字,《决战!平安京》:玩的真的累,我真的是服了这破游戏的举报系统...
  4. c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...
  5. 【错误记录】编译 Android 版本的 ijkplayer 报错 ( You must define ANDROID_NDK before starting. | 下载指定版本 NDK )
  6. 【运筹学】表上作业法 ( 示例 | 使用 “ 最小元素法 “ 找初始基可行解 )
  7. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )
  8. 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )
  9. 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )
  10. activiti集成spring