更新时间:2022-01-13 20:32:09
我来告诉你在Mysql中写SQL的21个好习惯。相信朋友们也应该很关心这个话题。现在,让我们为我的朋友们谈谈在Mysql中写SQL的21个好习惯。边肖还收集了关于在Mysql中拥有21个写SQL好习惯的相关信息。我希望你看到后会喜欢。
mysql视频教程专栏介绍了编写sql的好习惯和好方法。
前言每个好习惯都是一笔财富。本文从三个方向分享了写SQL的21个好习惯:SQL后悔药、SQL性能优化、SQL规范、优雅。感谢阅读,加油~
1.写完SQL后,解释并检查执行计划(SQL性能优化)。在日常开发中写SQL的时候尽量养成这个好习惯:写完SQL之后用解释来分析,特别注意是否走索引。
解释从用户中选择*用户id=10086或年龄=18;复制代码
2.添加删除或更新语句的限制。尝试添加删除或更新语句的限制。以下面的SQL为例:
从euser中删除,其中年龄限制为200岁;因为增加限制而复制代码主要有这些好处:
为了降低写错SQL的成本,如果在命令行执行这个SQL时不加限制,可能会不小心握手,把数据全部删除。如果删除不正确,增加限制200就不一样了。错误删除只是丢失200条数据,可以通过binlog log快速恢复。SQL可能会更高效。您在SQL行中添加了限制1。如果第一个项目命中目标,return将无限制地继续执行扫描表。为了避免长时间的事务删除执行,如果对年龄进行索引,MySQL将向所有相关行添加写锁和间隙锁,并且所有与执行相关的行都将被锁定。如果删除次数多,会直接影响相关业务的不可用性。如果有大量数据,很容易填满cpu。如果在不限制记录数量的情况下删除大量数据,很容易填满CPU,导致删除速度变慢。3.当设计一个表时,所有的表和字段都被相应地注释(SQL规范是优雅的)。这个好习惯一定要养成。设计数据库表时,在所有表和字段都相应地进行了注释之后,维护起来就更容易了。
示例:
创建表格“帐户”(
` Id`int (11)不为null auto _ increment注释'主键Id ',
` name`varchar (255)默认空注释'帐户名',
` balance`int (11)默认空注释' balance ',
` create _ time`datetime不是空注释'创建时间',
` update _ time`datetime在更新current _ timestamp注释'更新时间'时不为空,
主键(` id `),
KEY `idx_name` (`name `)使用BTREE
)engine=innodb auto _ increment=1570068默认字符集=utf8 row _ format=redundant comment=' account table ';复制代码反例:
创建表格“帐户”(
` id` int(11)不为空自动增量,
` name` varchar(255) DEFAULT NULL,
` balance ' int(11)DEFAULT NULL,
“创建时间”日期时间不为空,
“更新时间”日期时间更新当前时间时不为空,
主键(` id `),
KEY `idx_name` (`name `)使用BTREE
)ENGINE=InnoDB AUTO _ INCREMENT=1570068 DEFAULT CHARSET=utf8;复制代码4。SQL书写格式关键字大小一致,使用缩进。(优雅的SQL规范)正面示例:
S
ELECT stu.name, sum(stu.score) FROM Student stu WHERE stu.classNo = '1班' GROUP BY stu.name复制代码反例:
SELECT stu.name, sum(stu.score) from Student stu WHERE stu.classNo = '1班' group by stu.name.复制代码显然统一关键字大小写一致使用缩进对齐会使你的SQL看起来更优雅~
5. INSERT语句标明对应的字段名称(SQL规范优雅)反例:
insert into Student values ('666','捡田螺的小男孩','100');复制代码正例:
insert into Student(student_id,name,score) values ('666','捡田螺的小男孩','100');复制代码6. 变更SQL操作先在测试环境执行写明详细的操作步骤以及回滚方案并在上生产前review。(SQL后悔药)变更SQL操作先在测试环境测试避免有语法错误就放到生产上了。变更Sql操作需要写明详细操作步骤尤其有依赖关系的时候如:先修改表结构再补充对应的数据。变更Sql操作有回滚方案并在上生产前review对应变更SQL。7.设计数据库表的时候加上三个字段:主键create_time,update_time。(SQL规范优雅)反例:
CREATE TABLE `account` ( `name` varchar(255) DEFAULT NULL COMMENT '账户名', `balance` int(11) DEFAULT NULL COMMENT '余额', ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';复制代码正例:
CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id', `name` varchar(255) DEFAULT NULL COMMENT '账户名', `balance` int(11) DEFAULT NULL COMMENT '余额', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';复制代码理由:
主键一定要加上的没有主键的表是没有灵魂的创建时间和更新时间的话还是建议加上吧详细审计、跟踪记录都是有用的。阿里开发手册也提到这个点如图
8. 写完SQL语句检查where,order by,group by后面的列多表关联的列是否已加索引优先考虑组合索引。(SQL性能优化)反例:
select * from user where address ='深圳' order by age ;复制代码正例:
添加索引 alter table user add index idx_address_age (address,age)复制代码9.修改或删除重要数据前要先备份先备份先备份(SQL后悔药)如果要修改或删除数据在执行SQL前一定要先备份要修改的数据万一误操作还能吃口后悔药~
10. where后面的字段留意其数据类型的隐式转换(SQL性能优化)反例:
//userid 是varchar字符串类型 select * from user where userid =123;复制代码正例:
select * from user where userid ='123';复制代码理由:
因为不加单引号时是字符串跟数字的比较它们类型不匹配MySQL会做隐式的类型转换把它们转换为浮点数再做比较最后导致索引失效11. 尽量把所有列定义为NOT NULL(SQL规范优雅)NOT NULL列更节省空间NULL列需要一个额外字节作为判断是否为 NULL 的标志位。NULL列需要注意空指针问题NULL列在计算和比较的时候需要注意空指针问题。12.修改或者删除SQL先写WHERE查一下确认后再补充 delete 或 update(SQL后悔药)尤其在操作生产的数据时遇到修改或者删除的SQL先加个where查询一下确认OK之后再执行update或者delete操作
13.减少不必要的字段返回如使用select <具体字段> 代替 select * (SQL性能优化)反例:
select * from employee;复制代码正例:
select idname from employee;复制代码理由:
节省资源、减少网络开销。可能用到覆盖索引减少回表提高查询效率。14.所有表必须使用Innodb存储引擎(SQL规范优雅)Innodb 支持事务支持行级锁更好的恢复性高并发下性能更好所以呢没有特殊要求(即Innodb无法满足的功能如:列存储存储空间数据等)的情况下所有表必须使用Innodb存储引擎
15.数据库和表的字符集统一使用UTF8(SQL规范优雅)统一使用UTF8编码
可以避免乱码问题可以避免不同字符集比较转换导致的索引失效问题如果是存储表情的可以考虑 utf8mb4
16. 尽量使用varchar代替 char。(SQL性能优化)反例:
`deptName` char(100) DEFAULT NULL COMMENT '部门名称'复制代码正例:
`deptName` varchar(100) DEFAULT NULL COMMENT '部门名称'复制代码理由:
因为首先变长字段存储空间小可以节省存储空间。其次对于查询来说在一个相对较小的字段内搜索效率更高。17. 如果修改字段含义或对字段表示的状态追加时需要及时更新字段注释。 (SQL规范优雅)这个点是阿里开发手册中Mysql的规约。你的字段尤其是表示枚举状态时如果含义被修改了或者状态追加时为了后面更好维护需要即时更新字段的注释。
18. SQL修改数据养成begin + commit 事务的习惯;(SQL后悔药)正例:
begin; update account set balance =1000000 where name ='捡田螺的小男孩'; commit;复制代码反例:
update account set balance =1000000 where name ='捡田螺的小男孩';复制代码19. 索引命名要规范主键索引名为 pk_ 字段名;唯一索引名为 uk _字段名 ; 普通索引名则为 idx _字段名。(SQL规范优雅)说明: pk_ 即 primary key;uk _ 即 unique key;idx _ 即 index 的简称。
20. WHERE从句中不对列进行函数转换和表达式计算假设loginTime加了索引
反例:
select userId,loginTime from loginuser where Date_ADD(loginTime,Interval 7 DAY) >=now;复制代码正例:
explain select userId,loginTime from loginuser where loginTime >= Date_ADD(NOW,INTERVAL - 7 DAY);复制代码理由:
索引列上使用mysql的内置函数索引失效21.如果修改\更新数据过多考虑批量进行。反例:
delete from account limit 100000;复制代码正例:
for each(200次) { delete from account limit 500; }复制代码理由:
大批量操作会会造成主从延迟。大批量操作会产生大事务阻塞。大批量操作数据量过大会把cpu打满。参考与感谢delete后加 limit是个好习惯么《阿里开发手册》相关免费学习推荐:mysql视频教程
以上就是拥有Mysql中21个写SQL的好习惯的详细内容!
来源:php中文网