《高性能MySQL》筆記——MySQL建表數據類型的選擇

来源:https://www.cnblogs.com/woods1815/archive/2018/11/07/9926330.html
-Advertisement-
Play Games

前段時間看了《高性能MySQL》中的選擇優化的數據類型,這裡主要是做一下筆記。 首先數據選擇有幾個簡單原則: 更小的通常更好。一般情況下,應該儘量使用可以正確存儲數據的最小數據類型。例如只需要存 0~200,tinyint unsigned 更好。更小的數據類型通常更快,因為它們占用更少的磁碟、記憶體 ...


 

前段時間看了《高性能MySQL》中的選擇優化的數據類型,這裡主要是做一下筆記。

首先數據選擇有幾個簡單原則:

  • 更小的通常更好。一般情況下,應該儘量使用可以正確存儲數據的最小數據類型。例如只需要存 0~200,tinyint unsigned 更好。更小的數據類型通常更快,因為它們占用更少的磁碟、記憶體和 CPU 緩存,並且處理時需要的 CPU 周期也更少。
  • 簡單就好。簡單數據類型的操作通常需要更少的 CPU 周期。例如,整型比字元操作代價更低,因為字元集和校對規則(排序規則)使字元比較 比 整型比較更複雜。這裡有兩個例子:一個是應該使用 MySQL 內建的類型(date, time, datatime)而不是字元串來存儲日期和時間,另一個是應該用無符號整型存儲 IP 地址。
  • 儘量避免NULL。通常情況下最好指定列為 NOT NULL,除非真的需要存儲 NULL 值。如果查詢中包含可為 NULL 的列,對 MySQL 來說更難優化,因為可為 NULL 的列使得索引、索引統計和值比較都更複雜。特別是計劃在列上建索引,就應該儘量避免設計成可為 NULL 的列。

整數類型:(tinyint,smallint,mediumint,int,bigint)

  存儲(位元組) 存儲(位) 有符號範圍 無符號範圍
TINYINT 1 8 -128 ~127 0~255
SMALLINT 2 16 -32768~32767 0~65535
MEDIUMINT 3 24 -8388608~8388607 0~16777215
INT 4 32 -2147483648~2147483647 0~4294967295
BIGINT 8 64 -2^63~2^63-1 0~2^64-1

 

  • 整數類型有可選的 unsigned 屬性,表示不允許負值,這大致可以使正數的上限提高一倍。主鍵自增 id 適合設置為 unsigned 屬性的 int 類型。
  • MySQL 可以為整數類型指定寬度,例如 int(11),對大多數應用這是沒有意義的:它不會限制值的合法範圍,只是規定了 MySQL 的一些交互工具(例如 MySQL 命令行客戶端)用來顯示字元的個數。對於存儲和計算來說,int(1) 和 int(20) 是相同的。

實數類型:(float,double,decimal)

  • float,double 屬於浮點類型(近似值)。decimal 屬於定點類型(精確值)。
  • MySQL 浮點型和定點型可以用類型名稱後加(M,D)來表示,M 表示該值的總共長度,D 表示小數點後面的長度。
  • float 使用 4 個位元組存儲;double 使用使用 8 個位元組存儲;decimal 則是將數字打包保存到一個二進位字元串中(每 4 個位元組存 9 個數字)。例如,decimal(18, 9) 小數點兩邊將各存儲 9 個數字,一共使用 9 個位元組:小數點前的數字用 4 個位元組,小數點後的數字用 4 個位元組,小數點本身占 1 個位元組。
  • 因為需要額外的空間和計算開銷,所以應該儘量只在對小數進行精確計算時才使用 decimal——例如存儲財務數據。但在數據量比較大的時候,可以考慮使用 bigint 代替 decimal ,將需要存儲的貨幣單位根據最小的位數乘以相應的倍數即可。

 

字元串類型:

varchar 和 char 類型

  • varchar 類型用於存儲可變長字元串,是最常見的字元串數據類型。
  • varchar 需要使用 1 或 2 個額外位元組記錄字元串長度:如果列的最大長度小於或等於 255 位元組,則只使用 1 個位元組表示,否則使用 2 個位元組。
  • char 類型是定長的:MySQL 總是根據定義的字元串長度分配足夠的空間。
  • char 存儲會刪除存儲數據的末尾空格;varchar 不會。(準確來說是 MySQL 4.1 以後的版本 varchar 不會刪除存儲數據的末尾空格)

 

blob 和 text 類型

  • blob 和 text 都是為了存儲很大的數據而設計的字元串數據類型,分別採用二進位和字元方式存儲。
  • 與其它類型不同,MySQL 把每個 blob 和 text 值當作一個獨立的對象處理。
  • blob 和 text 家族之間僅有的不同是 blob 類型存儲的是二進位數據,沒有排序規則或字元集,而 text 類型有字元集和排序規則。
  • memory 引擎不支持 blob 和 text 類型。

 

枚舉(enum)類型

  • MySQL 在內部會將每個值在列表中的位置保存為整數,並且在表的 .frm 文件中保存 “數字-字元串” 映射關係的 “查找表”。
  • 如果使用數字作為枚舉常量,這種雙重性很容易導致混亂,例如 enum('1', '2', '3') 。建議儘量避免這麼做。
  • 枚舉欄位是按照內部存儲的整數而不是定義的字元串進行排序的。

日期和時間類型:

  • MySQL 能存儲的最小時間粒度為秒。
  • datetime 保存範圍從 1001 年到 9999 年,精度為秒。與時區無關。使用 8 位元組的存儲空間。
  • timestamp 類型保存了從 1970 年 1 月 1 日 午夜(格林尼治標準時間)以來的秒數,它和 unix 時間戳相同。使用 4 位元組的存儲空間,範圍從 1970 年到 2038 年。與時區有關。
  • MySQL 4.1 以及更新的版本按照 datetime 的方式格式化 timestamp 的值,這僅僅是顯示格式上的區別,timestamp 的存儲格式在各個版本都是一樣的。
  • 除了特殊行為之外,通常也應該儘量使用 timestamp ,因為它比 datetime 空間效率更高。有時候人們會將 unix 時間戳存儲為整數值,但這不會帶來任何收益。用整數保存時間戳的格式通常不方便處理,所以我們不推薦這麼做。(對於這點很多公司項目中是用整數存儲,我也查了資料,使用整數的理由一般是日期比較,計算時整數更好處理)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼要有防火牆 原來的TCP/IP協議只用於一個相對封閉的環境,之後出現遠程訪問登錄等多種形式訪問資源,為了更安全的提供網路服務,所以要使用防火牆 防火牆作用 設置一個路由器防火牆,除了認證的主機,將標誌位為SYN=1,ACK=0的互聯網包丟棄,認證主機也允許對web伺服器TCP的80埠和郵件的 ...
  • less 工具也是對文件或其它輸出進行分頁顯示的工具,應該說是linux正統查看文件內容的工具,功能極其強大。less 的用法比起 more 更加的有彈性。在 more 的時候,我們並沒有辦法向前面翻, 只能往後面看,但若使用了 less 時,就可以使用 [pageup] [pagedown] 等按 ...
  • 1.在root許可權下,useradd只是創建了一個用戶名,如(useradd+用戶名),它並沒有在/home目錄下創建同名文件夾,也沒有創建密碼,因此利用這個用戶登錄系統,是登錄不了的,為了避免這樣的情況出現,可以用(useradd m +用戶名)的方式創建,它會在/home目錄下創建同名文件夾,然 ...
  • 引用鏈接: https://blog.csdn.net/linuxheik/article/details/77853119 https://www.cnblogs.com/doscho/p/6221867.html ...
  • 一、持久化統計信息的意義: 統計信息用於指導mysql生成執行計劃,執行計劃的準確與否直接影響到SQL的執行效率;如果mysql一重啟 之前的統計信息就沒有了,那麼當SQL語句來臨時,那麼mysql就要收集統計信息然後再生成SQL語句的執行 計劃。如果能在關閉mysql的時候就把統計信息保存起來,那 ...
  • 一 需求描述 我們知道數據是公司的重要資產,業務的系統化、信息化就是數字化。數據高效的存儲與查詢是系統完善和優化的方向,而資料庫的穩定性、可靠性是實現的基礎。高可用和RPO(RecoveryPointObjective,複原點目標,指能容忍的最大數據丟失量)是衡量一個資料庫優劣的重要指標。作為一個D ...
  • redis持久化 1.redis持久化介紹 我們知道redis性能之所以強悍,是因為redis在運行時將數據都存放在了訪問效率遠高於硬碟的記憶體之中。可是這帶來了新的問題:在redis或者外部系統重啟時,記憶體中的數據將會丟失,由於目前的記憶體介質RAM是易失的,非正常的斷電也會導致數據的丟失。 在一些場 ...
  • @[toc] 方法一:修改配置文件 1. 在my.ini的[mysqld]欄位加入: skip grant tables ; 2. 重啟mysql服務,這時的mysql不需要密碼即可登錄資料庫; 3. 然後進入mysql(在命令行中修改密碼):     mys ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...