MySQL 結構的優化方案

主要是指三方面,即表結構、字段結構以及索引結構,這些結構如果不合理,在某些場景下也會影響數據庫的性能,因此優化時也可以從結構層面出發。一般在項目的庫表設計之初就要考慮,當性能瓶頸出現時再調整結構,就為時過晚。

1. 表結構的優化

表結構設計時字段數量一定不要太多,InnoDB引擎基本上都會將數據操作放到內存中完成,一張表的字段數量越多,能載入內存的數據頁會越少,當操作時數據不在內存,又不得不去磁盤中讀取數據,這顯然會很大程度上影響MySQL性能。

表結構的設計,正常情況下應當遵循《數據庫三范式》的原則設計,盡可能的根據業務將表結構拆分的更為精細化,一方面確保內存中緩存的數據更多,更便于維護,而且執行SQL時,效率也會越高。

主鍵選擇要合適,一張表中必須要有主鍵且最好是順序遞增的。一張表如果業務中自帶自增屬性字段,最好選擇這些字段作為主鍵。沒有可以設計一個與業務無關、無意義的數值序列。

對實時性要求不高的數據建立中間表。很多時候為了統計一些數據時,都會基于多表做聯查,以此來確保得到統計所需的數據,對于實時性的要求不高,可以在庫中建立相應的中間表,然后每日定期更新中間表的數據,從而減小聯表查詢的開銷,同時也能進一步提升查詢速度。

根據業務特性為不同的表選擇合適的存儲引擎,主要在InnoDB、MyISAM之間做選擇。經常查詢,很少發生變更的表可以選擇MyISAM引擎。其他表可以使用默認的InnoDB引擎。

2. 字段結構的優化

設計表時選擇合適的數據類型

  • 姓名字段,一般都會限制用戶名長度,不要無腦用varchar,使用char類型更好。
  • 一些顯然不會擁有太多數據的表,主鍵ID的類型可以從int換成tinyint、smallint、mediumit。
  • 日期字段,不要使用字符串類型,更應該選擇datetime、timestamp,一般情況下最好為后者。
  • 一些固定值的字段,如性別、狀態、省份、國籍等字段,可以選擇使用數值型代替字符串,如果必須使用字符串類型,最好使用enum枚舉類型代替varchar類型。

總之保持三個原則

  1. 足夠的使用范圍內選擇最小的數據類型,它們占用更少的磁盤、內存、和CPU緩存,處理速度也會更快
  2. 避免索引字段值為NULL,字段空值過多會影響索引性能
  3. 盡量使用簡單的類型代替復雜的類型,如IP的存儲可以使用int而并非varchar,因為簡單的數據類型,操作時通常需要的CPU資源更少。

3. 索引結構的優化

根據業務創建更合適的索引,主要從4個方面考慮:

  1. 一個表需要建立多個索引,適當根據業務將多個單列索引組合成一個聯合索引,可以節省磁盤空間,能夠充分使用索引覆蓋的方式查詢數據,一定程度上提升數據庫的整體性能。
  2. 值較長的字段盡量建立前綴索引,索引字段值越小,單個B+Tree的節點中能存儲的索引鍵會越多,索引樹會越矮,查詢性能自然越高。
  3. 經常做模糊查詢的字段,可以建立全文索引代替普通索引,基于普通索引做like查詢會導致索引失效,而采用全文索引的方式做模糊查詢效率會更高更快,并且全文索引的功能更為強大。
  4. 索引結構的選擇根據業務進行調整,在某些不做范圍查詢的字段上建立索引時,可以選用hash結構代替B+Tree結構,Hash結構的索引是所有數據結構中最快的,散列度足夠的情況下,復雜度僅為O(1)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40378.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40378.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40378.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python函數語法詳解(與C++對比學習)【未完】

一、Python函數的形式 def function_name (參數, ...) -> return value_type:# 函數體return value# 看具體需求# 如果沒有return語句,函數執行完畢后也會返回結果# 只是結果為None。return None可以簡寫為return 1. Python的返回值 在Python3中,提…

利用Redis bitmap 實現簽到案例

數據庫實現 設計簽到功能對應的數據庫表 CREATE TABLE sign_record (id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵,user_id bigint NOT NULL COMMENT 用戶id,year year NOT NULL COMMENT 簽到年份,month tinyint NOT NULL COMMENT 簽到月份,date date NOT NULL COMMENT 簽…

EI檢索被認為是工程技術領域的權威數據庫

EI檢索被認為是工程技術領域的權威數據庫,能夠被EI檢索收錄的期刊和會議論文通常被認為具有一定的學術質量和影響力。然而,EI檢索與“高水平”不能完全畫等號,以下是一些需要考慮的因素: 1. 收錄標準:雖然EI檢索有嚴格…

在Linux操作系統中關于邏輯卷的案例

1.如何去創建一個邏輯卷 1.1先去創建物理卷 如上圖所示,physical volume 物理卷 被成功創建。 如上圖所示,可以使用pvscan來去查看當前Linux操作系統的物理卷/ 1.2使用創建好的物理卷去創建一個卷組。 如上圖所示,可以使用第一步創建的兩個…

【中項第三版】系統集成項目管理工程師 | 第 9 章 項目管理概論③ | 9.6 - 9.10

前言 第 9 章對應的內容選擇題和案例分析都會進行考查,這一章節理論性較強,學習要以教材為準。本章分值預計在4-5分。 目錄 9.6 項目管理過程組 9.7 項目管理原則 9.8 項目管理知識領域 9.9 價值交付系統 9.10 本章練習 9.6 項目管理過程組 項目…

千萬不能踏入的渠道管理五大誤區!【附策略】

一、引言 在當今激烈的市場競爭環境中,有效的渠道管理是企業獲得競爭優勢的關鍵。然而,在實踐過程中,不少企業因陷入管理誤區而影響了市場拓展和品牌建設。本文旨在揭示渠道管理中常見的五大誤區,并提供避免策略,幫助…

高級Redis之Stream的用法示例

不想自己搭建一個mq怎么辦?Redis的Stream 來幫你,Redis Stream 是 Redis 5.0 引入的一種新的數據結構,用于處理實時的、可持久化的、基于時間序列的數據流。它非常適合處理事件流、日志、消息隊列等場景。下面是一個使用 Redis Stream 的具體…

web基礎與HTTP協議(企業網站架構部署與優化)

補充:http服務首頁文件在/var/www/html下的,一定是index.html命名的文件。才會顯示出來。 如果該路徑下沒有相應的文件,會顯示/usr/share/httpd/noindex下的index.html文件。 如果/usr/share/httpd/noindex沒有index.html文件,會…

BSI 第七屆萬物互聯智慧高峰論壇:主題:擁抱AI時代,標準賦能組織實現可持續發展

BSI 第七屆萬物互聯智慧高峰論壇:主題:擁抱AI時代,標準賦能組織實現可持續發展 主要收到 BSI 溫女士的邀請參加的本次論壇。還是學到的很多 。 在科技日新月異的時代背景下,BSI 第七屆萬物互聯智慧高峰論壇于[時間:6…

Object 類中的公共方法詳解

Object 類中的公共方法詳解 1、clone() 方法2、equals(Object obj) 方法3、hashCode() 方法4、getClass() 方法5、wait() 方法6、notify() 和 notifyAll() 方法 💖The Begin💖點點關注,收藏不迷路💖 在 Java 中,Object…

AI 驅動的數據中心變革與前景

文章主要探討了AI計算時代數據中心的轉型,涉及計算技術的多樣性、規格尺寸和加速器的發展、大型語言模型(LLM)的發展、功耗和冷卻趨勢、基準測試的重要性以及數據中心的發展等方面。為大家提供深入了解AI基礎設施發展的視角。 計算技術的多樣…

Ubuntu(通用)—網絡加固—ufw+防DNS污染+ARP綁定

1. ufw sudo ufw default deny incoming sudo ufw deny in from any to any # sudo ufw allow from any to any port 5353 protocol udp sudo ufw enable # 啟動開機自啟 # sudo ufw reload 更改后的操作2. 防ARP欺騙 華為云教程 arp -d刪除dns記錄arp -a顯示arp表 ipconfi…

PTrade常見問題系列3

量化允許同時運行回測和交易的策略個數配置。 量化允許同時運行回測和交易的策略個數在哪里查看? 在量化服務器/home/fly/config/custom_config_conf文件中,其中運行回測的策略個數由backtest_switch(是否限制普通回測個數)及ba…

Qt 日志輸出的選擇方案有多少

Qt 日志輸出的選擇方案主要包括以下幾種: 使用內置的日志函數: qDebug():用于輸出調試信息。qInfo():用于輸出一般信息。qWarning():用于輸出警告信息。qCritical():用于輸出關鍵錯誤信息,表明…

詳細設計與概要設計區別-慧哥充電樁開源系統

概要設計更側重于系統的整體構架和模塊劃分,而詳細設計則關注具體模塊的實現細節。在軟件開發過程中,這兩個階段雖然緊密相關,但它們各自有著不同的目標和方法。以下是具體分析: 目標 概要設計:概要設計關注系統整體架…

matlab 繪制高等數學中的二維函數示例

matlab 繪制高等數學中的二維函數示例 繪制高等數學中的二維函數示例繪制結果 繪制高等數學中的二維函數示例 clc,clear,close all; % 定義方程 eqn (x, y) (x.^2 y.^2).^3 - y.^4;% 繪制方程曲線和坐標軸 ezplot(eqn, [-2, 2, -2, 2]) hold on % 在同一圖形中保持繪圖% 繪…

S7-1200PLC學習記錄

文章目錄 前言一、S7-12001.數字量輸入模塊2. PNP接法和NPN接法 二、博圖軟件1. 位邏輯運算Part1. 添加新設備(添加PLC)Part2. 添加信號模塊Part3. 添加信號板中模塊Part4. 添加新塊Part5. Main編程文件案例1案例2 -( S )- 和 -( R )-完整操作過程&#…

昇思25天學習打卡營第8天|ResNet50遷移學習

一、遷移學習定義 遷移學習(Transfer Learning):在一個任務上訓練得到的模型包含的知識可以部分或全部地轉移到另一個任務上。允許模型將從一個任務中學到的知識應用到另一個相關的任務中。適用于數據稀缺的情況,可減少對大量標記…

掌握Linux網絡:深入理解TC —— 你的流量控制利器

目錄 簡單概述: qdisc(隊列): 舉例: Bash 整形隊列算法: FIFO (First-In-First-Out) PFIFO (Priority FIFO) SFQ (Stochastic Fair Queuing) RED (Random Early Detection) HTB (Hierarchical Token Bucket) TBF…

谷粒商城筆記-04-項目微服務架構圖簡介

文章目錄 一,網絡二,網關1,網關選型2,認證鑒權3,動態路由4,限流5,負載均衡6,熔斷降級 三,微服務四,存儲層五,服務治理六,日志系統七&a…