【金三銀四】Mysgl優化了解?什么情況下會導致SQL索引失效?如何寫出高效SQL與優化慢SQL

Mysgl優化

MySQL 優化是指對 MySQL 數據庫的配置、表設計、查詢語句等進行針對性的優化,以提高數據庫的性能和效率。這包括但不限于合理設計數據庫表結構、編寫高效的 SQL 查詢語句、創建合適的索引以及調整數據庫服務器的參數等。

當MySQL單表記錄數過大時,性能下降是一個常見問題。這是因為隨著數據量的增加,數據庫在執行增刪改查操作時需要處理更多的數據。

當涉及到 MySQL 數據庫優化時,可以從以下幾個方面進行詳細討論:

一、單表優化:

  1. 字段優化

    • 選擇合適的數據類型以減少存儲空間和提高查詢效率。
    • 使用 TINYINT、SMALLINT、MEDIUM_INT 代替 INT,非負數加 UNSIGNED。
    • VARCHAR 長度根據實際需要分配。
    • 首選 TIMESTAMP 而非 DATETIME。
    • 單表字段不超過 20 個。
    • 盡量使用NOT NULL約束,避免NULL帶來的額外開銷。
    • 枚舉(ENUM)或整數(INT)比字符串(VARCHAR)更高效,特別是有大量重復值時。
    • 使用整數存儲IP地址以提高查詢效率。
  2. 索引優化

    • 根據查詢模式創建索引,重點關注WHERE和ORDER BY中的列,可根據EXPLAIN命令來查看是否用了索引還是全表掃描。
    • 避免在 WHERE 子句中對字段進行 NULL 值判斷,否則將導致引擎放棄使用索引而進行全表掃描。
    • 稀少值的字段不適合建索引,如性別。
    • 避免使用外鍵和 UNIQUE 約束。
    • 對字符字段可以考慮創建前綴索引以減少索引大小。
    • 避免對索引列進行運算,以免引起索引失效。
  3. 查詢SQL優化

    • 開啟慢查詢日志以定位性能瓶頸。
    • 避免列運算,盡量簡化 SQL。
    • 不使用 SELECT *。
    • 將 OR 改寫成 IN。
    • 避免函數和觸發器,推遲至應用程序層實現。
    • 少用 JOIN,使用同類型比較。
    • 使用索引避免全表掃描,提高查詢效率。
    • 使用LIMIT進行分頁查詢,避免一次性獲取大量數據。
    • 盡量避免在WHERE子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
  4. 存儲引擎選擇

    • MyISAM適用于讀多寫少的場景,提供全文索引和壓縮表功能。
    • InnoDB適用于寫多讀少的場景,支持事務、行鎖和外鍵,提供更高的并發處理能力和數據保護。
      當然可以,以下是一個簡單的表格,列出了MyISAM和InnoDB存儲引擎的特點:
特點MyISAMInnoDB
讀寫特性讀多寫少寫多讀少
事務支持不支持支持
鎖定方式表級鎖定行級鎖定
外鍵支持不支持支持
全文索引支持不支持
壓縮表支持不支持
并發處理較差較好
數據保護不提供數據保護機制提供數據保護機制

總體來講,MyISAM適合SELECT密集型的表,而InnoDB適合INSERT和UPDATE密集型的表。
希望這個表格能夠清晰地展示出MyISAM和InnoDB存儲引擎的特點。

  1. 系統調優參數

sysbench:一個模塊化,跨平臺以及多線程的性能測試工具。

https://github.com/akopytov/sysbench

iibench-mysql:基于Java的MySQL / Percona / MariaDB 索引進行插入性能測試工具。

https://github.com/tmcallaghan/iibench-mysql

tpcc-mysql:Percona開發的TPC-C測試工具。

https://github.com/Percona-Lab/tpcc-mysql
在優化數據庫時,建議定期監控性能并評估優化效果。在進行大規模優化前,應在測試環境中驗證,確保安全有效。

二、讀寫分離:

通過將讀操作和寫操作分開到不同的數據庫服務器上,提高系統的并發處理能力和讀取性能。寫操作集中在主庫上,讀操作則可以分攤到多個從庫上,有效減輕主庫的壓力。

讀寫分離是一種數據庫優化策略,通過將數據庫的讀操作和寫操作分別分配到不同的數據庫服務器上,以提高系統的并發處理能力和讀取性能。在這種策略下,寫操作集中在主數據庫服務器上,而讀操作則可以分攤到多個從數據庫服務器上。這樣做的好處是可以有效減輕主庫的壓力,提高系統的吞吐量。

讀寫分離的關鍵在于使用數據庫代理程序,如MySQL Proxy、MyCAT,這些代理程序充當了數據庫服務器和應用程序之間的中介。讀操作可以通過代理程序進行緩存,而寫操作則被轉發到主數據庫服務器進行實際的數據存儲。這種分離使得讀操作可以輕松地從緩存中獲得高性能,而寫操作則可以確保數據的一致性和完整性。

除了提高性能外,讀寫分離還可以幫助組織實現高可用性。通過將讀和寫操作分離到不同的服務器上,組織可以在不影響讀操作的情況下進行數據庫的維護和升級。這使得組織能夠更輕松地保持系統的正常運行,并減少停機時間。

需要注意的是,讀寫分離并不總是適用于所有情況。在某些情況下,這種分離可能會導致數據不一致。例如,如果兩個用戶同時進行讀操作,可能會讀到舊的數據。因此,在實現讀寫分離時,需要采取一定的措施來保證數據的一致性。

三、緩存:

利用緩存技術(如 Memcached、Redis 等)緩存熱點數據,減少對數據庫的頻繁訪問,提高訪問速度和并發能力。
緩存技術是提高系統性能的關鍵手段之一,它通過存儲頻繁訪問的數據或結果,從而減少對數據庫或其他數據源的直接訪問,加快數據檢索速度,并提高系統的并發處理能力。

常用的緩存技術包括Memcached和Redis。Memcached是一個高性能、分布式內存對象緩存系統,主要用于緩存數據庫中的對象,以減少數據庫的訪問次數。而Redis是一個開源的、支持網絡、可基于內存也可以持久化的日志型、Key-Value數據庫,并提供多種類型的數據結構來適應不同場景下的緩存需求。

在實現緩存時,需要關注以下幾個關鍵點:

  1. 緩存命中率:緩存命中率是衡量緩存效果的重要指標,高命中率意味著更多的請求可以直接從緩存中獲取,減少了對后端數據庫的訪問。
  2. 緩存更新策略:包括過期時間、懶加載和主動更新等,選擇合適的更新策略可以確保緩存數據的及時性和有效性。
  3. 緩存穿透:為了避免緩存未命中時對數據庫的巨大壓力,需要采取措施如緩存空值或布隆過濾器等來防止緩存穿透。
  4. 緩存雪崩:在緩存失效時,大量請求直接打在數據庫上,可能導致系統癱瘓。可以通過設置不同的過期時間、限流、增加緩存實例等方式來避免緩存雪崩。
  5. 緩存預熱:在系統啟動或緩存數據初始化時,提前將熱點數據加載到緩存中,以避免系統上線初期大量請求直接訪問數據庫。
  6. 緩存粒度:根據業務需求,選擇合適的緩存粒度,如數據行、數據頁或數據塊,以平衡緩存效率和內存利用率。

通過合理使用緩存技術,可以有效降低系統響應時間,提高系統的并發處理能力,從而改善用戶體驗。

四、表分區:

將大表按照一定的規則分割成小的分區,可以加速查詢和提高性能。常見的分區方式有范圍分區、哈希分區、列表分區等。

五、垂直拆分:

將原本一個大表按列拆分成多個表,每個表包含部分列,可以提高查詢效率,降低數據冗余。

六、水平拆分:

將原本一個大表按行拆分成多個表,每個表包含部分行數據,可以分散數據存儲,提高并發能力和負載均衡。

七、水平拆分跟垂直拆分的區別

水平拆分和垂直拆分是在數據庫設計和優化中常用的兩種數據分割策略。它們的區別在于數據如何被拆分和存儲。

  1. 水平拆分(Horizontal Sharding):

    • 水平拆分是指將數據按照某種規則(比如按照用戶ID、時間范圍等)分割成多個部分,然后分別存儲到不同的數據庫節點或表中。
    • 這種方式適合于需要橫向擴展的場景,可以更好地應對數據量大、并發讀寫壓力大的情況。
    • 例子:將全國用戶的數據按照地理位置分割存儲到不同的數據庫節點上。
  2. 垂直拆分(Vertical Partitioning):

    • 垂直拆分是指將數據表按照字段的關系和訪問模式進行拆分,將不同的字段分別存儲到不同的表或數據庫中。
    • 這種方式適合于減少單個表的寬度,提高數據讀取效率,同時可以根據不同的業務需求將數據存儲到不同的物理存儲介質上。
    • 例子:將包含大量稀疏字段的表進行拆分,將常用的字段存儲到主表,將稀疏字段存儲到關聯表中。

總的來說,水平拆分注重的是數據的分布和擴展能力,而垂直拆分注重的是數據的結構和訪問模式。在實際應用中,通常會綜合考慮兩種拆分方式,根據具體的業務需求和系統特點來選擇最合適的拆分策略。

綜合來看,MySQL 數據庫優化是一個綜合性的工作,需要結合具體業務場景和需求,從表結構設計、索引優化、查詢語句編寫、緩存應用、分區與拆分等多個方面綜合考慮,以提高數據庫性能和系統穩定性。

什么情況下會導致SQL索引失效?

SQL索引失效的情況包括:

  1. 使用OR條件:當查詢條件中包含OR時,即使部分條件涉及索引列,也可能導致索引失效。
SELECT * FROM users WHERE age = 30 OR name = 'Alice';
  1. 類型轉換:對索引列進行類型轉換,如使用函數,可能導致索引失效。
SELECT * FROM users WHERE UPPER(name) = 'ALICE';
  1. 范圍條件右側列:在復合索引中,范圍條件(如>、<、BETWEEN等)右側的列無法使用索引。
SELECT * FROM users WHERE age > 25 AND name = 'Alice';
  1. 不等于條件:使用!=或<>會導致索引失效。
SELECT * FROM users WHERE age != 25;
  1. IS NULL/IS NOT NULL:這些條件會導致索引失效。
SELECT * FROM users WHERE name IS NULL;
  1. LIKE通配符開頭:如果LIKE查詢以通配符%開頭,會導致索引失效。
SELECT * FROM users WHERE name LIKE '%Alice';
  1. 字符串未加引號:字符串類型字段未加單引號可能導致索引失效。
SELECT * FROM users WHERE name = Alice;
  1. 索引列上計算:在索引列上進行計算或其他操作,會導致索引失效。
SELECT * FROM users WHERE age + 10 = 30;
  1. 最佳左前綴法則:在復合索引中,必須從最左邊的列開始查詢,并且不能跳過中間列。
SELECT * FROM users WHERE name = 'Alice' AND age = 25;
  1. 存儲引擎限制:某些存儲引擎對索引的使用有限制。
  2. 優化器選擇:優化器可能根據成本考慮不使用索引。
  3. 數據分布不均:索引列數據分布不均,可能導致索引失效。
  4. 表數據量小:對于小表,全表掃描可能比索引更快。
  5. 查詢條件覆蓋索引:盡量使用覆蓋索引,避免回表查詢。

如何使用EXPLAIN查看SQL有沒有走索引

要使用EXPLAIN來查看SQL語句是否使用了索引,可以按照以下步驟進行:

  1. 在待查詢的SQL語句前加上EXPLAIN關鍵字,例如:

    EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
    
  2. 執行該帶有EXPLAIN關鍵字的SQL語句,數據庫系統將返回一個結果集,其中包含了查詢的執行計劃。

  3. 查看執行計劃中的type列,該列表示查詢使用了哪種類型的訪問方法:

    • 如果type列顯示為index,表示查詢使用了索引。
    • 如果type列顯示為range,表示查詢使用了范圍索引。
    • 如果type列顯示為ALL,表示查詢進行了全表掃描,沒有使用索引。
  4. 可以查看key列,該列表示查詢實際使用的索引名稱。

  5. 如果查詢涉及多個表,還可以查看possible_keys列,表示查詢可能使用的索引列表。

  6. 最后,查看rows列,表示查詢預計需要檢查的行數,行數越少表示查詢效率可能越高。

通過分析EXPLAIN的結果,可以判斷SQL語句是否使用了索引,以及索引的使用是否合理。如果查詢未使用索引或使用了不合適的索引,可以考慮修改查詢語句或創建更合適的索引以提高查詢性能。

下面是一個表格格式的展示,包含了在使用EXPLAIN命令時通常可以查看的參數:

參數說明
id每個查詢的序號,如果有子查詢則會有多行記錄,父查詢的id值會與子查詢相關聯
select_type查詢的類型,如SIMPLE(簡單查詢)、PRIMARY(主查詢)、SUBQUERY(子查詢)等
table正在訪問的表
partitions匹配的分區信息
type連接類型,包括system、const、eq_ref、ref、range、index等
possible_keys可能應用在表中的索引,但不一定被查詢使用
key實際使用的索引
key_len索引字段的長度
ref使用的索引的哪一列,通常是常數或字段
rows數據庫系統認為必須檢查的行數
filtered表的過濾行百分比
Extra提供關于執行查詢的額外信息,如Using index、Using temporary、Using filesort等

如何寫出高效SQL與優化慢SQL

要編寫高效的 SQL 并優化慢 SQL,可以遵循以下一些建議:

編寫高效 SQL:

  1. 選擇合適的數據類型:使用最適合數據存儲需求的數據類型,避免過度使用大型數據類型。

  2. 編寫簡潔的查詢:只檢索需要的列,避免不必要的數據傳輸和處理。

  3. 避免使用“SELECT *”:明確指定需要的列,減少不必要的數據載入。

  4. 使用索引:確保表上的經常查詢的列有索引,以加快檢索速度。

  5. 避免在 WHERE 子句中對列進行函數操作:這會導致無法利用索引,影響查詢性能。

  6. 合理使用 JOIN:選擇合適的 JOIN 類型,避免笛卡爾積,確保連接條件正確。

  7. 避免使用子查詢:盡量優化為 JOIN 操作,避免多次執行子查詢。

  8. 避免在查詢中使用通配符:如 %,這會導致全表掃描。

優化慢 SQL:

  1. 使用 EXPLAIN 分析查詢計劃:了解查詢是如何執行的,找出潛在的性能瓶頸。

  2. 優化查詢語句:根據 EXPLAIN 結果,考慮是否可以調整查詢、添加索引或重寫查詢以提高性能。

  3. 創建索引:分析查詢中涉及的列,為經常用于搜索和連接的列創建索引。

  4. 避免在 WHERE 子句中進行不必要的計算:將計算移到應用程序層面,減輕數據庫負擔。

  5. 定期分析慢查詢日志:識別哪些查詢較慢,并針對性地進行優化工作。

  6. 使用緩存:利用緩存技術如 Redis 緩存熱點數據,減少數據庫壓力。

  7. 定期維護數據庫:包括優化表結構、清理無用數據、重建索引等操作,保持數據庫的健康狀態。

通過以上方法,可以提高 SQL 查詢的效率并優化慢 SQL,從而提升數據庫性能和用戶體驗。

超級全面的MySQL優化指南1


  1. 本文參考上述文章進行整理。 ??

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

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

相關文章

【測試工具】Fiddler

1.Fiddler簡介 Fiddler是位于客戶端和服務器端的HTTP代理&#xff0c;能夠記錄客戶端和服務器之間的所有 HTTP請求&#xff0c;是web調試的利器。既然是代理&#xff0c;也就是說&#xff1a;客戶端的所有請求都要先經過Fiddler&#xff0c;然后轉發到相應的服務器&#xff0c…

【應用多元統計分析】--數據矩陣及R語言表示

在多元分析中&#xff0c;數據通常以矩陣的形式出現&#xff0c;下面結合R語言介紹基本的矩陣運算。主要包括&#xff1a;創建矩陣向量&#xff0c;矩陣加減、乘積&#xff0c;矩陣的逆&#xff0c;行列式的值&#xff0c;特征值與特征向量&#xff0c;QR分解&#xff0c;奇異值…

微前端-乾坤《》

微前端 一個應用&#xff0c;當不斷迭代的時候&#xff0c;功能會越來越多&#xff0c;代碼量隨著也會變得越來越大。進而代碼之間的耦合性會變高&#xff0c;這樣導致開發和維護很糟心&#xff0c;動一發而牽全身。于是有了微前端來解這個問題&#xff0c;按功能可以將這個應…

day02-JavaScript-Vue

文章目錄 1 JavaScript1.1 介紹 1.2 引入方式1.3 基礎語法1.3.1 書寫語法1.3.2 變量1.3.3 數據類型和運算符 1.4 函數1.4.1 第一種定義格式1.4.2 第二種定義格式 1.5 JavaScript對象1.5.1 基本對象1.5.1.1 Array對象語法格式特點屬性和方法 1.5.1.2 String對象語法格式屬性和方…

17.來自Sora的奪舍妄想——享元模式詳解

OpenAI 的 Sora 模型面世之后&#xff0c;可以說人類抵御AI的最后陣地也淪陷了。 在此之前&#xff0c;人們面對AI交互式對話&#xff0c;AI制圖&#xff0c;AI建模之類的奇跡時&#xff0c;還可以略微放肆的說&#xff1a;“的確很神奇&#xff0c;這畢竟還是比人類世界低了一…

Redis基本知識

一、什么是Redis Redis是一種基于內存的數據庫&#xff0c;對數據的讀寫操作都是在內存中完成&#xff0c;因此讀寫速度非常快&#xff0c;用于存儲鍵值對、緩存、消息隊列、分布式鎖等。 二、Redis和mencached的區別 相同&#xff1a;都是基于內存的數據庫&#xff0c;讀寫都…

2024年騰訊云部署幻獸帕魯服務器,如何選擇合適的服務器配置套餐暢玩游戲?

選擇合適的服務器配置套餐以暢玩《幻獸帕魯》游戲&#xff0c;首先需要考慮的是玩家數量和對服務器性能的需求。根據騰訊云提供的配置推薦&#xff0c;對于4到8人的玩家&#xff0c;推薦配置為4核16G12M&#xff1b;而10到20人的玩家則建議選擇8核32G22M配置。這是因為《幻獸帕…

小程序頁面指定區域局部滾動,做上拉和觸底刷新

業務需求&#xff1a;在頁面某個固定區域滑動 思路&#xff1a;滑動高度 頁面高度 - 自定義導航高度&#xff08;不是自己自定義的導航可以省略&#xff09;- 按鈕高度 - 單詞數高度 實現 &#xff1a; 1.數據展示區內使用scroll-view&#xff0c;設置y軸滾動&#xff08;…

swoole

php是單線程。php是靠多進程來處理任務&#xff0c;任何后端語言都可以采用多進程處理方式。如我們常用的php-fpm進程管理器。線程與協程,大小的關系是進程>線程>協程,而我們所說的swoole讓php實現了多線程,其實在這里來說,就是好比讓php創建了多個進程,每個進程執行一條…

初階數據結構:二叉樹

目錄 1. 樹的相關概念1.1 簡述&#xff1a;樹1.2 樹的概念補充 2. 二叉樹2.1 二叉樹的概念2.2 二叉樹的性質2.3 二叉樹的存儲結構與堆2.3.1 存儲結構2.3.2 堆的概念2.3.3 堆的實現2.3.3.1 堆的向上調整法2.3.3.2 堆的向下調整算法2.3.3.3 堆的實現 1. 樹的相關概念 1.1 簡述&a…

域名及地址正確外,若依后臺無法正常加載頁面和退出報404問題

寫小程序退出的時候&#xff0c;另外寫了一個自定義退出處理類&#xff0c;里面的響應瀏覽器的代碼每次都走。因為原來也有個退出處理類&#xff0c;所以先后走了2次&#xff0c;因為就出現了問題。 LogoutSuccessHandlerImpl類里的&#xff1a; ServletUtils.renderString(r…

【C++ AVL樹】

文章目錄 AVL樹AVL樹的概念AVL樹節點的定義AVL樹的插入AVL樹的旋轉右單旋左單旋左右雙旋右左雙旋 代碼實現 總結 AVL樹 AVL樹的概念 二叉搜索樹在順序有序或接近有序的情況下&#xff0c;而插入搜索樹將退化為單叉樹&#xff0c;此時查找的時間復雜度為O(n)&#xff0c;效率低…

鴻蒙Harmony應用開發—ArkTS聲明式開發(通用屬性:顏色漸變)

設置組件的顏色漸變效果。 說明&#xff1a; 從API Version 7開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。 linearGradient linearGradient(value: { angle?: number | string; direction?: GradientDirection; colors: Array; repea…

mamba-ssm安裝building wheel卡著不動后error...避坑解決方法

文章目錄 方法1、下載whl文件到本地后pip install安裝成功后驗證&#xff1a; 方法2、拉取Docker鏡像 對于項目中用到MambaIR的小伙伴&#xff0c;需要pip安裝 causal_conv1d和 mamba-ssm兩個包及其依賴&#xff1a; torch packing transformersMambaIR-Github主頁&#xff0…

【C++】vector的使用及其模擬實現

這里寫目錄標題 一、vector的介紹及使用1. vector的介紹2. 構造函數3. 遍歷方式4. 容量操作及空間增長問題5. 增刪查改6. vector二維數組 二、vector的模擬實現1. 構造函數2. 迭代器和基本接口3. reserve和resize4. push_back和pop_back5. insert和erase5. 迭代器失效問題5. 淺…

【Java】基礎算法練習題

個人簡介&#xff1a;Java領域新星創作者&#xff1b;阿里云技術博主、星級博主、專家博主&#xff1b;正在Java學習的路上摸爬滾打&#xff0c;記錄學習的過程~ 個人主頁&#xff1a;.29.的博客 學習社區&#xff1a;進去逛一逛~ 目錄 基礎算法練習題&#x1f680;1. 兩數之和…

Django 管網項目 三

Django 官網文檔 ??Writing your first Django app, part 2 | Django documentation | Django 本文內容涉及創建視圖 View&#xff0c;路由&#xff0c;和模版。并對內容進行渲染。 創建視圖 在我們的投票應用中&#xff0c;我們需要下列幾個視圖&#xff1a; 問題索引頁—…

ChatGPT支持下的PyTorch機器學習與深度學習技術應用

近年來&#xff0c;隨著AlphaGo、無人駕駛汽車、醫學影像智慧輔助診療、ImageNet競賽等熱點事件的發生&#xff0c;人工智能迎來了新一輪的發展浪潮。尤其是深度學習技術&#xff0c;在許多行業都取得了顛覆性的成果。另外&#xff0c;近年來&#xff0c;Pytorch深度學習框架受…

相關知識1111

一、 店鋪編號和相關負責人 1、天貓兄弟、錦格 京東凡越 福林哥 如萍姐 2、京東錦格 天貓凡越 林森 雷佳華 3、天貓從簡 京東從簡 孔哥 4、抖音錦格 拼多多凡越 鴻哥 不知道哪個店鋪編號&#xff1a;0 二、天貓京東聊天界面快捷搜索商品 1、 天貓只能根據標題搜索 2、京東是…

神經網絡之萬能定理python-pytorch實現,可以擬合任意曲線

神經網絡之萬能定理python-pytorch實現&#xff0c;可以擬合任意曲線 博主&#xff0c;這幾天一直在做這個曲線擬合的實驗&#xff0c;講道理&#xff0c;網上可能也有很多這方面的資料&#xff0c;但是博主其實試了很多&#xff0c;效果只能對一般的曲線還行&#xff0c;稍微…