讀高性能MySQL(第4版)筆記06_優化數據類型(上)

来源:https://www.cnblogs.com/lying7/archive/2023/09/12/17693240.html
-Advertisement-
Play Games

1. 良好的邏輯設計和物理設計是高性能的基石 1.1. 反範式的schema可以加速某些類型的查詢,但同時可能減慢其他類型的查詢 1.2. 添加計數器和彙總表是一個優化查詢的好方法,但它們的維護成本可能很 1.3. 將修改schema作為一個常見事件來規劃 2. 讓事情儘可能小而簡單是一個好主意 2 ...


1. 良好的邏輯設計和物理設計是高性能的基石

1.1. 反範式的schema可以加速某些類型的查詢,但同時可能減慢其他類型的查詢

1.2. 添加計數器和彙總表是一個優化查詢的好方法,但它們的維護成本可能很

1.3. 將修改schema作為一個常見事件來規劃

2. 讓事情儘可能小而簡單是一個好主意

2.1. 儘量避免在設計中出現極端情況

2.2. 使用小的、簡單的、適當的數據類型,並避免使用NULL,除非確實是對真實數據進行建模的正確方法

2.3. 嘗試使用相同的數據類型來存儲相似或相關的值,尤其是在聯接條件中使用這些值時

2.4. 註意可變長度字元串,它可能會導致臨時表和排序的全長記憶體分配不樂觀

2.5. 如果可能的話,嘗試使用整數作為標識符

2.6. 小心使用ENUM和SET類型

2.7. 避免使用BIT類型

3. 選擇正確的數據類型對於獲得高性能至關重要

3.1. 更小的通常更好

3.1.1. 儘量使用能夠正確存儲和表示數據的最小數據類型

3.1.2. 更小的數據類型通常更快,因為它們占用的磁碟、記憶體和CPU緩存的空間更少,並且處理時需要的CPU周期也更少

3.1.3. 在schema中的多個地方增加數據類型範圍是一個痛苦且耗時的操作

3.1.4. 如果無法確定哪個數據類型是最好的,請選擇你認為不會超過的最小數據類型

3.2. 簡單為好

3.2.1. 簡單數據類型的操作通常需要更少的CPU周期

3.2.2. 整型數據比字元型數據的比較操作代價更低

3.2.2.1. 字元集和排序規則(collation)使字元型數據的比較更複雜

3.2.2.2. 應該將日期和時間存儲為MySQL的內置類型而不是字元串類型

3.2.2.3. 應該用整型數據存儲IP地址

3.3. 儘量避免存儲NULL

3.3.1. 最好指定列為NOT NULL,除非明確需要存儲NULL值

3.3.2. 如果查詢中包含可為NULL的列,對MySQL來說更難優化,因為可為NULL的列使得索引、索引統計和值比較都更複雜

3.3.3. 可為NULL的列會使用更多的存儲空間,在MySQL里也需要特殊處理

3.3.4. 可為NULL的列改為NOT NULL帶來的性能提升比較小

4. 整數類型

4.1. 整數(whole number)

4.1.1. TINYINT、SMALLINT、MEDIUMINT、INT或BIGINT

4.1.1.1. 使用8、16、24、32和64位存儲空間

4.1.2. 整數類型有可選的UNSIGNED屬性,表示不允許負值,這大致可以使正數的上限提高一倍

4.1.3. 有符號和無符號類型使用相同的存儲空間,並具有相同的性能,因此可以根據數據實際範圍選擇合適的類型

4.1.4. 整數計算通常使用64位的BIGINT整數

4.1.5. 對於存儲和計算來說,INT(1)和INT(20)是相同的

4.1.6. 一些大容量的場景,可以考慮使用BIGINT代替DECIMAL,將需要存儲的貨幣單位根據小數的位數乘以相應的倍數即可

4.1.7. 存儲財務數據並精確到萬分之一分,則可以把所有金額乘以一百萬,然後將結果存儲在BIGINT里

4.1.8. 同時避免浮點存儲計算不精確和DECIMAL精確計算代價高的問題

4.2. 實數(real number,帶有小數部分的數字)

4.2.1. 不僅適用於帶小數的數字,也可以使用DECIMAL存儲比BIGINT還大的整數

4.2.2. 浮點類型通常比DECIMAL使用更少的空間來存儲相同範圍的值

4.2.3. FLOAT列使用4位元組的存儲空間

4.2.4. DOUBLE占用8位元組,比FLOAT具有更高的精度和更大的值範圍

4.2.5. 應該儘量只在對小數進行精確計算時才使用DECIMAL

5. 字元串類型

5.1. 字元串長度定義的不是位元組數,是字元數

5.2. VARCHAR

5.2.1. 用於存儲可變長度的字元串,是最常見的字元串數據類型

5.2.2. 它比固定長度的類型更節省空間,因為它僅使用必要的空間

5.2.3. 更少的空間用於存儲更短的值

5.2.4. 需要額外使用1或2位元組記錄字元串的長度

5.2.4.1. VARCHAR(1000)的列則需要1002個位元組,因為需要2位元組存儲長度信息

5.2.5. 節省了存儲空間,所以對性能也有幫助

5.2.5.1. 由於行是可變長度的,在更新時可能會增長,這會導致額外的工作

5.2.6. 推薦使用場景

5.2.6.1. 字元串列的最大長度遠大於平均長度

5.2.6.2. 列的更新很少,所以碎片不是問題

5.2.6.3. 使用了像UTF-8這樣複雜的字元集,每個字元都使用不同的位元組數進行存儲

5.3. CHAR

5.3.1. 總是為定義的字元串長度分配足夠的空間

5.3.2. 當存儲CHAR值時,MySQL刪除所有尾隨空格

5.3.3. 如果需要進行比較,值會用空格填充

5.3.4. 推薦使用場景

5.3.4.1. 存儲非常短的字元串

5.3.4.1.1. 對於非常短的列,CHAR也比VARCHAR更高效
5.3.4.1.2. 設計為只保存Y和N的值的CHAR(1)在單位元組字元集中只使用1位元組,但VARCHAR(1)需要2位元組,因為還有一個記錄長度的額外位元組

5.3.4.2. 所有值的長度都幾乎相同的情況

5.3.5. 對於經常修改的數據,CHAR也比VARCHAR更好,因為固定長度的行不容易出現碎片

5.4. 二進位字元串與常規字元串非常相似,但它們存儲的是位元組而不是字元

5.5. 填充也不同:MySQL填充BINANRY用的是\0(零位元組)而不是空格,並且在檢索時不會去除填充值

5.6. 位元組比較的優勢

5.6.1. 大小寫不敏感

5.6.2. 二進位比較比字元比較簡單得多,因此速度更快

5.7. BLOB和TEXT類型

5.7.1. 存儲很大的數據而設計的字元串數據類型,分別採用二進位和字元方式存儲

5.7.2. 字元類型

5.7.2.1. TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT和LONGTEXT

5.7.2.2. TEXT是SMALLTEXT的同義詞。

5.7.2.3. 有字元集和排序規則

5.7.3. 二進位類型

5.7.3.1. TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB

5.7.3.2. BLOB是SMALLBLOB的同義詞

5.7.3.3. 二進位數據,沒有排序規則或字元集

5.7.3.4. 如果需要在檢索後保持值不變,請小心使用BINARY類型,MySQL會使用\0將其填充到需要的長度

5.7.4. 當BLOB和TEXT值太大時,InnoDB會使用獨立的“外部”存儲區域,此時每個值在行內需要1~4位元組的存儲空間,然後在外部存儲區域需要足夠的空間來存儲實際的值

5.7.5. 只對這些列的最前max_sort_length位元組而不是整個字元串做排序

5.7.6. 不能將BLOB和TEXT數據類型的完整字元串放入索引,也不能使用索引進行排序


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

-Advertisement-
Play Games
更多相關文章
  • 本文全面探討了Go語言中的各類運算操作符,從基礎的數學和位運算到邏輯和特殊運算符。文章旨在深入解析每一種運算操作符的工作原理、應用場景和註意事項,以幫助開發者編寫更高效、健壯和可讀的Go代碼。 簡介 Go語言,作為一種現代的編程語言,不僅因為其簡單易讀的語法而受到歡迎,還因為它的性能和高度併發能力在 ...
  • 本文主要介紹 RocketMQ 管理工具(mqadmin)的使用,文中所使用到的軟體版本:RocketMQ 5.1.3、CentOS 7.9.2009。 1、mqadmin 說明 A、執行命令方法:./mqadmin {command} {args}B、幾乎所有命令都需要配置 -n 表示 NameS ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 本篇概覽 本篇概覽 這是道高頻面試題,值得一看 首先,這道題的難度是中等 來看題目描述: 給你一個整數 n ,返回 和為 n 的完全平方數的最少數量 。 ...
  • 文件與文件流的區別(自己的話): 在軟體開發過程中,我們常常把文件的“讀寫操作”,與“創造、移動、複製、刪除操作”區分開來。其中,文件的“讀寫操作”是由System.IO命名空間下fileStream類控制的。而文件的“創造、移動、複製、刪除操作”是由file類控制的。 當然了,還有很多和這兩個類功 ...
  • 哈嘍大家好,我是鹹魚 不知道小伙伴們有沒有遇到過下麵的情況: 使用終端(XShell、secureCRT 或 MobaXterm 等)登錄 Linux 伺服器之後如果有一段時間沒有進行交互,SSH 會話就會斷開 如果正在執行一些非後臺命令,SSH 會話斷開就可能會使得這些命令可能會被中斷,導致任務無 ...
  • 我的系統是CentOS 7.6,按流程走完後可以實現系統內所有用戶都預設使用zsh且插件配置共用省去重覆編寫配置或軟連接的煩惱 1 安裝git yum -y install git 2 安裝zsh yum -y install zsh 3 更改root的預設shell #查看當前可用shell列表 ...
  • 本文探討了Linux操作系統中的通用塊層和存儲系統I/O軟體分層的優化策略。通用塊層作為文件系統和磁碟驅動之間的介面,通過排隊和調度I/O請求,提高磁碟的讀寫效率和可靠性。存儲系統的I/O軟體分層包括文件系統層、通用塊層和設備層,它們相互協作,實現對存儲系統的高效管理和操作。本文旨在深入瞭解通用塊層... ...
  • 前言 比較Hygon7280、Intel、AMD、鯤鵬920、飛騰2500的性能情況 CPU型號 Hygon 7280 AMD 7H12 AMD 7T83 Intel 8163 鯤鵬920 飛騰2500 倚天710 物理核數 32 32 64 24 48 64 128core 超線程 2 2 2 2 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...