MySQL 小记

2018/04/03 MySQL 共 921 字,约 3 分钟
山川尽美

1. InnoDB 表如何设计主键索引

建表语句:

a 表:

CREATE TABLE `a` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`message_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`msg` varchar(1024) DEFAULT NULL,
`gmt_create` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`,`message_id`),
KEY `idx_gmt_create` (`gmt_create`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

b 表:

CREATE TABLE `b` (
`user_id` int(11) NOT NULL,
`message_id` int(11) NOT NULL,
`msg` varchar(1024) DEFAULT NULL,
`gmt_create` datetime NOT NULL,
PRIMARY KEY (`user_id`,`message_id`),
KEY `idx_gmt_create` (`gmt_create`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

a 表和 b 表区别:

 记录空间优点缺点适用场景
A 表500 万(顺序)509 M主键 ID 自增,在写入数据的候,Btree 分裂成本低,写性能高物理空间相对较多,如果根据 user_id 来查记录,需要走两次 IO写操作较多
B 表500 万(随机)361 M1.物理空间相对减少 2.根据 user_id 查数据,直接走主键拿到数据,无需回表(user_id,message_id)为随机写入,Btree 分裂成本高,写性能低写少读多的场景,例如从hadoop回流到MySQL的统计结果表,这种统计结果一般数据较多,但主要是读

2. 字符串索引隐式转换

字段类型为字符串,查询时使用 数值型,该字段所在的索引不会用到。

  • 数字类型的 0001 等价于 1

  • 字符串的 0001 和 1 不等值

  • 当字符串的列有对应的索引,而在 where 条件里面不指定为字符串, index 无法确认最终的记录

  • 被隐式转换后,会进行全表遍历

  • 建表需要注意对应好字段类型

文档信息

Search

    Table of Contents