一.表设计阶段:
1.主键的使用
a.业务日志表、安全审计表采用自增长;
b.自定义编号用于业务流程类表,根据一定的编号规则;
c.int型主键 用于基础数据表;
2.逻辑删除字段的设计
a.tinyint类型,1或0;
b.联合主键(如ID+starDate),另加starDate,endDate日期类型字段过滤数据;
3.尽量避免null值存在,尽可能使用默认值进行填充;
4.尽量使用varchar/nvarchar 代替 char/nchar;
二.查询语句注意事项
百万级数据库查询优化的出发点主要基于尽量避免全表扫描;
1.众所周知的像在WHERE ORDER 语句上的字段添加索引;(索引使用上的考虑和权衡,后续还会有总结的博文)
2.查询列用列名代替*,COUNT(1)取代COUNT(*);
3.尽量避免WHERE 子句上和NULL的逻辑判断,如:WHERE NAME IS NULL;
4.尽量避免WHERE 子句上使用表达式,如:select goods fromwarehouse where num/2=500 改为 select goods from warehouse where num=500/2;
5.尽量避免WHERE 子句上使用内置函数或标量函数;
6.尽量避免WHERE子句上<>和!=的出现;
7.尽量避免WHERE子句上OR 连接非索引列;
8.尽量避免like的使用;
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算;
10.对于多张大数据量的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。
11.用 EXISTS代替 IN 是一个好的选择,如:select [score] from score where name in (select [name] from student)改成 select [score] from score where exists(select 1 from student );
12.查询语句通过拼接的Where子句带有参数的也会导致全表扫描。
因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
解决的方法是可以改为强制查询使用索引:select [address] from student where [email protected] 改为 select [address] from student with(index(‘indexname‘))where [email protected];
13.索引并不是越多越好,一张表上最多不超过6个,后续我会针对索引的使用进行详细的总结;
14.能用数值的字段尽量不用字符;
以上内容为本人近期项目中总结以及参考网上贤人志士的文章进行梳理总结,以便增强个人在sql使用上的技巧性;
不足之处还请纠正补充!
引用连接:http://database.51cto.com/art/201407/445934.htm