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 M | 1.物理空间相对减少 2.根据 user_id 查数据,直接走主键拿到数据,无需回表 | (user_id,message_id)为随机写入,Btree 分裂成本高,写性能低 | 写少读多的场景,例如从hadoop回流到MySQL的统计结果表,这种统计结果一般数据较多,但主要是读 |
2. 字符串索引隐式转换
字段类型为字符串,查询时使用 数值型,该字段所在的索引不会用到。
数字类型的 0001 等价于 1
字符串的 0001 和 1 不等值
当字符串的列有对应的索引,而在 where 条件里面不指定为字符串, index 无法确认最终的记录
被隐式转换后,会进行全表遍历
建表需要注意对应好字段类型
文档信息
- 本文作者:Zhang jinmiao
- 本文链接:http://zhangjinmiao.github.io/mysql/2018/04/03/Mysql.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)