MySQL数据库设计总结第19行
第1行:一般情况下,可以选择MyISAM存储引擎。如果需要事务支持,则需要使用InnoDB存储引擎。
注意:MyISAM存储引擎的B树索引有一个主要限制:参与索引的所有字段的长度总和不能超过1000字节。此外,MyISAM数据和索引是分离的,而InnoDB的数据存储是按簇索引组织的,主键是默认的簇索引。虽然MyISAM的查询性能普遍比InnoDB高,但是InnoDB基于主键的查询性能非常高。
规则2:命名规则。
- 数据库和表的名称应尽可能与所提供的业务模块的名称一致。
- 服务于同一子模块的一类表应以子模块的名称(或单词的一部分)作为前缀或后缀
- 表名称尝试包含与存储数据匹配的单词
- 字段名称也应尽量与实际数据保持一致
- 联合索引名称应尽量包含所有字段名称或索引键的缩写,并且每个字段名称都应包含在索引名称中。顺序应与索引中索引键的索引顺序一致,并尽量包含类似于idx的前缀或后缀,以表明该对象类型是索引。
- 其他对象(例如约束)应尽可能包含它们所属的表或其他对象的名称,以表明它们各自的关系
规则 3:数据库字段类型的定义
- 计算而且排序往往需要使用CPU字段,所以应该尽量选择速度更快的字段,比如使用
TIMESTAMP
(4字节,最小值1970-01-01 00:00:00)而不是DateTime
(8 个字节,最小值 1001-01-01 00:00:00),将浮点和字符类型替换为整数 - 对可变长度字段使用
varchar
,不要使用char
- 对于二进制多媒体数据、管道数据(如日志)、非常大的文本数据,不要放在数据库字段中
规则4:业务逻辑要读取的表执行过程必须有一个初始值。避免因负数或无穷大的值导致业务失败读出来
规则5:无需拘泥于范式理论,适度冗余,让Query最小化。 Join
第6行:访问频率较低的大字段从数据表中拆分出来。一些大字段占用大量空间,并且输入频率比其他字段少得多。这种情况下,通过拆分字段就可以避免频繁查询时读取大字段,造成IO资源的浪费。
规则7:对于大表可以考虑水平分割。大表影响查询效率。根据公司特点,分拆方法有很多种。例如,可以基于时间来分发基于时间增加的数据。按id划分的数据可以根据id%数据库数量进行拆分。
1。数据库索引
第8行:公司要求的相关索引是根据实际设计,根据SQL语句构造的状态来确定的。公司不需要就不要建索引,也不允许联合索引。其中有多个字段(或主键)。特别是,该字段根本不会出现在条件语句中。 ?一些使用的表包含很少的记录,甚至只有一条记录。为了满足约束要求,必须创建索引或设置主键。
规则11:对于值不重复且经常作为查询条件的字段,必须建立唯一索引(主键默认为唯一索引),并且该字段的条件必须是搜索条件应该放在第一位。该区域无需创建联合索引。
第12行:对于经常请求且值不唯一的字段,还应该考虑设置普通索引。字段条件放在查询语句的第一个位置。对于联合索引也使用相同的方法。
规则13:当公司通过非唯一索引访问数据时,必须考虑通过索引值返回的记录密度。原则上,最大可能密度不能高于0.2。如果密度太高,则无法使用。是时候创建索引了。
如果通过该索引查找的数据量超过表中所有数据的20%,就需要考虑建立索引的成本。由于索引扫描会产生随机I/O,因此全表顺序扫描的顺序I/O效率要低很多。数据库系统在优化查询时可能不会使用该索引。
规则14:需要共享索引(或共享主键)的数据库必须注意索引的顺序。 SQL语句中的匹配条件也必须与索引的顺序一致。
注意:不正确的索引也会导致严重的后果。
第15行:表中多个字段查询作为查询条件,不包含其他索引,共享字段值不重复。可以在这多个字段上建立唯一的联合索引。假设索引字段为( a1,a2,...an),则查询条件为 (a1 on val1,a2 on val2,...am on valm)m=12 and a=12 and c=2的语句,不能使用这个联合索引。
规则 17:当重要公司获得数据表访问权限时。但如果无法通过索引访问数据,则要保证顺序访问的记录数是有限的,原则上不要超过10条。
2. 查询语句和应用系统的优化
规则18:合理构建Query语句
- Insert语句中,根据测试,在插入1000条时效率最高一次插入一批。如果超过 1,000 个项目,则必须拆分。如果多次执行同一个插入,必须分批合并。请注意,查询语句的长度要小于mysqld的max_allowed_packet参数
- 查询条件中各种逻辑运算符的执行顺序是and、or、in,所以在避免查询条件时应该尝试使用in 。在大集合中使用
- 永远使用小结果集驱动大记录集,因为在mysql中只有一种Join方法,Nested Join,这意味着mysql的join是通过嵌套循环实现的。采用小结果集驱动大记录集的原理,通过减少嵌套循环的次数来减少IO总量和CPU运算次数。
- 尽可能优化Nested Join的内循环。
- 只取你需要的列,尽量不要使用select *
- 只使用最有效的过滤字段,Where子句中的过滤条件最好少一些
- 尝试复杂的连接和子查询Mysql以避免这样做并发性能不是很好。当并发量过高时,整体性能会急剧下降。这主要是由于Mysql内部资源的争用锁检查造成的。 MyIsam 使用表锁,InnoDB 使用行锁。
规则19:应用系统的优化
- 合理使用缓存。更改频率较低的部分活动数据通过应用层缓存存储在内存中,从而将性能提高几个数量级。
- 重复合并相同的查询以减少 PO 数量。
- 最小交易相关性原则
作者:腾讯云+社区
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。