国内做游戏破解的网站,网站母版页怎么做,建程网app下载,软件推广方案经典范文前言每一个好习惯都是一笔财富#xff0c;本文分SQL后悔药、SQL性能优化、SQL规范优雅三个方向#xff0c;分享写SQL的21个好习惯#xff0c;谢谢阅读#xff0c;加油哈~一、SQL后悔药1、操作delete或者update语句#xff0c;加个limit在执行删除或者更新语句#xff0…前言每一个好习惯都是一笔财富本文分SQL后悔药、SQL性能优化、SQL规范优雅三个方向分享写SQL的21个好习惯谢谢阅读加油哈~一、SQL后悔药1、操作delete或者update语句加个limit在执行删除或者更新语句尽量加上limit以下面的这条 SQL 为例吧delete from euser where age 30 limit 200;因为加了limit 主要有这些好处「降低写错SQL的代价」, 你在命令行执行这个SQL的时候如果不加limit执行的时候一个「不小心手抖」可能数据全删掉了如果「删错」了呢加了limit 200就不一样了。删错也只是丢失200条数据可以通过binlog日志快速恢复的。「SQL效率很可能更高」你在SQL行中加了limit 1如果第一条就命中目标return 没有limit的话还会继续执行扫描表。「避免了长事务」delete执行时,如果age加了索引MySQL会将所有相关的行加写锁和间隙锁所有执行相关行会被锁住如果删除数量大会直接影响相关业务无法使用。「数据量大的话容易把CPU打满」,如果你删除数据量很大时不加 limit限制一下记录数容易把cpu打满导致越删越慢的。2、变更SQL操作先在测试环境执行写明详细的操作步骤以及回滚方案并在上生产前review变更SQL操作先在测试环境测试避免有语法错误就放到生产上了变更Sql操作需要写明详细操作步骤尤其有依赖关系的时候如先修改表结构再补充对应的数据变更Sql操作有回滚方案并在上生产前review对应变更SQL。3、修改或删除重要数据前要先备份先备份先备份如果要修改或删除数据在执行SQL前一定要先备份要修改的数据万一误操作还能吃口「后悔药」~4、修改或者删除SQL先写WHERE查一下确认后再补充 delete 或 update尤其在操作生产的数据时遇到修改或者删除的SQL先加个where查询一下确认OK之后再执行update或者delete操作5、SQL命令行修改数据养成begin commit 事务的习惯1)正例begin;update account set balance 1000000where name 捡田螺的小男孩;commit;2)反例update account set balance 1000000where name 捡田螺的小男孩;二、SQL性能优化1、写完SQL先explain查看执行计划日常开发写SQL的时候尽量养成这个好习惯呀写完SQL后用explain分析一下尤其注意走不走索引。explain select userid,name,age from userwhere userid 10086 or age 18;2、写完SQL语句检查where,order by,group by后面的列多表关联的列是否已加索引优先考虑组合索引1)正例添加索引alter table user add index idx_address_age (address,age)2)反例select * from userwhere address 深圳 order by age;3、where后面的字段留意其数据类型的隐式转换1)正例select * from user where userid 123;2)反例//userid 是varchar字符串类型select * from user where userid 123;3)理由因为不加单引号时是字符串跟数字的比较它们类型不匹配MySQL会做隐式的类型转换把它们转换为浮点数再做比较最后导致索引失效。4、减少不必要的字段返回如使用select 代替 select *1)正例select idname from employee;2)反例select * from employee;3)理由节省资源、减少网络开销。可能用到覆盖索引减少回表提高查询效率。5、尽量使用varchar代替 char1)正例deptName varchar(100) DEFAULT NULL COMMENT 部门名称2)反例deptName char(100) DEFAULT NULL COMMENT 部门名称3)理由因为首先变长字段存储空间小可以节省存储空间。6、WHERE从句中不对列进行函数转换和表达式计算假设loginTime加了索引1)正例explain select userId,loginTimefrom loginuserwhere loginTime Date_ADD(NOW(),INTERVAL - 7 DAY);2)反例select userId,loginTimefrom loginuserwhere Date_ADD(loginTime,Interval 7 DAY) now();3)理由索引列上使用mysql的内置函数索引失效7、如果修改/更新数据过多考虑批量进行1)正例for each(200次){delete from account limit 500;}2)反例delete from account limit 100000;3)理由大批量操作会会造成主从延迟。大批量操作会产生大事务阻塞。大批量操作数据量过大会把cpu打满。三、SQL规范优雅1、设计表的时候所有表和字段都添加相应的注释这个好习惯一定要养成啦设计数据库表的时候所有表和字段都添加相应的注释后面更容易维护。1)正例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) ENGINEInnoDB AUTO_INCREMENT1570068 DEFAULT CHARSETutf8 ROW_FORMATREDUNDANT COMMENT账户表;2)反例CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,balance int(11) DEFAULT NULL,create_time datetime NOT NULL ,update_time datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id),KEY idx_name (name) USING BTREE) ENGINEInnoDB AUTO_INCREMENT1570068 DEFAULT CHARSETutf8;2、SQL书写格式关键字大小保持一致使用缩进1)正例SELECT stu.name, sum(stu.score)FROM Student stuWHERE stu.classNo 1班GROUP BY stu.name2) 反例SELECT stu.name, sum(stu.score) from Student stu WHERE stu.classNo 1班 group by stu.name.显然统一关键字大小写一致使用缩进对齐会使你的SQL看起来更优雅~3、NSERT语句标明对应的字段名称1)正例insert into Student(student_id,name,score) values (666,捡田螺的小男孩,100);2)反例insert into Student values (666,捡田螺的小男孩,100);4、设计数据库表的时候加上三个字段主键create_time,update_time1)正例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) ENGINEInnoDB AUTO_INCREMENT1570068 DEFAULT CHARSETutf8 ROW_FORMATREDUNDANT COMMENT账户表;2)反例CREATE TABLE account (name varchar(255) DEFAULT NULL COMMENT 账户名,balance int(11) DEFAULT NULL COMMENT 余额,) ENGINEInnoDB AUTO_INCREMENT1570068 DEFAULT CHARSETutf8 ROW_FORMATREDUNDANT COMMENT账户表;3)理由主键一般都要加上的没有主键的表是没有灵魂的创建时间和更新时间的话还是建议加上吧详细审计、跟踪记录都是有用的。阿里开发手册也提到这个点如图5、尽量把所有列定义为NOT NULL「NOT NULL列更节省空间」NULL列需要一个额外字节作为判断是否为 NULL 的标志位。「NULL列需要注意空指针问题」NULL列在计算和比较的时候需要注意空指针问题。6、所有表必须使用Innodb存储引擎Innodb 「支持事务支持行级锁更好的恢复性」高并发下性能更好所以呢没有特殊要求(即Innodb无法满足的功能如列存储存储空间数据等)的情况下所有表必须使用Innodb存储引擎。7、数据库和表的字符集尽量统一使用UTF8尽量统一使用UTF8编码可以避免乱码问题可以避免不同字符集比较转换导致的索引失效问题「如果需要存储表情那么选择utf8mb4来进行存储注意它与utf-8编码的区别。」8、如果修改字段含义或对字段表示的状态追加时需要及时更新字段注释这个点是阿里开发手册中Mysql的规约。你的字段尤其是表示枚举状态时如果含义被修改了或者状态追加时为了后面更好维护需要即时更新字段的注释。9、索引命名要规范主键索引名为 pk_ 字段名唯一索引名为 uk _字段名 普通索引名则为 idx _字段名说明pk_即primary keyuk_即unique keyidx_即index 的简称。参考与感谢[delete后加 limit是个好习惯么] (https://blog.csdn.net/qq_39390545/article/details/107519747)《阿里开发手册》作者丨捡田螺的小男孩来源丨公众号捡田螺的小男孩(IDgh_873ad5979a0b)dbaplus社群欢迎广大技术人员投稿投稿邮箱editordbaplus.cn