当前位置: 首页 > article >正文

[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索引这篇。

相关文章:

[MySQL]数据库与表创建

欢迎来到啾啾的博客&#x1f431;。 这是一个致力于构建完善 Java 程序员知识体系的博客&#x1f4da;。 它记录学习点滴&#xff0c;分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。 本篇简单记录…...

5分钟读懂ArgoCD:在Kubernetes中实现持续部署

Kubernetes中的Argo CD介绍 Argo CD是用于Kubernetes的声明式GitOps持续交付工具。它遵循GitOps模式&#xff0c;以Git仓库作为定义所需应用程序状态的唯一真实来源&#xff0c;能在指定的目标环境中自动部署应用程序&#xff0c;并持续监控应用程序的运行状态&#xff0c;确保…...

cs224w课程学习笔记-第10课

cs224w课程学习笔记-第10课 异构图 前言一、异构图1、异构图定义2、异构图与同构图 二、异构图下的GNN1、GCN扩展至RGCN1.1 RGCN原理1.2 异构图的任务预测特点1.3 异构图任务预测基础案例 2、完整的异构图GCN三、异构图下的Transformer 前言 异构图的定义是节点内部存在类型不…...

OpenCV 图形API(26)图像滤波-----方框滤波函数boxFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用方框滤波器模糊图像。 该函数使用以下内核来平滑图像&#xff1a; K α [ 1 1 … 1 1 1 … 1 ⋮ ⋮ ⋱ ⋮ 1 1 … 1 ] K \alpha \begin{b…...

安卓手机怎样开启双WiFi加速

1. 小米/Redmi手机 路径&#xff1a; 设置 → WLAN → 高级设置 → 双WLAN加速 操作&#xff1a; 开启功能后&#xff0c;可同时连接一个2.4GHz WiFi和一个5GHz WiFi&#xff08;或两个不同路由器&#xff09;。 可选择“智能选择”或手动指定辅助网络。 2. 华为/荣耀手机…...

大模型上下文协议MCP详解(2)—核心功能

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 标准化上下文交互技术 1.1 实时数据接入能力 MCP(Model Context Protocol)通过标准化的接口,为 AI 模型提供了强大的实时数据接入能力,使其能够快速获取和处理来自不同数据源的实时信息。…...

剑指Offer(数据结构与算法面试题精讲)C++版——day8

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day8 题目一&#xff1a;链表中环的入口节点题目二&#xff1a;两个链表的第1个重合节点题目三&#xff1a;反转链表附录&#xff1a;源码gitee仓库 题目一&#xff1a;链表中环的入口节点 这道题的有如下三个…...

【Qt】QxOrm:下载、安装、使用

1、下载源码 github地址:https://github.com/QxOrm/QxOrm 稳定版本下载:https://github.com/QxOrm/QxOrm/releases/tag/1.5.0 2、编译源码 QxOrm支持cmake编译(CMakeLists.txt)、Qt pro工程编译(QxOrm.pro) 以 QxOrm.pro 为例,编译生成的库,没有在 build-QxOrm-1.5…...

CISCO组建RIP V2路由网络

1.实验准备&#xff1a; 2.具体配置&#xff1a; 2.1根据分配好的IP地址配置静态IP&#xff1a; 2.1.1PC配置&#xff1a; PC0&#xff1a; PC1&#xff1a; PC2&#xff1a; 2.1.2路由器配置&#xff1a; R0&#xff1a; Router>en Router#conf t Enter configuration…...

【数学建模】(智能优化算法)鲸鱼优化算法(Whale Optimization Algorithm)详解与应用

鲸鱼优化算法(Whale Optimization Algorithm)详解与应用 文章目录 鲸鱼优化算法(Whale Optimization Algorithm)详解与应用1. 引言2. 算法原理2.1 生物学基础2.2 数学模型[^3]1. 包围猎物阶段2. 气泡网攻击&#xff08;螺旋更新&#xff09;3. 随机搜索猎物&#xff08;全局探索…...

【深度洞察】解码饮料行业破局点:场景革命

当东鹏特饮以 “大瓶装 防尘盖” 精准解决货车司机的场景化需求&#xff0c;当农夫山泉通过 “冷藏版东方树叶” 打开年轻白领的早餐场景 —— 这些现象级案例背后&#xff0c;是饮料行业底层逻辑的深刻变革&#xff1a;真正的市场增量&#xff0c;藏在对消费场景的极致拆解中…...

工业科学级天文相机:跨界融合的高精密成像解决方案

随着国内科技的快速发展&#xff0c;工业相机领域正悄然兴起一场"天文级"的技术革命。这类兼具工业设备可靠性与天文观测精度的特殊相机&#xff0c;正在半导体制造、天文观测、空间探测等领域开辟新的应用疆域。其核心技术突破不仅体现在传感器性能的提升&#xff0…...

回文日期2

#include <bits/stdc.h> using namespace std; bool huiwen(int date) {int tempdate;int r0;while(temp>0){rr*10temp%10;temp/10;}return dater; }int main() {// 请在此输入您的代码int n,m;cin>>n>>m;int tempfn/100,tempem/100;int yearfn/10000,mon…...

Ubuntu搭建Pytorch环境

Ubuntu搭建Pytorch环境 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Ubuntu搭建Pytorch环境前言一、Anaconda二、Cuda1.安装流程2、环境变量&#…...

图书管理系统(Python)

运行结果&#xff1a; 源代码&#xff1a; # 定义一个图书类 class Book: def __init__(self, title, author, isbn): self.title title self.author author self.isbn isbn def show_info(self): print(f"{self.title},{self.author},{self.isbn}") # 图书列表…...

大模型本地部署系列(3) Ollama部署QwQ[阿里云通义千问]

大家好&#xff0c;我是AI研究者&#xff0c; 今天教大家部署 一个阿里云通义千问大模型。 QwQ大模型简介 QwQ是由阿里云通义千问&#xff08;Qwen&#xff09;团队推出的开源推理大模型&#xff0c;专注于提升AI在数学、编程和复杂逻辑推理方面的能力。其核心特点包括&#x…...

操作系统 4.1-I/O与显示器

外设工作起来 操作系统让外设工作的基本原理和过程&#xff0c;具体来说&#xff0c;它概括了以下几个关键步骤&#xff1a; 发出指令&#xff1a;操作系统通过向控制器中的寄存器发送指令来启动外设的工作。这些指令通常是通过I/O指令&#xff08;如out指令&#xff09;来实现…...

前端-Vue3

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…...

Facebook账号类型一览

对于跨境出海从业者来说&#xff0c;Facebook是必不可少的内容营销和广告投放平台。针对Facebook的营销策略和发挥空间都很丰富&#xff0c;因此了解Facebook账号的类型、特点、适用场景和相关工具还是很有用的。 一、账号类型及特点 1.小黑号 无主页、无好友、无历史操作&am…...

Kotlin 通用请求接口设计:灵活处理多样化参数

在 Kotlin 中设计一个通用的 ControlParams 类来处理不同的控制参数&#xff0c;有几种常见的方法&#xff1a;方案1&#xff1a;使用密封类&#xff08;Sealed Class&#xff09; sealed class ControlParamsdata class LightControlParams(val brightness: Int,val color: S…...

Java学习手册:Java基本语法与数据类型

Java语言以其简洁明了的语法和强大的数据类型系统而闻名。掌握Java的基本语法和数据类型是成为一名合格Java开发者的第一步。本文将深入探讨Java的基本语法结构和数据类型&#xff0c;帮助读者打下坚实的基础。 Java的基本语法 Java语言的语法设计简洁而强大&#xff0c;强调…...

通过扣子平台将数据写入飞书多维表格

目录 1.1 创建飞书开放平台应用 1.2 创建飞书多维表格 1.3 创建扣子平台插件 1.1 创建飞书开放平台应用 1.1.1 打开地址&#xff1a;飞书开放平台&#xff0c;点击创建应用 注&#xff1a;商店应用需要申请ISV资质&#xff0c;填写企业主体信息&#xff0c;个人的话&#x…...

C++-Mongoose(2)-https-server-openssl

OpenSSL生成HTTPS自签名证书 - 简书 1.Openssl windowsubuntu下载http://www.openssl.vip/download1.VS2019编译OpenSSL 2.VS2019编译第一个OpenSSL项目 1.ubuntu编译OpenSSL 3.0 2.编写第一个OpenSSL 1.windows下编译OpenSSL 安装vs2019 perl nasm安装activePerl…...

【GDB】调试程序的基本命令和用法(Qt程序为例)

1. 引言 GDB&#xff08;GNU Debugger&#xff09;是一个强大的命令行调试工具&#xff0c;它可以帮助开发者在程序运行时查找和修复错误。当调试Qt程序时&#xff0c;GDB同样适用&#xff0c;并且能够帮助开发者定位诸如数组越界挂死等复杂问题。 2. 基本命令 2.1 启动GDB …...

力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和

前言 中等 、困难 √&#xff0c;越来越有手感了&#xff0c;二叉树done&#xff01; 二叉树展开为链表 我的题解 前序遍历树&#xff0c;当遇到左子树为空时&#xff0c;栈里pop节点&#xff0c;取右子树接到左子树位置&#xff0c;同时断开该右子树与父节点的连接&#x…...

服务器DNS失效

服务器异常 xx.t.RequestException: java.net.UnknownHostException: test.ac.xxxx.cn现象分析 本地测试正常&#xff0c;说明域名本身无问题。服务器 DNS 解析异常&#xff0c;导致 UnknownHostException。**服务器可正常解析 ****baidu.com**&#xff0c;说明网络正常&#…...

用excel做九乘九乘法表

公式&#xff1a; IF($A2>B 1 , 1, 1,A2 & “" & B$1 & “” & $A2B$1,”")...

企业数据安全如何保障?深度解析AIGC系统源码本地化部署

—从数据加密到权限管控&#xff0c;构建企业级AI安全防线 企业AIGC面临的5大数据安全风险 1. 数据出境违规 典型场景&#xff1a; 使用ChatGPT处理客户信息 → 数据经美国服务器中转 → 违反《个人信息保护法》第38条某金融公司因通过Midjourney生成宣传图&#xff0c;导致产…...

《妖风》-来自DeepSeek

《妖风》 周明揉了揉酸胀的眼睛&#xff0c;电脑屏幕上的Excel表格已经模糊成一片绿色的小格子。窗外&#xff0c;三月的阳光懒洋洋地洒进来&#xff0c;带着春天特有的那种让人昏昏欲睡的温暖。办公室里中央空调的嗡嗡声像是一首催眠曲&#xff0c;他的眼皮越来越重。 "…...

鬼泣:蓄力攻击

文章目录 蓄力攻击&#xff1a;有两个动作&#xff0c;蓄力时触发蓄力动作&#xff0c;攻击时触发攻击动作1.蓄力动作2.攻击动作 浮空上挑1.蓄力对齐位置 2.攻击 下劈斩1.蓄力对齐位置 2.攻击 beiwuf debug事件分发器发送&#xff1a;调用发送器即可发送消息接收&#xff1a;绑…...