危险的SQL语句必须带上索引作为条件,谨记谨记
  • 删除、修改皆为危险的语句,一定要记住带上where条件
建议使用预编译语句操作数据库
  • 先简单了解下SQL执行的流程,SQL先解析、预编译处理再生成计划,最后调用引擎的api方法返回执行的结果,使用预编译的操作,在读写的时候可以省去预编译的时间,提高执行效率
    严禁使用select查询字段*
  • 要什么select什么,不能多,否则可能导致覆盖索引失效,消耗更多的CPU和IO以网络带宽资源。
    查询语句务必要带上索引以提高查询效率
    必须避免数据类型隐士转换
  • 在MySQL中,数据会存在隐式转换,当该字段发生转换时,索引会造成失效
    充分利用索引优势
  • 既然设置了索引就好好充分利用好索引,将查询的效率提至最高。
    禁止使用相同的账号跨库操作
  • 各执其职,互不越权
    禁止使用带有数据值却不带有字段键名的INSERT操作
  • 这是一种错误的做法,对于表的改动后会造成比较大的影响。
    insert into user values'sam',24);
    应该这么操作
    insert into user`user_name`,`age`values'sam',24);
    尽可能使用Join替代子查询操作
  • 子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能会受到一定的影响。特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大。由于子查询会产生大量的临时表也没有索引,所以会消耗过多的CPU和IO资源,产生大量的慢查询。
    尽可能避免使用JOIN关联过多的表
  • 一般情况下,建议JOIN的表不要超过5个,JOIN多表查询比较耗时,关联的表越多越耗时间,防止执行超时或死锁。
    合并操作、减少数据库的交互
  • 可以灵活地合并SQL操作,降低IO消耗的同事也提高了执行效率,譬如
    UPDATE user SET username = 'sam' FROM id = 195;
    UPDATE user SET age = 23 FROM id = 195;
    合并为
    UPDATE user SET username = 'sam',age = 23 FROM id = 195
    尽可能使用IN代替OR语句
    禁止使用ORDER BY RAND()随机排序语句
  • 会把表中所有符合条件的数据装载到内存中,然后在内存中对所有数据根据随机生成的值进行排序,并且可能会对每一行都生成一个随机值,如果满足条件的数据集非常大,就会消耗大量的CPU和IO及内存资源.
    禁止在where语句中进行计算
  • 对列进行函数转换或计算时会导致无法使用索引
    # 索引会失效
    WHERE DATE(create_date)='20190308'
    # 灵活使用[推荐]
    WHERE create_date>='20190308' AND create_date<'20190309';
使用UNION ALL而不是使用UNION
  • 在已知数据没有重读或无须删除重复行的前提下,因为UNION需要重复值扫描,降低效率.
大批量写操作尽可能合理地分批次处理
  • 大批量的操作应当合理平均分批次处理,防止死锁影响业务,同时尽量将这种大操作至于凌晨操作
不在数据库做运算,务必将运算置于业务层
  • MySQL不擅长数学运算和逻辑判断.
禁止使用索引做运算
  • 索引会失效
    SQL语句简单化
使用事务尽量简单化,同时控制事务执行时间
  • 时间长会导致长时间锁表,造成死锁,进而影响业务
IN语句参数的个数尽量控制在1000以内
  • 注意LIMIT分页查询效率,LIMIT越大效率越低
  • 在使用LIMIT做分页时,更改巧妙地处理查询,譬如使用S1替换成S2,将有效地提高查询的效率
    # S1 SELECT `username` FROM `user` LIMIT 10000,20;
    # S2 SELECT `username` FROM `user` WHERE id>10000 LIMIT 20;
编写SQL语句必须全部为大写,每个词必只允许只有一个空格符
  • 编写规范,必须统一并遵循
尽可能使用EXISR|NOT EXIST 替代 IN | NOT IN
禁止使用LIKE添加%前缀进行模糊查询
  • %前置会导致索引失效
    禁止一条语句同时对多个表进行写操作
文档更新时间: 2020-11-16 10:58   作者:王敏