码迷,mamicode.com
首页 > 数据库 > 详细

mysql中写sql的好习惯

时间:2021-01-28 11:55:05      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:res   group   说明   insert   计算   unique   charset   rom   datetime   

1 写完SQL先explain 查看执行计划

写完SQL,用explain分析一下,尤其注意走不走索引

explain select userid,name,age from user where userid=10086 or age=18;

 

2操作delete或者update语句,加个limit

delete from euser where age > 30 limit 200;

 好处:

降低写错SQL的代价

SQL效率很可能更高

避免了长事务

数据量大的话,容易把CPU打满,系统越来越卡和越删越慢

 

3设计表的时候,所有表和字段都添加相应的注释

设计数据库表的时候,所有表和字段都加上对应注释,后面更容易维护

create table  ‘account‘  (

  ‘id‘  int(11) not null auto_increment comment  ‘主键‘,

  ’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=‘账户表‘;

 

4 SQL书写格式,关键字大小保持一致,使用缩进

SELECT stu.name,sum(stu.score)

FROM Student stu

WHERE stu.classNo=‘1班‘

GROUP BY stu.name;

 

5 INSERT 插入标明对应字段名称

insert into  student (student_id,name,score)  values (‘666‘,‘sky‘,‘100‘);

 

6 变更SQL操作先在测试环境执行,写明详细的操作步骤以及回滚方案,并在上生产前review

 

7设计数据库表的时候,加上3个字段:主键,create_time,update_time

create table  ‘account‘  (

  ‘id‘  int(11) not null auto_increment comment  ‘主键‘,

  ’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, groug by 后面的列,多表关联的列是否已加索引,优先考虑组合索引

添加索引:

alter table user add index idx_address_age 9(address,age)

explain select * from user where address=‘深圳‘  order by age;

 

9修改或删除重要数据前,要先备份,先备份,先备份

 

10 where后面的11字段,留意其数据类型的隐式转换

反例:

select * from user where userid = 123;

正例:

select * from user where userid = ‘123‘;

因为不加单引号,是字符串跟数字的比较,他们类型不匹配,MYSQL会做隐式类型转换,把他们转换成浮点数再做比较,最后导致索引失效

 

11  尽量把所有列定义为not null

NOT NULL  列更节省空间,null列需要一个额外字节作为判断是否为null的标志位

null列需要注意空指针问题,NULL列在计算和比较的时候,需要注意空指针问题

 

12减少不必要的字段返回,如使用select <具体字段>代替select *

13 所有表必须使用Innodb储存引擎

14数据库和表的的字符集尽量统一使用UTF8

可以避免乱码问题

可以避免,不同字符集比较转换,导致的索引失效问题

 

15 尽量使用varchar代替char

‘deptname‘ varchar(100) DEFAULT NULL COMMENT ’部门名称‘

因为首先变长字段存储空间小,可以节省存储空间

 

16 SQL命令行修改数据,养成begin + commit 事务的习惯

begin;

update account set balance = 100000 where name = ‘sky‘;

commit;

 

17索引命名要规范,主键索引名为pk_字段名,唯一索引名为uk_字段名,普通索引名为idx_字段名

说明:

pk即primary key,  uk即unique key,   idx即index的简称

 

18 如果修改更新数据过多,考虑批量进行

for each (200次)

{

 delete from account limit 500;

}

 

mysql中写sql的好习惯

标签:res   group   说明   insert   计算   unique   charset   rom   datetime   

原文地址:https://www.cnblogs.com/wangnengwu/p/14335070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!