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最好的写的_mysql中写sql的好习惯相关推荐

  1. mysql 反斜杠 转义_MySQL中执行sql语句反斜杠需要进行转义

    最近在执行一个sql备份的还原后,发现系统的部分路径找不到,于是开始debug,最后发现,是由于备份的sql语句在还原时,反斜杠(\)被mysql吃掉了.本文对反斜杠和顺斜杠进行了测试,并给出了解决方 ...

  2. mysql脚本中如何写判断_mysql中如何写判断语句

    mysql中写判断语句的方法: 方法一.CASE函数 case函数语法:CASE condition WHEN value1 THEN returnvalue1 WHEN value2 THEN re ...

  3. java mysql查询字段换行,java类中写sql语句,查询条件包含换行

    java类中写sql语句,查询条件包含换行 detachedCriteria.add(Restrictions.or( Restrictions.like("chengBanDanWeiId ...

  4. mysql如何查看事务日记_MySQL中的几种日志了解

    前言 MySQL中有以下日志文件,分别是: 1:重做日志(redo log) 2:回滚日志(undo log) 3:二进制日志(binlog) 4:错误日志(errorlog) 5:慢查询日志(slo ...

  5. mysql重做日志恢复数据_MySQL中重做日志,回滚日志,以及二进制日志的简单总结...

    MySQL中有六种日志文件, 分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log). ...

  6. mysql按升序创建索引_Mysql中的降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...

  7. mysql里面integer默认宽度_MySQL中关于数据类型指定宽度之后的情况

    概述 MySQL有很多种数据类型,最常用的就是int,char,varchar,这些类型在创建表的时候都可以指定该字段的宽度,方法是在类型后面加一个括号,括号中写宽度就可以了. 但是,在指定宽度之后, ...

  8. mysql约束添加删除数据_mysql中约束的添加,修改,与删除

    MySQL中的约束,添加约束,删除约束,以及其他的一些修饰: 一.NOT NULL(非空约束) 添加非空约束 1)建表时直接添加 CREATE TABLE t_user(user_id INT(10) ...

  9. mysql数据库回滚日志_MySQL中是如何实现事务提交和回滚的?

    什么是事务 事务是由数据库中一系列的访问和更新组成的逻辑执行单元 事务的逻辑单元中可以是一条SQL语句,也可以是一段SQL逻辑,这段逻辑要么全部执行成功,要么全部执行失败 举个最常见的例子,你早上出去 ...

  10. mysql prepare有什么用_mysql中的prepare介绍和应用

    简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名.在其他的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变 ...

最新文章

  1. 【Android 逆向】ELF 文件格式总结 ★★★
  2. ffmpeg 把视频解码成jpg
  3. 怎么样在线创建索引或者重构索引
  4. dbc连接mysql_Spring WebFlux 使用 R2DBC 访问 MySQL
  5. 机器学习笔记九之支持向量机
  6. ctf php文件上传图片格式,CTF-WEB:文件上传
  7. tp5 查询求和_tp5 sum某个字段相加得到总数的例子
  8. 系统学习机器学习之SVM(二)
  9. 注解@PostConstruct与@PreDestroy讲解及实例
  10. 计算机对电器的影响论文,突然断电到底伤不伤电器:这是答案
  11. 创造与魔法服务器多久维护一次,创造与魔法维护大概多久 | 手游网游页游攻略大全...
  12. python爬取网易云音乐数据
  13. 学习Java还是学习大数据,哪个好?
  14. SQL 日期交差判断
  15. 1和4互素吗_互素是什么意思判别方法,1和2互素,互素
  16. echart 广州3d_datav比较echart
  17. 简体字转换繁体字的winfrom小程序
  18. 怎样学计算机打字最快,怎样学电脑快速打字
  19. impala与hive标准差函数的差异
  20. 小学计算机二课活动记录,小学教研活动记录

热门文章

  1. Android组件化开发实践
  2. Python 对象的绑定方法
  3. 修改/etc/resolv.conf又恢复到原来的状态
  4. linux下MySQL安装及设置
  5. javaScript 中创建json/转换字符串为json
  6. C#窗体控件-文本框控件TextBox
  7. 如何删除动态数组的指定元素 - 回复 Splendour 的部分问题
  8. excel格宽度转html像素,使列表框的列宽自动适应内容的宽度?(已有思路但需解决转换成像素问题)...
  9. 操作对象_word选择操作技巧:不同操作对象,选择方式不同?
  10. UUIDGenerator