• mysql设计表时注意事项


    说明:本文是对项目过程中的一些要求的简单汇总整理,主要是供个人本身参考。。。

    一、表设计

    1、

    在创建表结构时,表名、字段需要见名知意,不采用拼音

    create table  `tb_abc` (
      `id` int(10) unsigned not null auto_increment comment  "此处写你的注释",
      `name` varchar(50) not null comment '此处写你的注释',
    )engine=innodb default charset=utf8mb4  comment '此处写你的注释';

    一定要有主键!一定要有主键

    整形自增(一般用无业务意义的id)(用mycat如有自增功能,就不需要在表结构里边定义自增)。

    不要在字段里边自己定义字符集

    字段和表要有comment

    2、

    首先明确规定:函数,触发器,视图,外键;所有逻辑业务上实现,尽量不使用存储过程,

    a)  一定使用innodb 引擎,不允许用myisam。

    b)     业务表设计时必须包含日期字段,createitme和lastupdatetime

             每个表的update 语句,必须包含对 UpdateTime的更新

             所有字段建议为not null  , 时间类型必须为not  null

    c) 必须要有主键,主键尽量用自增字段类型,推荐类型为 INT或者 BIGINT类型。

    d) 需要多表 join的字段,数据类型保持绝对一致。

    e) 当表的字段数较多时,将表分成两张表,一张作为条件查询表,一张作为详细内容表。

    f) 当字段的类型为枚举型或布尔型时,建议使用 tinyint类型。(不用char或者varchar)

    3、

    一定要整形ID作为主键(没有主键的表有严重性能问题)

    字段类型越短越好

    常见字段类型(一般不允许用text和blob),若必须使用则拆分到单独的表

    尽量不要使用default null,字段都定义为:not null default ‘合理默认值’

    4、

    为什么字段类型越短越好(能用整形的尽量用整形,比如tiny代替char(1))等

    1> 更少的存储空间

    2>更少的磁盘IO

    3> 更少的网络IO

    4>更少的MySQL计算空间

    5> 更少的APP计算空间

    6>整形存储和运算代价比字符型小

    有text字段的,最好请分表。(本质上说,不是mysql不适合存储text,而是在太多的情况下我们期望mysql能够更加高效的提供小数据查询/事务处理)

    表字段数要少而精

    5、

    为什么必须有自增整形主键,一般该字段没有业务意义;少用唯一键。

    image

    6、

    为什么尽量不要使用default null ?

    1> 索引不会包括NULL值。影响索引的统计信息,影响优化器的判断。

    2>复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。

    3> 所以我们在数据库设计时不要让字段的默认值为NULL。

    字段统一加上not null default ‘合理默认值’

    7、

    常见问题一——int(10)和int(2)区别

    有别于char(x)和varchar(x),int(x)中的x表示的是整型(tinyint smallint mediumint int bigint)在添加了zerofill描述符后的显示宽度,所以在不添加zerofill描述符的时候,int(1) 和int(10) int(100) 都没什么区别。

    image

    8、

    常见问题二——怎么存储IP

    用什么字段类型存储IP,char(15),varchar(15)还是int unsigned?

    image

    9、

    常见问题三——乱用字段类型

    1>所有字符串都用varchar(255)------------>给合适长度就好

    2>所有的数字都用bigint------->给合适类型,比如tinyint、smallint等

    3>所有数字都用decmal-------->不精确值,可以使用其他浮点型,或者用整形来代替

    二、索引

    1、

    开发人员要考虑到常用什么sql,一定要加上index。不能只是一个表只有一个主键。

    ● 不要修改聚集索引(主键)

    为了维持B+tree会带来大量的数据移动,所以一般要求使用跟业务不相关的id做一个整形自增主键

    ● 索引不是越多越好,尽量合并索引

    1>索引加快了查询度,但是却会影响写入性能。

    2> 一个表的索引应该结合这个表相关的所有SQL综合创建,尽量合并。

    3>组合索引的原则是,过滤性越好的字段越靠前。

    例如key (a)和key(a,b)存在,那么key(a)可以删除了,对于select ……from tb where a=123;可以用到索引(a,b)

    ● 不要给选择性低的字段建单列索引

    MySQL对索引的过滤性有要求,如果过滤性太低MySQL会放弃使用。

    ● 不要使用外键约束

    1> 对性能损耗特别大。

    2>让应用程序去维护约束。

    ● 字符类型字段尽量使用前缀索引

    太长的索引不仅影响写入性能,而且使用效果也差,因此字符串类型字段一般只建前缀索引

    alter table test_long_str add index idx_str(str(16));

    ● 合理使用复合索引

    ● LIKE查询的索引问题

    like只能使用前缀索引,因此 :

    1>col like "abc%" 能用上索引

    2>col like "%abc%" 不能能用上索引

    3>col like "%abc" 不能能用上索引

    2、

    image

    image

    image

    image

    三、SQL优化或规范

    image

    image

    image

    image

    image

    image

  • 相关阅读:
    漫谈递归转非递归
    (转)程序猿面试需要的知识点总结
    LeetCode:4_Median of Two Sorted Arrays | 求两个排序数组的中位数 | Hard
    LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium
    LeetCode: 221_Maximal Square | 二维0-1矩阵中计算包含1的最大正方形的面积 | Medium
    LeetCode: 2_Add Two Numbers | 两个链表中的元素相加 | Medium
    算法导论第十五章 动态规划
    AVL树探秘
    算法导论第十四章 数据结构的扩张
    算法导论第十三章 红黑树
  • 原文地址:https://www.cnblogs.com/zhangwuji/p/8110916.html
Copyright © 2020-2023  润新知