MySql:

只允许使用存储过程访问数据库

应用中调用MySQL存储过程的方式

存储过程编写规范

存储过程入口参数命名规则

临时表命名规则

慎用临时表

Session级变量(@前缀)的使用

使用ON DUPLICATE KEY UPDATE子句

MySQL的时间类型

字符集处理注意事项

Rowcount相关

对于SQLServer中单列XML的替换

对GROUP BY子句的优化

SELECT * 相关

关于往表添加新字段或索引

Delete中别名的使用

注释项说明 (“--  ...”)

版本控制规范

更新规范  内部wiki

范例:




android studio标记未使用的词条资源 未使用标记来传递sql -4462_存储过程

android studio标记未使用的词条资源 未使用标记来传递sql -4462_字段_02

View Code


DELIMITER $$
DROP PROCEDURE IF EXISTS `USP_GetScore`$$
CREATE DEFINER=`admin`@`%` PROCEDURE `USP_GetScore`(
v_UserId    INT
)
BEGIN
DECLARE v_score INT;
DECLARE v_bScore INT;
SET v_score = 0;
SET v_bScore = 0;
SELECT   Score INTO v_score FROM UP_User  
WHERE UserId = v_UserId;
SELECT   BussinessScore INTO v_bScore FROM UP_ServiceEx
WHERE UserId = v_UserId;
SELECT v_score,v_bScore;
END$$
DELIMITER ;



 



-- 索引顺序需要注意



案例2:

UPDATE CF_TransferCache SET
  CurrentState=v_State WHERE
  CacheId = CONCAT(CAST(v_OwnerId AS CHAR), v_FileId, v_Target) AND
  OwnerId=v_OwnerId AND
  FileId=v_FileId AND
  ServiceCode=v_ServiceCode AND
  Target=v_Target;
 
KEY `IX_CF_TransferCache_OFTS` (`OwnerId`,`FileId`,`Target`,`ServiceCode`)

 

--别名要写全

SELECT  a.Col1,a.Col2,b.Col3,b.Col4
   FROM a INNER JOIN b
      ON a.FileId = b.FileId
   WHERE a.GroupId = v_GroupId AND 
       ExpireTime > v_ExpireTimePoint  -- 缺失别名
   ORDER BY a.CreateTime DESC;



 

 

 

SqlServer



异常处理部分,确保过程的可执行;



注释。



无法参数化的SQL会造成的不良影响:



重新编译生成执行计划, 浪费CPU



执行 计划不可重用, 造成SQL Server缓存大量无用的执行计划, 从而 浪费内存空间



低效的 Index Scan 或者 Table Scan), 从而导致DB突然缓慢。



 



谨慎使用where子句中效率比较低的条件



<> 操作符



不等于操作符无法利用索引, 慎用



条件字段中的计算表达式



如果在条件字段中使用计算, 那么将无法利用索引, 慎用



Like子句



索引字段为varchar类型,前缀匹配索引无效

Like ‘abc%’会利用索引, 但like ‘%abc’不会利用索引



时间字段



在要约束时间范围时,若要大于某个时间时,尽量使用>=?

“>”需要全扫描索引比较, “=”能快速定位到指定的值,再比较大小,

这能减少检索的时间,快速定位记录。

 



慎用in语句, 使用join语句代替



 



严格匹配where子句中的数据类型


Select * from SMS_MoLog where SrcMobileNo = 13820120305,这里SrcMobileNo为varchar(64),后面值是整型,类型匹配,索引不起作用,导致一个Index Scan,非常缓慢。



对于复合的条件, 使用索引暗示指定使用的索引



某些情况下, 由于统计信息的变化,导致执行计划不合理,特别是在多索引的情况下,这时尽量使用索引暗示,如:

Select  * from SMS_MoLog with(nolock, INDEX(IX_SMS_MoLog_SrcMobileNo)) where SrcMobileNo = @MobileNo and Time > @Time