这几天在做课程表性能方面的测试,因为PSSDB 完全由SQL SERVER迁移到MYSQL, 存储过程基本全部重写遇到很多性能方面的问题都和DB操作有关,总结一下出现的问题:
1. DB操作类,同一方法里多次DB操作,类似于数据库里的事物处理,遇到同一用户高并发时容易出现问题。所以尽量用存储过程实现。
2. 建索引时,如果用到VARCHAR字段的索引可以这么建
ALTER TABLE PSS_SmsAppConfig ADD INDEX UserId_AppType (UserId,AppType,ConfigKey(12));
ConfigKey长度为varchar(60),这个字段的实际情况下的长度不会超过 12,这样固定小长度12的索引会加速索引查询速度,还会减少索引文件的大小,提高 INSERT 的更新速度。
3.关于组合索引,简单的理解就是只从最左面的开始组合。并不是所有组合查询都会用到该组合索引。
比如:一个四个字段的索引 UserId,AppType,BeginTime,EndTime
以下查询会用到索引
SELECT * FROM PSS_SmsApp WHERE UserId=?
SELECT * FROM PSS_SmsApp WHERE UserId=? and AppType=?
SELECT * FROM PSS_SmsApp WHERE UserId=? and AppType=? and BeginTime>? and ,EndTime<?
以下查询不会用到索引
SELECT * FROM PSS_SmsApp WHERE BeginTime>? and ,EndTime<?
检查代码里的SQL语句以及存储过程的WHERE条件是否会使用到索引,没有用到索引的容易出现性能问题,要多注意。
4.优化FOR 循环里的INSERT 操作
在FOR循环里的INSERT语句最好不要循环INSERT操作,可以拼SQL语句,改成一次DB操作能很大缓解DAL压力。咨询了炳锡最大不要超过300就没问题。
INSERT INTO table1(name,age) VALUES('test1',1),('test2',21),('test3',23) ;
5.存储过程里关于计算赋值或按计算值条件查询的时候,最好定义成变量,而不是每次都通过SQL语句执行获取值(多次被执行才有必要定义变量)
1. DB操作类,同一方法里多次DB操作,类似于数据库里的事物处理,遇到同一用户高并发时容易出现问题。所以尽量用存储过程实现。
2. 建索引时,如果用到VARCHAR字段的索引可以这么建
ALTER TABLE PSS_SmsAppConfig ADD INDEX UserId_AppType (UserId,AppType,ConfigKey(12));
ConfigKey长度为varchar(60),这个字段的实际情况下的长度不会超过 12,这样固定小长度12的索引会加速索引查询速度,还会减少索引文件的大小,提高 INSERT 的更新速度。
3.关于组合索引,简单的理解就是只从最左面的开始组合。并不是所有组合查询都会用到该组合索引。
比如:一个四个字段的索引 UserId,AppType,BeginTime,EndTime
以下查询会用到索引
SELECT * FROM PSS_SmsApp WHERE UserId=?
SELECT * FROM PSS_SmsApp WHERE UserId=? and AppType=?
SELECT * FROM PSS_SmsApp WHERE UserId=? and AppType=? and BeginTime>? and ,EndTime<?
以下查询不会用到索引
SELECT * FROM PSS_SmsApp WHERE BeginTime>? and ,EndTime<?
检查代码里的SQL语句以及存储过程的WHERE条件是否会使用到索引,没有用到索引的容易出现性能问题,要多注意。
4.优化FOR 循环里的INSERT 操作
在FOR循环里的INSERT语句最好不要循环INSERT操作,可以拼SQL语句,改成一次DB操作能很大缓解DAL压力。咨询了炳锡最大不要超过300就没问题。
INSERT INTO table1(name,age) VALUES('test1',1),('test2',21),('test3',23) ;
5.存储过程里关于计算赋值或按计算值条件查询的时候,最好定义成变量,而不是每次都通过SQL语句执行获取值(多次被执行才有必要定义变量)