[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.pswp.cn/news/900961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900961.shtml
英文地址,請注明出處:http://en.pswp.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…