mysql日常使用经验积累

注意事项:

索引

  • KEY与INDEX的区别
    索引(INDEX)负责维护表的查找速度和操作速度,约束(KEY)负责维护表单完整性。同时,在mysql中的索引是约束索引(即创建索引自动也会创建约束),并且创建约束也会自动附带索引。之所以会这样做,因为mysql中的约束效果是通过索引实现的,例如mysql判断当前列是否是unique就是通过unique索引来判断的。
    在理论上是不能将KEY与INDEX划等号的,但在实际使用中,他们基本上么什么区别。

  • 索引查找sql优化
    1、如果索引多个字段,第一个字段最好用经常作为查询条件的。
    2、长字段支持前缀索引
    3、索引必须有足够的区分度
    4、如果一个表数据很多,可以拆分成多个表

  • 唯一约束
    唯一约束是指所有记录中的字段不能出现重复值。唯一约束与主键约束相似,都能确保列的唯一性。不同的是,唯一约束在一个表中可以有多个,并且设置唯一约束的列允许有空值,但是只能有一个。而主键约束一个表中只能有一个,且不允许有空值。
    联合唯一索引
    UNIQUE KEY uniq_user_id_dept_id、(user_id, dept_id)这样user_id和dept_id的联合字段就不能重复了
    例如:

CREATE TABLE `user_dept` (
  `id`            BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
  `user_id`         BIGINT UNSIGNED NOT NULL COMMENT '用户id',
  `dept_id`        BIGINT UNSIGNED NOT NULL COMMENT '部门id',
  `create_time` BIGINT UNSIGNED NOT NULL COMMENT ’创建时间',
  UNIQUE KEY `uniq_user_id_dept——id`(`user_id`, `dept_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色部门关系表';

字段

  • 字段选择
    1、字段选择的一般原则是保小不保大,能用占用字节小的字段就不用大字段。对于主键强烈建议用自增类型,这样能节省空间。对于时间存储有datetime和timestamp,datetime占用8个字节,而timestamp占用4个字节,所以没有特殊必要一定要有timestamp。

  • 字段名不要使用desc,desc是mysql的关键字。
    1、desc tablename用来获取表的数据结构;
    2、desc在order by中代表倒叙,例如: select * from table order by id desc(asc)

  • 对于设置为非null的varchar字段,为了防止传入null,加一个StringUtils.trimToEmpty(str),最好处理一下容错。

类型

  • 数值类型:
类型大小(字节)范围(有符号)范围(无符号)
bigint8-2^63 ~ 2 ^63 - 10 ~ 2^64 - 1
int4-2^31 ~ 2 ^31 - 10 ~ 2^32 - 1
smallint2-2^15 ~ 2 ^15 - 10 ~ 2^16 - 1
tinyint1-2^7 ~ 2 ^7 - 10 ~ 255
  • 字符串类型:
类型范围(字节)
varchar最大长度:65535 (2^16 - 1)
tinytext255 (2 ^8 - 1)
text65535 (2^16 - 1)
mediumtext2^24 - 1
longtext2^32 - 1
tinyblob255 (2 ^8 - 1)
blob65535 (2^16 - 1)
mediumblob2^24 - 1
longblob2^32 - 1

text:用来保存字符数据;blob:用来保存二进制数据。它们两个超过长度都会截断,并产生一条sql警告。
**注意:**如果给text、blob加索引,必须制定前缀索引;text、blob不能有默认值。

字符集

  • gbk
    gbk编码存储的最大字符长度2字节。
  • utf8
    utf8编码存储的最大字符长度为3字节,如果遇到4个字节的字符就会插入异常。三个字节的utf8最大能编码的Unicode字符是0xffff,也就是Unicode中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的Unicode字符,都无法使用mysql的utf8存储。包括Emoji表情等
  • utf8mb4
    utf8mb4最多存储4个字节。

排序字符集:COLLATION

字符除了需要存储,还需要排序或比较大小。
utf8mb4对应的排序字符集有utf8mb4_unicode_ci、utf8mb4_general_ci.

  • utf8mb4_unicode_ci:基于标准的Unicode来排序和比较,能够在各种语言之间精确排序。其实,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法,所以性能比utf8mb4_general_ci慢一些。
  • utf8mb4_general_ci:没有实现Unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。在比较和排序的时候更快。

其实,在绝大多数情况下,不会发生复杂比较。相比选择哪一种collation,使用者更应该关心字符集与排序规则在db里需要统一。

SQL语句

  • 插入语句
    批量插入:key重了会更新时间
CREATE TABLE `user_dept` (
  `id`            BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
  `user_id`         BIGINT UNSIGNED NOT NULL COMMENT '用户id',
  `dept_id`        BIGINT UNSIGNED NOT NULL COMMENT '部门id',
  `create_time` BIGINT UNSIGNED NOT NULL COMMENT ’创建时间',
  UNIQUE KEY `uniq_user_id_dept——id`(`user_id`, `dept_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色部门关系表';

insert into `user_dept` (user_id,dept_id, create_time) values (1, 1, 1), (2, 2, 2) on duplicate key update create_time = now;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值