[MySQL]数据库与表创建

欢迎来到啾啾的博客🐱。
这是一个致力于构建完善 Java 程序员知识体系的博客📚。
它记录学习点滴,分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。

本篇简单记录总结一下数据库、表创建事项。
持续更新。

目录

  • 创建数据库
    • 字符集(Charset)与排序规则(Collation)
      • 字符集 Charset
      • 排序规则
    • 引擎
  • 创建表
    • 命名
      • 命名规范
      • 注意事项
    • 三范式
    • 理解数据类型
      • 必须字段
      • 通用冗余字段
    • 合适的索引

创建数据库

字符集(Charset)与排序规则(Collation)

使用可视化工具创建MySQL数据库时,可以选择数据编码(CHARSET)与排序规则(COLLATE)。
不选择时模式字符集为utf8mb4,排序规则为utfmb4_0900_ai_ci。

下面做这两者的具体解释。

字符集 Charset

字符集是数据库中字符的编码方式,决定了可以存储哪些字符(如字母、符号、表情等)。

  • utf8mb4:支持完整的Unicode字符(如Emoji),推荐使用。

  • latin1:仅支持西欧语言字符。

  • gbk:支持简体中文。

  • 若需多语言支持(如中文、日文、Emoji),使用 utf8mb4(MySQL的utf8仅支持3字节,已过时)。

  • 仅需英文或西欧字符时,可用更节省空间的latin1

排序规则

排序规则是字符集中字符的比较和排序规则,影响ORDER BY、WHERE查询及索引行为。

排序规则组成部分为:字符集_版本_附加规则_比较规则

以默认的排序规则为utfmb4_0900_ai_ci为例

0900(基于 Unicode 9.0 标准)
常见版本:

  • unicode::版本<MySQL8.0使用
  • 0900: 新版unicode,MySQL8.0+版本支持
  • general:较简单的排序规则,性能略优但不精确

ai-发音无关
ci-不区分大小写
常见后缀(附加规则、比较规则):

  • ci(Case Insensitive):不区分大小写(如'a' = 'A')。
  • cs(Case Sensitive):区分大小写(如'a' ≠ 'A')。
  • bin(Binary):按二进制值比较(区分大小写和重音)。
  • ai(Accent Insensitive):不区分重音符号(如 a = à = á)。
  • as(Accent Sensitive):区分重音符号(如 a ≠ à ≠ á)。

MySQL 8按默认使用utfmb4_0900_ai_ci,之前版本使用utf8mb4_unicode_ci即可。

引擎

MySQL常见的引擎有MyISAM和InnoDB。

特性MyISAMInnoDB
事务支持❌ 不支持事务✅ 支持 ACID 事务(提交、回滚、隔离)
锁机制表级锁(写操作会锁全表)行级锁(写操作仅锁定特定行)
外键约束❌ 不支持✅ 支持外键约束
崩溃恢复❌ 数据易损坏,需手动修复✅ 通过 redo log 自动恢复,可靠性高
索引结构非聚簇索引(索引与数据分离)聚簇索引(主键索引直接存储数据行)
全文索引✅ 支持(早期版本仅支持 MyISAM)✅ MySQL 5.6+ 支持
存储文件3 个文件:.frm(表结构)、.MYD(数据)、.MYI(索引)1 个文件:.ibd(表空间,包含数据和索引)
MVCC(多版本并发控制)❌ 不支持✅ 支持,适合高并发读操作
缓存机制仅缓存索引,数据依赖 OS 缓存缓存索引和数据(Buffer Pool)

MyISAM逐渐要被淘汰了,但还是有面试题在问两者差别。其实在MySQL5.6开始支持全文索引后,创建的时候基本不考虑MyISAM引擎了。

不过MyISAM的高性能读设计值得了解。仅了解部分和InnoDB设计差异的地方,不一定比InnoDB好。
MyISAM索引与数据完全分离,索引加载到内存的数据更快,数据连续存储扫描更快。
MyISAM 通过 key_buffer_size 配置项缓存索引块,减少磁盘 I/O。InnoDB则是按需加载,LRU淘汰。
不支持事务也就没有更多的锁竞争。
总的来说适合写入后基本不修改的读多写少场景。

MySQL现在默认创建都是InnoDB。

创建表

命名

命名规范

参考这篇"良好的命名规范能减轻工作负担"。创建表也是,需要尽可能精简。
实际生产中,因为表数量特别多,多采取分段式命名,例如:
xx系统_xx模块_xx业务,或者 xx模块_xx实体_xx关系。

另外,MySQL 表名长度限制为 64 个字符(包括字符集编码后的字节数)。

注意事项

还有值得注意的一点,不同操作系统的文件系统对文件名大小写敏感性的处理不同。
Linux通常是大小写敏感的,table1 和 Table1 被视为不同文件。
Windows是大小写不敏感的,table1 和 Table1 被视为相同文件。

MySQL 的 lower_case_table_names 参数定义了表名的大小写处理规则,常用值如下:

  • 0:表名大小写敏感,存储和查询时严格区分大小写。
  • 1:表名存储为小写,查询时大小写不敏感(将表名转换为小写后比较)。
  • 2:表名大小写敏感,但存储时保持原始大小写,查询时大小写不敏感。

Linux/Unix:默认为 0(大小写敏感)。
Windows:默认为 1(表名存储为小写,查询大小写不敏感)。
macOS:默认为 2(大小写敏感存储,查询不敏感,但 macOS 文件系统默认不敏感)。

所以,考虑跨平台影响,推荐设计时全小写表名。

三范式

满足基本三范式:原子性,主键依赖,非传递依赖

  • 第一范式(关系型数据库的基本需求)
    列(属性)的原子性
  • 第二范式
    满足第一范式,表必须有主键,且非主键属性必须完全依赖于主键。
    (非主键列必须直接依赖主键)
  • 第三范式
    满足第二范式,且非主键列不传递依赖主键

理解数据类型

可以看之前的这篇MySQL数据类型。

选择数据类型时需要权衡可维护性、可拓展性、存储效率、性能。遵循的原则优先级为:

  1. 功能正确性:确保数据类型满足业务需求(范围、精度、操作)。
  2. 存储效率:在功能正确的前提下,选择占用空间较小的类型。
  3. 性能优化:考虑查询、排序、索引等性能影响。
  4. 可维护性和扩展性:选择便于维护和未来扩展的类型。
  5. 实现复杂性:尽量降低开发和维护的复杂度。

假设你要设计一个字段存储用户的年龄:

  • 功能正确性:年龄通常是 0-150 之间的整数,TINYINT UNSIGNED(0-255)足够。
  • 存储效率:TINYINT(1 字节)优于 INT(4 字节)。
  • 性能优化:整数类型比字符串类型更快,TINYINT 索引效率高。
  • 可扩展性:TINYINT 足以应对未来需求(150+ 的年龄极少见)。
  • 实现复杂性:TINYINT 直观易用,无需复杂转换。

如果选 VARCHAR(3) 存储年龄,虽然功能上可行,但存储效率低、性能差、维护复杂,完全不可取。

必须字段

  • 有序的主键
    在没有主键时,InnoDB会检查是否存在一个唯一非空列索引并将其作为实际上主键,没有则会生成隐式ROWID,6字节长度。
    定义主键可以确保数据唯一,避免重复或歧义,也避免隐式主键带来的额外管理开销,隐式主键性能也低于显示主键。

通用冗余字段

为了优化查询性能、简化开发、记录元数据或支持未来扩展,设计表时常在表中添加一些并非严格必需的字段。

  • created_at、updated_at
    创建时间created_at与更新时间updated_at,便于审计和排序。
    命名为created_time、updated_time也可以。没这个需求可以不创建,很多时候只创建一个updated_at也能满足需求。

  • status
    支持业务状态管理。

  • is_deleted
    用于实现软删除。

  • created_by、updated_by
    创建人和更新人,适用于多用户系统。

注意,VARCHAR类型可变长度,但在MySQL中,单行最大大小被限制为65535字节,即64KB。

合适的索引

可以看MySQL索引这篇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相机回调函数为静态函数原因

在注册相机SDK的回调函数时&#xff0c;是否需要设置为静态函数取决于具体SDK的设计要求&#xff0c;但通常需要遵循以下原则&#xff1a; 1. 必须使用静态函数的情况 当相机SDK是C语言接口或要求普通函数指针时&#xff0c;回调必须声明为静态成员函数或全局函数&#xff1a;…

《Vue Router实战教程》4.路由的匹配语法

欢迎观看《Vue Router 实战&#xff08;第4版&#xff09;》视频课程 路由的匹配语法 大多数应用都会使用 /about 这样的静态路由和 /users/:userId 这样的动态路由&#xff0c;就像我们刚才在动态路由匹配中看到的那样&#xff0c;但是 Vue Router 可以提供更多的方式&#…

Debezium报错处理系列之第128篇:增量快照报错java.lang.OutOfMemoryError: Java heap space

Debezium报错处理系列之第128篇:增量快照报错java.lang.OutOfMemoryError: Java heap space 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技…

通过MCP+数据库实现AI检索和分析

通过 MCP&#xff08;Multi-Agent Collaboration Platform&#xff0c;多智能体协作平台&#xff09; 数据库&#xff0c;实现一个AI检索和分析系统。 一、系统目标 实现通过 AI 多智能体对结构化&#xff08;数据库&#xff09;和非结构化&#xff08;文档、文本&#xff09…

【教学类-102-08】剪纸图案全套代码08——Python点状虚线优化版本02(有空隙)+制作1图2图6图24图

背景需求 代码实现了点状虚线的全套流程,但是图片中主体图案和虚线与左右两边粘连。 【教学类-102-07】剪纸图案全套代码07——Python点状虚线优化版本01(无空隙)+制作1图2图6图24图-CSDN博客文章浏览阅读665次,点赞11次,收藏11次。【教学类-102-07】剪纸图案全套代码07…

循环神经网络 - 长短期记忆网络

在之前的博文中&#xff0c;我们介绍了循环神经网络的长程依赖问题及改进方案&#xff0c;可以参考&#xff1a;循环神经网络 - 长程依赖问题及改进方案-CSDN博客 但是改进方案只是可以缓解梯度消失&#xff0c;并不能彻底解决梯度爆炸问题和记忆容量(Memory Capacity)问题。 …

LLM应用开发(七)--记忆

1.LangChain记忆模块 底层原理&#xff1a;在最新一次问题时&#xff0c;带上前面的人机对话历史内容 1.1.具体方式 缓冲记忆 缓冲窗口记忆&#xff08;限定存储会话信息次数&#xff09; 令牌缓冲记忆 摘要总结记忆 摘要缓冲混合记忆 向量存储库记忆

Unity VideoPlayer 播放无声音

增加一个videoPlayer下挂&#xff0c;audiorSource脚本 this.videoPlayer.EnableAudioTrack(0, true); this.videoPlayer.audioOutputMode VideoAudioOutputMode.AudioSource; this.videoPlayer.SetTargetAudioSource(0, this.videoPlayer.GetComponent<AudioSource>()…

AGI|AutoGen入门食用手册,搭建你的智能体流水线

目录 1. AutoGen简介 主要特点 2.快速安装 3. 相关概念 Agent Roles and Conversations 4.多代理对话 4.1 Agents 例子: 两个对话代理 4.2 支持多样化的对话模式 1. AutoGen简介 AutoGen 是一个开源编程框架&#xff0c;用于构建AI代理并促进多个代理之间的合作以解…

基于ImGui+FFmpeg实现播放器

基于ImGuiFFmpeg实现播放器 演示&#xff1a; ImGui播放器 继续研究FFmpeg&#xff0c;之前做了一个SDL的播放器&#xff0c;发现SDL的可视化UI界面的功能稍微差了点&#xff0c;所以今天我们换了一个新的工具&#xff0c;也就是ImGui。 ImGui官方文档&#xff1a;https://g…

ES6变量声明:let、var、const全面解析

一、引言 ECMAScript 6&#xff08;简称 ES6&#xff09;的发布为 JavaScript 带来了许多革命性的变化&#xff0c;其中变量声明方式的更新尤为重要。let、var和const成为开发者日常编码中频繁使用的关键字。 本文将深入解析这三种声明方式的核心特性、区别及最佳实践&#xff…

Java基础 - 反射(2)

文章目录 示例5. 通过反射获得类的private、 protected、 默认访问修饰符的属性值。6. 通过反射获得类的private方法。7. 通过反射实现一个工具BeanUtils&#xff0c; 可以将一个对象属性相同的值赋值给另一个对象 接上篇&#xff1a; 示例 5. 通过反射获得类的private、 pro…

FCOS目标检测

一、模型框架 FCOS采用的网络架构和RetinaNet一样&#xff0c;都是采用FPN架构&#xff0c;如图2所示&#xff0c;每个特征图后是检测器&#xff0c;检测器包含3个分支&#xff1a;classification&#xff0c;regression和center-ness。 对于特征图Fi∈RHWC&#xff0c;其相对…

Java基础 - 泛型(常见用法)

文章目录 泛型类泛型方法泛型类派生子类示例 1&#xff1a;子类固定父类泛型类型&#xff08;StringBox 继承自 Box<String>&#xff09;示例 2&#xff1a;子类保留父类泛型类型&#xff08;AdvancedBox<T> 继承自 Box<T>)示例 3&#xff1a;添加子类自己的…

YOLO学习笔记 | YOLOv8环境搭建全流程指南(2025.4)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== YOLOv8环境搭建 一、环境准备与工具配置1. Conda虚拟环境搭建2. CUDA与…

【 Beautiful Soup (bs4) 详解】

引言 Beautiful Soup 是 Python 最流行的 HTML/XML 解析库&#xff0c;能够从复杂的网页文档中高效提取数据。以下是其核心知识点及示例代码。 一、库简介 1. 核心模块 BeautifulSoup&#xff1a;主类&#xff0c;用于构建文档树结构Tag&#xff1a;表示 HTML/XML 标签的对象…

傅利叶发布首款开源人形机器人N1:开发者可实现完整复刻

2025年4月11日&#xff0c;上海——通用机器人公司傅利叶正式发布首款开源人形机器人 Fourier N1&#xff0c;并同步开放涵盖物料清单、设计图纸、装配指南、基础操作软件在内的完整本体资源包。作为傅利叶 “Nexus 开源生态矩阵” 的首个落地项目&#xff08;“N1” 即 “Nexu…

视觉目标检测大模型GAIA

中国科学院自动化研究所智能感知与计算研究中心携手华为等领军企业&#xff0c;共同推出面向产业应用的视觉目标检测全流程解决方案——GAIA智能检测平台。该研究成果已获CVPR 2021会议收录&#xff08;论文链接&#xff1a; 论文地址&#xff1a;https://arxiv.org/pdf/2106.…

前端时间同步利器:React + useEffect 实现高性能动态时钟

前言 在你奋笔疾敲代码的瞬间&#xff0c;是不是突然一低头&#xff0c;发现时间像偷偷跑路的变量&#xff0c;一眨眼就从上午飘到下午&#xff1f;饭没吃、会没开、工位也快被前端猫霸占了。仿佛你写的不是代码&#xff0c;而是“时间穿梭机”。别慌&#xff0c;咱们今天就来…

前端动画性能优化

前端动画性能优化全攻略&#xff1a;告别卡顿与高CPU占用 一、动画性能问题现状分析 1.1 性能问题现象 动画帧率低于60FPS时出现明显卡顿滚动/缩放操作时响应延迟CPU占用率长期超过70%移动端设备发热严重 1.2 核心问题根源 浏览器渲染流程中的性能瓶颈主要出现在&#xff1…