1、设计表的时候,所有表和字段都添加相应的注释。
2、SQL书写格式,关键字大小保持一致,使用缩进。
3、修改或删除重要数据前,要先备份。
4、很多时候用 exists 代替 in 是一个好的选择
5、where后面的字段,留意其数据类型的隐式转换。
未使用索引
SELECT * FROM user WHERE NAME=110
(1) 因为不加单引号时,是字符串跟数字的比较,它们类型不匹配
(2)MySQL会做隐式的类型转换,把它们转换为数值类型再做比较
6、尽量把所有列定义为NOT NULL
NOT NULL列更节省空间,NULL列需要一个额外字节作为判断是否为 NULL的标志位。
NULL列需要注意空指针问题,NULL列在计算和比较的时候,需要注意空指针问题。
7、伪删除设计
8、数据库和表的字符集尽量统一使用UTF8
(1)可以避免乱码问题。
(2)可以避免,不同字符集比较转换,导致的索引失效问题。
9、select count(*) from table;
这样不带任何条件的count会引起全表扫描,并且没有任何业务意义,是一定要杜绝的。
10、避免在where中对字段进行表达式操作
(1)SQL解析时,如果字段相关的是表达式就进行全表扫描
(2)字段干净无表达式,索引生效
11、关于临时表
(1)避免频繁创建和删除临时表,以减少系统表资源的消耗;
(2)在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log;
(3)如果数据量不大,为了缓和系统表的资源,应先create table,然后insert;
(4)如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除。先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
12、索引不适合建在有大量重复数据的字段上,比如性别,排序字段应创建索引
13、去重distinct过滤字段要少
带distinct的语句占用cpu时间高于不带distinct的语句
当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据
然而这个比较、过滤的过程会占用系统资源,如cpu时间
14、尽量避免大事务操作,提高系统并发能力
15、所有表必须使用Innodb存储引擎
Innodb「支持事务,支持行级锁,更好的恢复性」,高并发下性能更好,所以呢,没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎。
16、尽量避免使用游标
因为游标的效率较差,如果游标操作的数据超过1万行,那么应该考虑改写。