美文网首页技术
数据库主键设计

数据库主键设计

作者: 良人与我 | 来源:发表于2018-12-18 07:36 被阅读48次

先来一个测,看看主键长度对查询和插入性能的影响。
两个表
t_book 主键是string 长度 36 字节
t_student 主键是bigint 8字节

CREATE TABLE `t_book` (
  `book_id` varchar(36) NOT NULL,
  `book_desc` varchar(255) DEFAULT NULL,
  `book_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `t_student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `create_time` datetime DEFAULT NULL,
  `sname` varchar(255) DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8mb4;

通过程序每个表插入 100w 条数据
t_book 花费的时间是 t_student 的十倍以上
(已经有100W 再通过程序每次插入1,连续100次。 t_book 花费 35分钟,t_student 花费4分钟)

再看看 查询 count(*) 的性能

SELECT count() from t_book
query time 3.187s
SELECT count(
) from t_student
query time 0.274s

差距在10倍以上

数据是200W时候

SELECT count() from t_book
query time 7.056s
SELECT count(
) from t_student
query time 0.556s

差距依然在10倍以上

插入速度慢原因

因为插入时候主键的生成策略用的是 uuid
因为是无序的,所以每次索引生成时候需要重排序,浪费时间。

查询速度慢原因

查询connt(*)时候,需要将索引读入到内存中。
如果索引长度越长,同样多的索引需要存储的磁盘空间越大。磁盘IO 也是系统中最大的瓶颈。导致整个性能下降。

所以考虑到性能,主键最好是 递增的并且占用存储空间小。

单表情况

可以是 long 型, 自增主键。

分表情况

需要一个id 生成器。
timestemp + 序列号 + 机器号 组成的 数字
需要保证时间不能回滚,否则会出现重复的id

相关文章

  • 浅谈数据库主键外键索引

    目录 1、主键、外键、索引定义 2、为什么定义主键、外键 3、主键和外键的关系 4、数据库中主键和外键的设计原则 ...

  • 数据库表设计规范

    数据库表设计规范 1.1、主键: 表必须有主键; 不使用更新频繁的列做主键; 尽量不选择字符串列做主键; 不使用 ...

  • 数据库面试基础

    1,数据库设计3范式 原子性,数据库字段属性不可以再分割 完全依赖,非主键属性必须完全依赖主键,不能依赖主...

  • 数据库主键的设计

    九种分布式ID生成方式 一、数据库主键的设计原则 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外...

  • 开发规范

    数据库设计的规范 数据库表和字段都大写 表都要加业务后缀,例如_C客户表 _B基础表 _P权限表 必须有主键,主键...

  • mybatis 返回新增自增主键id

    场景: 当我们设计数据库表主键id为自增主键时,通过mybatis新增插入一条数据,我们期望返回当前插入数据的主键...

  • 数据库主键设计

    先来一个测,看看主键长度对查询和插入性能的影响。两个表t_book 主键是string 长度 36 字节t_st...

  • sqlserver2008 添加主键并设置为自动增长

    设置主键:在数据库表的“设计界面” 右键单击弹出菜单中选择设置为“主键”即可; 设置自动增长 在列属性下方 找到“...

  • MySQL之主键

    引用 数据表的主键选择 设计套路:Mysql主键的选择 数据库的唯一标示符(ID)的选择 MySQL 使用自增ID...

  • SQL学习笔记——数据库设计三范式

    数据库设计范式:数据库表的设计依据。教你怎么进行数据库表的设计。 第一范式:要求任何一张表必须有主键,没一个字段原...

网友评论

    本文标题:数据库主键设计

    本文链接:https://www.haomeiwen.com/subject/htndhqtx.html