sql语句性能优化
1.尽量避免全局扫描
全局扫描会出降低查询效率,严重的情况会造成死锁,比如错误提示牺牲了一个进程。会造成全局扫描的查询语句有:
(1)未使用索引字段查询;
(2)在字段上使用函数、算数运算,尽量将运算放到等号右侧;
如 select * from testtable where len(A)=2
(3)左侧模糊查询会导致全表扫描,可以使用右侧模糊查询;
如select * from testtable where A like’%a%’
(4)使用 in or <>进行查询;
可用用exists代替in,用union代替or
(5)使用空判断语句;
如select * from testtable where A is null
2.尽量使用索引查询
使用索引时,将带有索引的字段放在条件最前面,如果是联合索引,按照索引字段的顺序写。
如表TestTable上有两个索引,字段A+字段B是一个联合索引,字段C无索引,则:
select * from testtable where A=’a’ and B=’b’ and C=’c’是可以使用到索引的;
select * from testtable where C=’c’ and A=’a’ and B=’b’ 也是可以使用到索引的,但效率不如上面一条高;
select * from testtable where B=’b’ and A=’a’ and C=’c’ 无法使用索引,效率最低;
3.使用绑定变量
sql语句提交到数据库时会先生成执行计划,使用频度最高的若干条查询语句会保存在数据库执行计划中,减少下次执行时的解析时间。使用绑定变量的语句虽然参数不同但数据库会认为是同一条语句,反之发果将参数写在sql语句中,则每次都会认为是不同的语句。同理,sql语句的编写尽量规范大小写,大写和小写会认为是两条不同的语句。
(1)绑定变量的sql写法:
select * from testtable where username=:p0
使用时username传入A和B会使用相同的执行计划
(2)直接传入参数的写法:
select * from testtable where username=’A’
select * from testtable where username=’B’
使用时每条sql语句都会生成自己的执行计划,无法做到执行计划的复用
(3)大小写不同无法复用执行计划
select * from testtable where username=’A’
select * from TestTable where username=’B’
使用时每条sql语句都会生成自己的执行计划
4.按事物提交
如果一次操作要执行多个sql语句,可以写在数据库事物中,事物的优势是可以多次执行,一次提交,如果有一条执行失败,可以整体回滚。另外,sql语句的执行时间是很短的,但是提交数据库写入磁盘是耗时的,整体提交可以减小写入磁盘的时间,但不是一次提交的语句越多越好,因为数据库是分页写入的,超过一页的大小不会再带来性能的提高,反而提高了数据丢失的风险,所以实际操作时要测试出一个合理的批量提交数。
5.其它
(1)合理创建索引,索引创建在经常使用的字段上,减少不必要的索引;
(2)合理设计数据库,如果表数据太多,可以考虑分库分表;
(3)只查询需要的字段,避免select *;
(4)若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
(5)尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间。
chart.js/