• mysql中写sql的好习惯


    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;

    }

    路漫漫其修远兮
  • 相关阅读:
    JSP引擎的工作原理
    Hibernate缓存配置
    理解LinkedHashMap
    如何在CMD下运用管理员权限
    sun.misc.BASE64Encoder找不到jar包的解决方法
    访问WEB-INF目录中的JSP文件
    Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门
    message from server: "Host 'xxx' is not allowed to connect to this MySQL server的解决
    深入Java单例模式
    (八)路径(面包屑导航)分页标签和徽章组件
  • 原文地址:https://www.cnblogs.com/wangnengwu/p/14335070.html
Copyright © 2020-2023  润新知