sql编写
一些规范
- 写完SQL先explain查看执行计划 ,分析是否走索引(索引后面文章会详细讲述);
- 操作delete或者update语句,加个limit,加limit优点
- 降低写错SQL代价:如果误操作的话,可以通过binlog日志快速恢复
- 提供性能:加了limit 1,如果第一条就命中目标return, 没有limit的话,还会继续执行扫描表。
- 避免长事物:delete执行时,如果age加了索引,MySQL会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。
- 数据量大的话,容易把CPU打满
- 设计表的时候,所有表和字段都添加相应的注释
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='账户表';
- INSERT语句标明对应的字段名称
insert into Student(student_id,name,score) values ('666','捡田螺的小男孩','100');
- 变更SQL操作先在测试环境执行,写明详细的操作步骤以及回滚方案,并在上生产前review。
- 设计数据库表的时候,加上三个字段:主键,createtime,updatetime。
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
`name` varchar(255) 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=1 DEFAULT CHARSET=utf8mb4 COMMENT='账户表';
- 写完SQL语句,用explain检查where,order by,group by后面的列,多表关联的列是否已加索引,优先考虑组合索引。
- where后面的字段,留意其数据类型的隐式转换。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/24edec0d86be2f7351ad44c0cb9311a0.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5eaf4bc0cf39f268cfa9abbaa12f9675.png)
- 尽量把所有列定义为NOT NULL。NOT NULL列更节省空间,而且NULL列需要注意空指针问题。
- 修改或者删除SQL,先写WHERE查一下,确认后再补充 delete 或 update。尤其是生产库。
- 减少不必要的字段返回,如使用select <具体字段> 代替 select *。
- 所有表必须使用Innodb存储引擎。
- 数据库和表的字符集统一使用UTF8,(如果是存储表情的,可以考虑 utf8mb4)。
- 尽量使用varchar。
- 索引命名要规范,主键索引名为 pk 字段名;唯一索引名为 uk 字段名 ; 普通索引名则为 idx _字段名。
- WHERE从句中不对列进行函数转换和表达式计算(索引失效)。