MySql:
只允许使用存储过程访问数据库
应用中调用MySQL存储过程的方式
存储过程编写规范
存储过程入口参数命名规则
临时表命名规则
慎用临时表
Session级变量(@前缀)的使用
使用ON DUPLICATE KEY UPDATE子句
MySQL的时间类型
字符集处理注意事项
Rowcount相关
对于SQLServer中单列XML的替换
对GROUP BY子句的优化
SELECT * 相关
关于往表添加新字段或索引
Delete中别名的使用
注释项说明 (“-- ...”)
版本控制规范
更新规范 内部wiki
范例:
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
谨慎使用where子句中效率比较低的条件
不等于操作符无法利用索引, 慎用
如果在条件字段中使用计算, 那么将无法利用索引, 慎用
索引字段为varchar类型,前缀匹配索引无效
Like ‘abc%’会利用索引, 但like ‘%abc’不会利用索引
在要约束时间范围时,若要大于某个时间时,尽量使用>=?
“>”需要全扫描索引比较, “=”能快速定位到指定的值,再比较大小,
这能减少检索的时间,快速定位记录。
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