MySQL Schema與數據類型的優化

来源:http://www.cnblogs.com/shsxt/archive/2017/11/22/7880502.html
-Advertisement-
Play Games

選擇優化的數據類型: 1、 更小的通常更好: 一般情況下,應該儘量使用可以正確存儲數據的最小數據類型。更小的數據類型通常更快,因為他們占用更少的磁碟,記憶體和cpu緩存,並且處理時需要的cpu周期也更少。 2、 簡單就好 簡單的數據類型操作通常需要更少的cpu周期。例如,整型比字元操作代價更低,因為字 ...


選擇優化的數據類型:

1、 更小的通常更好:

一般情況下,應該儘量使用可以正確存儲數據的最小數據類型。更小的數據類型通常更快,因為他們占用更少的磁碟,記憶體和cpu緩存,並且處理時需要的cpu周期也更少。

2、 簡單就好

簡單的數據類型操作通常需要更少的cpu周期。例如,整型比字元操作代價更低,因為字元集和校對規則(排序規則)使字元比較比整型更加複雜。註:應使用mysql內建的類型存儲時間和日期,而不是字元串。

3、 儘量避免null

如果查詢中包含可為null的列,對Mysql來說更難優化,因為可為null的列使得索引、索引統計和值都比較複雜。可為null的列會使用更多的存儲空間,在mysql中也需要特別處理。當可為null的列被索引時,每個索引記錄需要一個額外的位元組。

通常把可為null的列改為not null帶來的性能提升比較小。在調優時,沒有必要首先在現有的schema中查找並修改掉這個情況,除非確定這會導致問題。但是如果列上建索引,就應儘量避免設計成可為null的列。

整數類型:

整數類型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分別使用8,16,24,32,64位存儲空間。他們可以存儲的值的範圍從-2的(n-1)次方到2的(n-1)次方-1,其中n是存儲空間的位數。

整數類型有可選的UNSIGNED屬性,表示不允許負值,這大致可以是正數的上限提高一倍。例如TINYINT UNSIGNED可以存儲的範圍是0~255,而TINYINT的存儲範圍是-128~127。

實數類型:

實數是帶有小數部分的數字。然後,他們不僅僅為了存儲小數部分;也可以使用DECIMAL存儲比BITINT還大的整數。MYSQL既支持精確類型,也支持不精確類型。

DECIMAL類型用於存儲精確的小數,因為double類型和float類型在進行計算時,會因為精度損失導致一些數據的偏差。但是DECIMAL數據類型cpu不支持對其直接計算,cpu直接支持原生浮點計算,所以浮點運算明顯更快。

因為需要額外的空間和計算開銷,所以應該儘量只在對小數進行精確計算時才使用DECIMAL-例如存儲財務數據。但是在數據量比較大的時候,可以考慮使用BITINT代替DECIMAL,將需要存儲的貨幣單位根據小數的位數乘以相應的倍數即可。

字元串類型(varchar和char)

  • Varchar:

Varchar類型用於存儲可變長字元串,是最常見的字元串類型。他比定長類型更節省空間,因為它僅使用必要的空間(例如,越短的字元串使用越少的空間)。所以,varchar節省了存儲空間,對性能也有幫助。但是,由於行是邊長的,在update是可能使行變得比原來更長,這就導致需要做額外的操作。如果一個行占用的空間增長,並且頁內沒有更多的空間存儲。MyISAM會將行拆成不同的片段存儲,InnoDB則需要分裂頁來使行可以放進頁內。

註:InnoDB更加靈活,它可以把過長的varchar存儲為BLOB。

  • Char類型:

Char類型適合存儲很短的字元串,或者所有值都接近同一個長度。例如,char類型非常適合存儲密碼的md5值,因為他是定長的值。還有用戶的身份證號以及手機號碼。對於經常變更的數據,char也比vachar更好,因為定長的char類型不容易產生碎片。對於非常短的列,char也比varchar在存儲空間上更有效率。例如用char(1)存儲Y和N的值,如果採用單位元組字元集只需要一個位元組,但是varchar(1)卻需要兩個位元組,因為還有一個記錄長度的額外位元組。

Varchar(5)和varchar(200)存儲‘hello’時空間開銷是一樣的,但是Varchar(5)會有很大的優勢,因為更長的列會消耗更多的記憶體,因為Mysql通常會分配固定帶下的記憶體塊來保存內部值。尤其是使用記憶體臨時表進行排序和操作時會特別糟糕。在利用磁碟臨時表進行排序時也同樣糟糕。

時間類型

DateTime和TimeStamp

  • DateTime

這個類型能保存大範圍的值,從1001年到9999年,精度為秒。它把日期和時間封裝到格式為YYYYMMDDHHMMSS的整數里,與時區無關。使用8個位元組的存儲空間。

  • TimeStamp:

存儲1970年1月1日午夜以來的描述,他和Unix時間戳相同。TimeStamp只使用4個位元組的存儲空間,因此它的範圍比DateTime小的多;只能表示從1970年到2038年。

TimeStamp顯示的值也依賴於時區。Mysql伺服器,操作系統,以及客戶端連接都有時區設置。

TimeStamp也有DATETIME沒有的特殊屬性。預設情況下,如果插入時沒有指定第一個TimeStamp列的值,Mysql會設置這個列的值為當前時間。在插入一行記錄時,Mysql預設也會更新第一個TimeStamp列的插入和更新操作。最後,TimeStamp列預設為not null,這也和其他的數據類型不一樣。
更多MySQL資料庫相關技術請看上海尚學堂《MySQL雲資料庫服務的架構探索

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

-Advertisement-
Play Games
更多相關文章
  • 時過境遷,今天在網上搜了下 “iOS 記憶體泄露檢測”,各種討論技術文章,有點頭大。我忍不住看了下自己當時的代碼,突然感覺自己的思路好特別,好有創意。我真的就是在“創建”時把數據記錄到一個字典里,在“釋放”時,從字典里移出對象;所謂的檢測,其實就是列印那個字典,仍然在字典中的很有可能就是泄露嘍。 當... ...
  • NSMutableArray * dataArray =[responseDictionary valueForKeyPath:@"data.list_dic.list"]; NSMutableArray * dataArray =responseDictionary[@"data"][@"list ...
  • 一、項目配置 1、根目錄下的build.gradle 中添加 如下: 如下: 2、app目錄下的build.gradle 中添加 依賴: 3、創建自己的Application 清單文件配置: 二、使用 1、創建一個資料庫類 2、創建一個表類 3、增刪改查 查詢: 測試: 結果: 註意:如果一個表中的 ...
  • 類似於三元運算符 1) IF(where,result1,result2) = where?result1:result2 例如 SELECT IF(1=1,1,2) => 1 2) IFNULL(result1,result2) = result1 is not null?result1:resu ...
  • mysql中英文或數組的排序時,不用關註資料庫、表、欄位的編碼格式,直接使用 order by colName (asc|desc) 就可以完成 但是如果欄位中含有中文字元,並且是以中文字元開頭或是中文字元會影響到字元排序,就需要根據欄位資料庫中對應欄位的編碼格式選擇合適的排序方式了, 編碼格式為 ...
  • 一.簡介 本文將介紹如何使用mysql-mmm搭建資料庫的高可用架構. 二.環境 伺服器 主機名 Ip Severed Mysql版本 系統 Master1 master1 192.168.4.10 10 5.6.15 Centos6.9 Master2 master2 192.168.4.11 1 ...
  • 世紀佳緣網面試題 1.統計每個分類(type)有多少人: 2.統計五個人的總分(score)是多少: 3.按照分數(score)選出前三名,倒序排列: 4.插入數據:小明(name),4(type),30(score); 5.更新50分一下(不含50分)的分數(score)為60; 6.刪除分數(s ...
  • 首先執行 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 然後執行insert語句而無需使用to_date函數 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...