规则1:通常状况能够选择MyISAM存储引擎,若是须要事务支持必须使用InnoDB存储引擎。mysql
注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的全部字段的长度之和不能超过1000字节。另外MyISAM数据和索引是分开,而InnoDB的数据存储是按聚簇(cluster)索引有序排列的,主键是默认的聚簇(cluster)索引,所以MyISAM虽然在通常状况下,查询性能比InnoDB高,但InnoDB的以主键为条件的查询性能是很是高的。spring
规则2:命名规则。sql
规则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))
规则17:重要业务访问数据表时。但不能经过索引访问数据时,应该确保顺序访问的记录数目是有限的,原则上不得多于10.
规则18:合理构造Query语句
Mysql在并发这块作得并非太好,当并发量过高的时候,总体性能会急剧降低,这主要与Mysql 内部资源的争用锁定控制有关,MyIsam用表锁,InnoDB好一些用行锁。
规则19:应用系统的优化
一、 合理使用cache,对于变化较少的部分活跃数据经过应用层的cache缓存到内存中,对性能的提高是成数量级的。
二、 对重复执行相同的query进行合并,减小IO次数。
三、 事务相关性最小原则
在此我向你们推荐一个架构学习交流群。交流学习群号:478030634 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
注:关注做者微信公众号,了解更多分布式架构、微服务、netty、MySQL、spring、性能优化、等知识点。公众号:《Java烂猪皮》