如何提升SQL语句的查询性能
在对数据库进行操作时,如果SQL语句书写不当,对程序的效率会造成很大影响。
提高SQL效率可以从一下几个方面入手:
1,数据库设计与规划
Primary Key字段的长度尽量小,能用small integer就不要用integer。例如对于员工数据表,如果能用员工编号做主键,就不要用身份证号码。
字符字段如果长度固定,就不要用varchar或nvarchar类型,而应该用char或nchar类型。例如身份证号码、银行密码等字段。
字符长度如果长度不固定,则应该使用varchar或nvarchar类型。除了可节省存储空间外,存取硬盘也会有效率。例如地址、个人介绍等。
涉及字段时,如果其值可有可无,最好也给一个默认值,并设成不允许NULL。因为有些数据库在存放和查询有NULL的数据表时,会花费额外的运算动作,例如SQL Server数据库。
2,适当地创建索引
Primary Key字段可以自动地创建索引,而Foreign Key字段不可以。为Foreign Key字段手动创建索引,即使是很少被JOIN的数据表也有必要这么做。
为经常被查询或排序的字段创建索引。
创建索引字段的长度不宜过长,不要用超过20个字节的字段,例如地址等。
不要为内容重复性高德字段创建索引,例如性别等。
不要为使用率低的字段建立索引。
不宜为过多字段建立索引,否则会影响到INSERT、UPDATE和DELETE语句的性能。
如果数据表存放的数据很少,就不必刻意使用索引。
3,使用索引功能
在查询数据表时,使用索引查询可以极大提升查询速度,但是如果where子句书写不当,即使某些列存在索引,也不能使用该索引查询,而同样会使用全表扫描,这就造成了查询速度的降低。在where语句中避免使用一下关键字:
NOT、!=、<>、!>、!<、EXISTS、IN、LIKE、||。
使用LIKE关键字做模糊查询时,即使已经为某个字段建立了索引,但需要以常量字符开头才会用到索引,如果以“%”开头则不会使用索引。例如name like '%To‘ 不启用name字段上的索引;而 name like ‘To%’会启用name字段上的索引。
4,避免在where子句中对字段使用函数
5,AND与OR的使用
在AND运算中,只要有一个条件用到索引,即可大幅提升查询速度。但在OR运算中,则要所有的条件都有使用到索引才能提升查询速度,因此使用OR运算符需要特别小心。
6,JOIN与子查询
相对于子查询,如果能使用JOIN完成的查询,一般建议使用后者。原因除了JOIN的语法较容易理解外,在多数的情况下,JOIN的性能也会比子查询高。
7,其它查询技巧
DISTINCT、ORDER BY语法,会让数据库做额外的计算。如果没有要过滤重复记录的需求,使用UNION ALL会比UNION更好,因为后者会加入类似DISTINCT的算法。
8,尽可能使用存储过程(Stored Procedure)
Stored Procedure除了经过事先编译、性能较好以外,也可能减少SQL语句在网络上的传递,方便商业逻辑的重复使用。
如何做到数据库的高并发与高可用?
1.拆表:大表拆小表(垂直拆,水平拆;分表,分区partition,分片sharding),可以在应用层实现,也可以在数据库层面实现一部分;提高系统性能。
2.分库:把表放到不同的数据库,这也是分布式数据库的基础;提高系统性能。
3.分布式:不同的数据库放到不同的服务器;提高系统性能。
4.集群:使用数据库复制等技术组建集群,实现读写分离、备份等;提高系统性能、可用性。
5.缓存:对常用的数据进行缓存。提高系统性能。
6.备份:主从库,快照,热备,异地备份等;提高系统可用性。
7.空间换时间(多级缓存,静态化{客户端页面缓存,反向代理缓存,内存数据库};索引{哈希、B树、倒排、bitmap})
8.并行与分布式计算(任务切分、分而治之;多进程、多线程并行执行)
9.多维度的可用(负载均衡、容灾、备份;读写分离;依赖关系;监控)
10.伸缩(拆分;无状态)
11.优化资源利用(系统容量有限;原子操作与并发控制;基于逻辑的不同,采取不一样的策略; 容错隔离;资源释放)