在后端开发中,经常需要设计数据库表,下面简单聊一下mysql的表设计原则。
1、命名规范
数据库表名、字段名、索引名等都需要统一命名规范,且需要具有可读性,英文或英文简写,切忌中英文混用。
反例:

acc_no,
zhanghao

正例:

account_no,
account_number
  • 表名、字段名须使用小写字母或数字,禁止使用数字开头,禁止使用拼音,用‘_’连接;
  • 主键索引名为pk_字段名,唯一索引名为uk_字段名,普通索引名为idx_字段名;

2、字段类型
设计表时,选择合适的字段类型:

  • 尽可能选择存储空间小的字段类型,如数字类型的,从tinyint、smallint、int、bigint从左往右开始选择;
  • 小数类型选择decimal,如金额,禁止使用float和double;
  • varchar是可变长字符串,不预先分配存储空间,长度不要超过5000;
  • 若存储的值太大,建议字段类型选择text,且独立出单个表,通过主键与之对应;

3、主键
主键设计的话,最好不要与业务逻辑有关联,如身份证,虽然是唯一的,但不建议。主键最好是毫无意义的一串独立不重复的数字,如自增的主键或雪花算法生成的主键;

4、字段长度
在mysql中,varchar和char类型表示字符长度,而其他类型表示的长度都是字节长度。如char(10)表示字符长度为10,而bigint(4)表示字节长度为4,但因为bigint实际长度是8个字节,所以bigint(4)的实际长度就是8个字节。
在设计表时,需要充分考虑一个字段的长度,一般设置为2的次方。

5、逻辑删除与物理删除

  • 逻辑删除:表结构中添加一个字段,如is_deleted,用于标记该条记录是否为逻辑删除;
  • 物理删除:将数据从硬盘中删除,可释放存储空间;

物理删除执行的是delete操作,逻辑删除执行的是update操作。由于物理删除后恢复数据困难,在业务表中的数据建议做逻辑删,即更改数据的状态,否则容易引发关联问题。

6、create_time、update_time
通常在设计表结构时,需要考虑添加通用字段,如主键、create_time,update_time,create_id,update_id,remark等。

7、一张表的字段不宜过多
在建表时,一张表的字段不宜过多,一般尽量不要超过20个字段。若一张表中的字段过多,表中存储的数据可能就会很大,查询效率就会降低。若业务需求很多字段时,可以把一张大的表拆成多张小的表,然后进行关联。

8、NOT NULL
若没有要求,一般建议将字段定义为NOT NULL。NOT NULL可以防止出现空指针问题,而NULL可能会导致索引失效,且也会占用空间,运算更为复杂。

9、索引

  • 索引不要建的太多,一般单表索引个数不要超过5个,因为过多会导致写慢;
  • 数据量大时再创建索引;
  • 区分度不高的字段不能加索引,如性别;

10、不搞外键关联
外键foreign key,是表中的一个字段设置为外键,用于将两个表连接在一起的健。外键是用来保证数据的一致性和完整性的。
阿里的java规范中建议不得使用外键与级联,一切外键概念须在应用层解决。因为使用外键容易引发性能问题、并发死锁问题、使用不便等。

11、字符集
数据库、表、程序等都需要通用字符集,通常中英文环境使用utf-8。

  • utf8:支持中英文混合场景,3个字节长度;
  • utf8mb4:完全兼容utf8,4个字节长度,一般存储emoji表情需要使用;
  • GBK:支持中文,但是不支持国际通用字符集,2个字节长度;

12、时间类型

在mysql中,时间类型有date、datetime、time、timestamp、year

  • date:表示的日期值, 格式yyyy-mm-dd,范围1000-01-01 到 9999-12-31,3字节;
  • time:表示的时间值,格式 hh:mm:ss,范围-838:59:59 到 838:59:59,3字节;
  • datetime:表示的日期时间值,格式yyyy-mm-dd hh:mm:ss,范围1000-01-01 00:00:00到9999-12-31 23:59:59```,8字节,跟时区无关;
  • timestamp:表示的时间戳值,格式为yyyymmddhhmmss,范围1970-01-01 00:00:01到2038-01-19 03:14:07,4字节,跟时区有关;
  • year:年份值,格式为yyyy。范围1901到2155,1字节;

推荐优先使用datetime类型来保存日期和时间,因为存储范围更大,且跟时区无关。

13、分库分表

  • 分库:就是一个数据库分成多个数据库,部署到不同机器;
  • 分表:就是一个数据库表分成多个表;

数据量太大的话,SQL的查询就会变慢。如果一个查询SQL没命中索引,千百万数据量级别的表可能会拖垮整个数据库。即使SQL命中了索引,如果表的数据量超过一千万的话,查询也是会明显变慢的。这是因为索引一般是B+树结构,数据千万级别的话,B+树的高度会增高,查询就变慢。建议超过500万数据量级别时进行分库分表。

14、sql语句

  • 查询sql尽量不要使用select * ,而是具体字段;
  • 若是知道查询结果为一条/最大/最小,建议使用limit 1;
  • 避免在where中使用or连接;
  • 避免在索引列上使用mysql的内置函数;
  • 避免在where 子句中使用!=或<>操作符;

15、性能分析工具
show profile;
mysqlsla;
mysqldumpslow;
explain;
show slow log;
show processlist;

Mysql之表设计浅析相关推荐

  1. MySQL - 库表设计之IP和TIMESTAMP的处理

    文章目录 学习更多干货 Pre TIMESTAMP IP 总结 学习更多干货 带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试 Pre MySQL - 高效的设计MySQL库 ...

  2. MySQL数据表设计优化

    MySQL数据表设计优化 一.选择优化的数据类型 二.范式和反范式 2.1 范式 2.2 范式优缺点 2.3 反范式 2.3 反范式优缺点 2.4 混用范式化和反范式化 三.使用缓存表和汇总表 一.选 ...

  3. MySQL数据库表设计

    MySQL数据库表设计 ​ 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要 ...

  4. mysql栏目表设计_MySQL表设计

    文章摘自: https://mp.weixin.qq.com/s?__biz=MzI2NDU3OTg5Nw==&mid=2247483799&idx=1&sn=4d1f45ab ...

  5. 高性能Mysql数据库表设计原则

    为什么80%的码农都做不了架构师?>>>    1.更小通常更好 选择表示数据的最小类型(正确存储你的内容):比如说,能够使用char 数据类型存储,就不必选择varchar,能够使 ...

  6. MySQL - 数据库表设计 - 范式

    目录 一.数据库设计的重要性 二.范式 - 简介: 1.什么是范式? 第一范式 - 单一列 第二范式 - 中间表 - 一对多 第三范式 - 不产生中间表 - 一对一.多对一 三.数据库表设计的注意要点 ...

  7. mysql 评价表设计_来聊聊mysql单表评论系统怎么设计

    评论系统对于一个网站来说几乎是必不可少的,当然评论系统的设计也多种多样.一般情况下,评论数据表会和一个用户信息表结合使用,就是在评论表中记录的有用户id(例如user_id),然后查询评论数据的时候根 ...

  8. mysql数据库表设计——如何对图片进行存储

    业务场景:当我们进行头条文章接口的设计时,需要存储封面图片的字段. 文章和图片关系 ----> 一对多 方案一:传统的表设计 设计一张表,专门保存文章和封面图片之间的关系 id article_ ...

  9. 搭建个人博客之 mysql 数据库表设计

    代码地址:https://github.com/hefeng6500/blog-server/blob/master/sql_design/blog.sql SHOW DATABASES; DROP ...

最新文章

  1. Navigator 对象 深入研究
  2. Java锁详解之ReentrantLock
  3. 在八十年代末,比尔·盖茨和史蒂夫·巴尔默
  4. Java命令学习系列
  5. 家用计算机注意哪些参数,电脑小白买内存条要注意哪些?主要看哪些参数?这些知识要掌握...
  6. 那些年踩过的eleUl上传图片的坑?
  7. 怎样使用计算机上的高级共享设置,win7打印机共享怎么设置
  8. XCode中的Debug View Hierarchy功能
  9. 1进程 ppid_Python每日3题什么是僵尸进程和孤儿进程?
  10. php如何使用代码生成pdf文件,教你利用PHP生成PDF文件
  11. P-NUCLEO-IHM001 板载STLINK 驱动安装
  12. Python+APP端+执行adb命令
  13. thinkphp 实现图片中的二维码识别
  14. CSS实现平行四边形
  15. python将一张图片粘贴到另外一张图片上,按照指定坐标放置
  16. 阿里云大数据+AI技术沙龙上海站回顾 | ​揭秘TPC-DS 榜单第一名背后的强大引擎...
  17. 【DDOS 防御小建议】
  18. Sphnix + Markdown 记笔记之一目了然的搭建过程
  19. 打破传统的控制理论之(控制理论+深度学习)
  20. 从零开始设计RISC-V处理器——单周期处理器的设计

热门文章

  1. 想做好虚拟资源项目,掌握这三种玩法就够了
  2. python将list转换为迭代器代码_python中的迭代器附带代码示例
  3. 试用用友致远最新版协同产品A8
  4. 智能手机上的显卡 解读ARM架构主流GPU
  5. DApp区块链 | wireshark抓包
  6. 前端人脸识别/人脸登录(react)
  7. LV 旗下公司研发鉴定工具,四秒识别假包包
  8. 语音技术现状:四千万突破语音产业的技术壁垒?
  9. 01_PYNQ Library详解 - IP访问
  10. 抖音上很火的动态相册(末尾附加下载地址)