网站建设需申请注册域名,app平台推广怎么做,网站建设开题报告,康展 wordpress1. 写完SQL先explain查看执行计划#xff08;SQL性能优化#xff09;日常开发写SQL的时候#xff0c;尽量养成这个好习惯呀#xff1a;写完SQL后#xff0c;用explain分析一下#xff0c;尤其注意走不走索引。explain select * from user where userid 10086 or age 18;2…1. 写完SQL先explain查看执行计划SQL性能优化日常开发写SQL的时候尽量养成这个好习惯呀写完SQL后用explain分析一下尤其注意走不走索引。explain select * from user where userid 10086 or age 18;2、操作delete或者update语句加个limit(SQL后悔药在执行删除或者更新语句尽量加上limit以下面的这条 SQL 为例吧delete from euser where age 30 limit 200;因为加了limit 主要有这些好处防止误删大量数据, 你在命令行执行这个SQL的时候如果不加limit执行的时候一个不小心手抖可能数据全删掉了如果删错了呢加了limit 200就不一样了。删错也只是丢失200条数据可以通过binlog日志快速恢复的。SQL效率很可能更高你在SQL行中加了limit 1如果第一条就命中目标return 没有limit的话还会继续执行扫描表。避免了长事务delete执行时,如果age加了索引MySQL会将所有相关的行加写锁和间隙锁所有执行相关行会被锁住如果删除数量大会直接影响相关业务无法使用。数据量大的话容易把CPU打满,如果你删除数据量很大时不加 limit限制一下记录数容易把cpu打满导致越删越慢的。分批删除数据避免锁表问题在大表上执行大规模DELETE操作可能长时间持有表锁尤其在 MyISAM 引擎中导致事务日志暴涨InnoDB引起主从复制延迟消耗大量内存和 CPU。3. 设计表的时候所有表和字段都添加相应的注释SQL规范优雅这个好习惯一定要养成啦设计数据库表的时候所有表和字段都添加相应的注释后面更容易维护。正例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账户表;反例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;4. SQL书写格式关键字大小保持一致使用缩进。SQL规范优雅正例SELECT 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 (123,张三,100);正例insert into Student(student_id,name,score) values (123,张三,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 余额, ) ENGINEInnoDB AUTO_INCREMENT1570068 DEFAULT CHARSETutf8 ROW_FORMATREDUNDANT 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 ) ENGINEInnoDB AUTO_INCREMENT1570068 DEFAULT CHARSETutf8 ROW_FORMATREDUNDANT 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 NULLSQL规范优雅NOT NULL列更节省空间NULL列需要一个额外字节作为判断是否为 NULL 的标志位。NULL列需要注意空指针问题NULL列在计算和比较的时候需要注意空指针问题。12.修改或者删除SQL先写WHERE查一下确认后再补充 delete 或 updateSQL后悔药尤其在操作生产的数据时遇到修改或者删除的SQL先加个where查询一下确认OK之后再执行update或者delete操作13.减少不必要的字段返回如使用select 具体字段 代替 select * SQL性能优化反例select * from employee;正例select idname from employee;理由节省资源、减少网络开销。可能用到覆盖索引减少回表提高查询效率。14.所有表必须使用Innodb存储引擎SQL规范优雅Innodb 支持事务支持行级锁更好的恢复性高并发下性能更好所以呢没有特殊要求即Innodb无法满足的功能如列存储存储空间数据等的情况下所有表必须使用Innodb存储引擎15.数据库和表的字符集统一使用UTF8SQL规范优雅统一使用UTF8编码可以避免乱码问题可以避免不同字符集比较转换导致的索引失效问题如果是存储表情的可以考虑 utf8mb416. 尽量使用varchar代替 char。SQL性能优化反例deptName char(100) DEFAULT NULL COMMENT 部门名称正例deptName varchar(100) DEFAULT NULL COMMENT 部门名称理由因为首先变长字段存储空间小可以节省存储空间。