危险的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不擅长数学运算和逻辑判断.
禁止使用索引做运算
使用事务尽量简单化,同时控制事务执行时间
- 时间长会导致长时间锁表,造成死锁,进而影响业务
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 作者:王敏