Code前端首页关于Code前端联系我们

MySQL数据库设计总结第19行

terry 2年前 (2023-09-26) 阅读数 46 #数据库

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

注意:MyISAM存储引擎的B树索引有一个主要限制:参与索引的所有字段的长度总和不能超过1000字节。此外,MyISAM数据和索引是分离的,而InnoDB的数据存储是按簇索引组织的,主键是默认的簇索引。虽然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%数据库数量进行拆分。

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的语句,不能使用这个联合索引。

  • 当所有要查询的数据库字段都反映在索引中时,数据库可以直接查询索引来获取查询信息,而无需扫描全表(这称为唯一键),可以大大提高查询效率。当 a、ab、abc 链接到其他表字段进行查询时,可以使用索引
  • 当 a、ab、abc 的顺序正确而不是 b、c、bc、ac 时,索引可以与排序或不需要分组
  • 在以下情况下,扫描表然后排序可能比使用共享索引更有效: 表是根据索引组织的; B. 正在查询的数据站中所有数据的很大一部分。
  • 规则 17:当重要公司获得数据表访问权限时。但如果无法通过索引访问数据,则要保证顺序访问的记录数是有限的,原则上不要超过10条。

    2. 查询语句和应用系统的优化

    规则18:合理构建Query语句

    1. Insert语句中,根据测试,在插入1000条时效率最高一次插入一批。如果超过 1,000 个项目,则必须拆分。如果多次执行同一个插入,必须分批合并。请注意,查询语句的长度要小于mysqld的max_allowed_pa​​cket参数
    2. 查询条件中各种逻辑运算符的执行顺序是and、or、in,所以在避免查询条件时应该尝试使用in 。在大集合中使用
    3. 永远使用小结果集驱动大记录集,因为在mysql中只有一种Join方法,Nested Join,这意味着mysql的join是通过嵌套循环实现的。采用小结果集驱动大记录集的原理,通过减少嵌套循环的次数来减少IO总量和CPU运算次数。
    4. 尽可能优化Nested Join的内循环。
    5. 只取你需要的列,尽量不要使用select *
    6. 只使用最有效的过滤字段,Where子句中的过滤条件最好少一些
    7. 尝试复杂的连接和子查询Mysql以避免这样做并发性能不是很好。当并发量过高时,整体性能会急剧下降。这主要是由于Mysql内部资源的争用锁检查造成的。 MyIsam 使用表锁,InnoDB 使用行锁。

    规则19:应用系统的优化

    1. 合理使用缓存。更改频率较低的部分活动数据通过应用层缓存存储在内存中,从而将性能提高几个数量级。
    2. 重复合并相同的查询以减少 PO 数量。
    3. 最小交易相关性原则

    作者:腾讯云+社区

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门