mysql 优化60条建议

    1,频繁查询需求的接口在业务层,添加缓存例如使用redis缓存
    2,养成查看sql执行计划的习惯
    3,按需开启或者关闭
    query_cache 4,合理的增大inndb_buffer_pool_size
    5,按需设置主从数据库,读写分离等等
    6,使用高性能的SDD硬盘存储数据
    7,定期维护更新删除数据比较多的表,优化(会锁表)

    8,sql尽量避免全表扫描
    9,
    确定单条返回需要的列10
    ,避免大偏移量的分页查询,避免不已就利用延迟关联或者子查询优化超多分页场景
    12,尽可能避免复杂的加和子查询
    13,在加入表的时候使用相当类型的列,并将其索引
    14,加入查询遵循小结果集驱动大的结果集的原则,BNLJ
    15, in和exists的使用遵循,外层查询表小于子查询表,则用存在,外层查询表大于子查询表,则用于
    16,注意隐式转换
    17,不要使用ORDER BY RAND()语句,尽量减少filesort
    18,其中语句中不要有运算
    19,在查询建议不要超过1000,合理拆分插入,删除语句
    20,不要使用计数(列名)或计数(常量)来替代计数(*),计数(* )是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NU LL值的行
    21,TRUNCATE TABLE比较DELETE速度快,且使用的系统和事务日志资源少,但TRUNCATE无事务且不触发触发器,有可能造成事故
    22,业务层,分页查询逻辑时,若计为0应直接返回,不继续进行分页查询
    23,使用ISNULL()来判断是否为NULL值.Not与任何值的直接比较都为
    NULL。24,count语句不会出现null,但是sum会,注意NPE问题
    25,count(distinct col)计算该列除了之外的不重复行数,注意计数(distinct col1,col2)如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。

    26,业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。墨菲定律
    27,超过三个表禁止join。需要join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引
    .28,在varchar字段上建立索引时,必须指定索引长度,不必要对全字段建立索引,根据实际文本区分度决定索引长度即可.29
    ,页面搜索严禁左模糊或者全模糊(不走索引的),如果需要请走搜索引擎来解决
    30,如果有顺序by的场景,请注意利用索引的有序性,依据业务排序要求等添加升序或者降序索引
    31 ,利用覆盖索引来进行查询操作
    32,建组合索引的时候,区分度最高的在最左边,存在非等号和等号混合时,等号条件的列前置
    33,合理添加组合索引(组合索引最多支持16列)
    34,主键长度越小越好,最好永远都未一张表添加一个主键ID并设置非 自增
    35,删除无用的索引基数接近为1的索引,msyql8.0使用隐藏索引

    36,表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否)
    37,表名,字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字,MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写
    38,表名不使用复数名词
    39,禁用保留字,desc,范围,匹配,延迟
    40,主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名
    41,小数类型为decimal,禁止使用float和
    double.42,如果存储的字符串长度几乎相等,使用char定长字符串类型
    .43,字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:1)不是频繁修改的字段
    

    1.创建表的存储引擎必须是InnoDB,并指定主键,不允许外键,同时不允许存在和主键重复的索引
    2。非分区表不允许使用联合主键。
    3.自增长字段必须是主键或唯一索引
    4.不允许在数据库中存储诸如图片,影像之类的二进制数据。
    5.不允许使用TEXT类型字段
    6。建表时不允许显式的指定除了utf8,utf8mb4之外的其他字符集,
    如果有存储评论,名字,描述等可能包含表情,特殊字符的字符串,必须使用utf8mb4.7。
    对于所有声明为NOT
    8.必须包含时间戳字段DataChange_LastTime,定义默认值为
    CURRENT_TIMESTAMP on update,并添加索引.9。DataChange_CreateTime
    ,作为行创建时间,定义默认值时请不要添加
    CURRENT_TIMESTAMP on NULL的字段,必须显式指定默认值。更新,直接设置CURRENT_TIMESTAMP即可。
    10.禁止使用子查询。
    11.禁止使用选择*,必须指定需要的字段。
    12.更新/删除只能单表操作,不允许多表关联,不允许用子查询,且一定要带条件.13。
    插入语句要显式指定插入的列名,且不允许使用insert .... select的形式。
    14.不允许使用存储过程,存储函数,触发器和视图.15。
    单条查询语句中,不允许出现多于一次的连接.16。
    不要在哪里后的筛选字段上做运算
    .17 不允许在查询语句中指定索引提示force | 忽略| 使用索引| 关键。

猜你喜欢

转载自blog.csdn.net/york_2016/article/details/84926298