zoukankan      html  css  js  c++  java
  • 数据库系列(二)之 开发规则与优化

    前言

          在数据库中,有很多开发规则。应尽量避免在数据库中过度使用数据库的功能。过度使用会导致数据库慢,再加上数据库是很难扩展的。过多的逻辑在数据库中处理,以后分库、分表比较难处理。当然对于简单的应用,无需有这么多的规则。以下规则,都是大部分是高并发环境下的规则。

    对于所有应用,建议规则

    1)数据库不存储大文件、图片。

    有些人很喜欢在数据库中存储整个文件、图片的base64,这样只会加大数据库的压力。一般只存储路径、url即可。

    2)表、字段、数据库用英文、拼音。

    在代码规范中,我们都建议使用英文,甚至拼音。使用中文显得很落后。所以在数据库中必须也如此。使用中文,在数据库中可能发生乱码等意想不到的问题。

    3)尽量使用Join方式替换子查询

    因为子查询会导致性能低下。例如在Mysql中,子查询明显是比Join慢的,子查询需要创建临时表。

    4)Join联表查询条件尽量使用索引

    Join查询太消耗数据库性能,使用索引的条件能大大增加查询效率。

    5)能使用索引的地方使用索引,不能使用索引的地方不使用索引

    对于字段值多相同的,尽量避免使用索引。这样没达到你的目的,反而增加数据库的压力。因为插入数据时会变慢,并且索引占用空间。

    并不是索引越多越好,反而会导致数据库的压力过大。

    对于经常使用作为查询条件,并且是重复率不高的字段,尽量使用索引,大大提升查询效率。

    6)避免数据类型的隐形转换而导致的性能底下

    在表中的类型,与查询的类型不一致,会导致查询性能底下,甚至是全部查询。但是有些数据库的类型查询语句是非常严格的,例如Postgresql。

    例如user表,在数据库中的telphone是字符串类型,而查询时使用select telphone from user where telphone=0208653266

    正确是使用select telphone from user where telphone='0208653266'

    7)避免错误使用查询条件导致的全表扫描

    a. NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,这些负向查询条件会导致全表扫描

    b. %开头的模糊查询,会导致全表扫描

    c. 避免数据库中

    8)尽量避免数表字段值可以为null

    表字段中设有默认值,并且可不为空。否则可能会导致全表扫描。

    例如select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

    9)不使用查询时select *号

    用具体的字段代替*号查询,而不用select * from t。因为会消耗数据库的IO性能、不能有效的利用覆盖索引。

    10)不在WHERE条件的属性上使用函数或者表达式

    SELECT id FROM t WHERE from date(day)>='2019-03-15' 会导致全表扫描。

    正确的写法是:SELECT id FROM t WHERE day>= date('2019-03-15 00:00:00')

    11)单表字段数建议小于30,单实例表数据建议小于500

    过多的字段、表会导致数据库性能低下,并且难规范难控制。

    12)Mysql单表数据尽量控制在500万以内

    在mysql过大的数据会造成表修改结构,查询操作性能底下,而这个临界值最好控制在500万。

     

    对于高并发应用,建议规则

    1)一个表中,索引数量尽量控制在3个以内,最多不能超过5个。

    索引不是越多越好,越多的索引导致数据库压力越大。合适合量地使用索引。

    2)规避与合适地使用Join

    有时候,在程序中处理Join比数据库中处理更快。

    3)禁止使用外键,如果有外键完整性约束,需要应用程序控制

    外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先。

    4)尽量不要用自增长主键

    不用自增长主键是因为当插入数据时,数据库首先会查询最大的索引值,然后再进行插入操作。所以,使用较短的string类型或者guid直接插入。

    5)避免使用外键,如果有外键完整性约束,需要应用程序控制

    外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先。

    6)避免使用存储过程、视图、触发器、Event

    使用存储过程等,在高并发场景下,数据库很容易CPU过高而崩毁。建议建立把耗CPU的移动到应用程序端,来达到更好扩展、控制的目的。

     

    后续有遇到问题与建议时,慢慢加上其它的规则...

     

    可以关注本人的公众号,多年经验的原创文章共享给大家。

  • 相关阅读:
    洛谷 P1278 单词游戏 【状压dp】
    洛谷 P1854 花店橱窗布置 【dp】
    洛谷 P2258 子矩阵
    洛谷 P3102 [USACO14FEB]秘密代码Secret Code 【区间dp】
    洛谷U14200 Changing 题解 【杨辉三角】
    洛谷P3933 Chtholly Nota Seniorious 【二分 + 贪心 + 矩阵旋转】
    P3932 浮游大陆的68号岛 【线段树】
    洛谷P1273 有线电视网 【树上分组背包】
    NOI2013 矩阵游戏 【数论】
    洛谷P1268 树的重量 【构造 + 枚举】
  • 原文地址:https://www.cnblogs.com/alunchen/p/11267988.html
Copyright © 2011-2022 走看看