」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > MySQL 最佳化技巧

MySQL 最佳化技巧

發佈於2024-11-01
瀏覽:449

MySQL Optimize Tips

優化資料庫結構

最佳化資料大小

→ 減少磁碟寫入和讀取的資料量

→ 在查詢執行期間主動處理其內容時主記憶體較少

→ 產生較小的索引,可以更快地處理

表格列

  • 盡可能使用最有效(最小)的資料類型
  • 如果可能,將列宣告為 NOT NULL → 更好地使用索引並消除測試每個值是否為 NULL 的開銷。

索引

  • 表的主索引應盡可能短
  • 僅建立提高查詢效能所需的索引。索引有利於檢索,但會減慢插入和更新操作。
  • 搜尋列的組合→建立複合索引
  • 索引中的第一個欄位應該是重複最多的欄位→以獲得更好的索引壓縮。

連結

  • 在具有相同資料類型的不同表中聲明具有相同資訊的欄位→相同資料類型
  • 保持列名簡單,

正常化

  • 通常情況下,盡量保持所有資料不冗餘
  • 如果速度比磁碟空間和保留多個資料副本的維護成本更重要

最佳化資料類型

  • 對於可以表示為字串或數字的唯一 ID 或其他值,→ 數字值可以比相應的字串以更少的位元組存儲,傳輸和比較它們速度更快,佔用的記憶體更少。
  • 比較不同欄位中的值時,盡可能宣告具有相同字元集和排序規則的欄位 → 避免字串轉換
  • 對於大小小於 8KB 的欄位值,請使用二進位 VARCHAR 而非 BLOB。 GROUP BY 和 ORDER BY 子句可以產生暫存資料表,如果原始資料表不包含任何 BLOB 資料列,這些暫存資料表可以使用 MEMORY 儲存引擎。
  • 如果一個表包含字串列並且不經常訪問→拆分到另一個表並連接→當MySQL從一行中檢索任何值時,它會讀取包含該行所有列(可能還有其他相鄰行)的資料塊。保持每行較小,僅包含最常用的列,可讓每個資料區塊容納更多行。
  • 當您使用隨機產生的值作為 InnoDB 表中的主鍵時,請在其前面加上升序值(例如當前日期和時間)(如果可能)。
  • 對於具有多個列的表,為了減少不使用 BLOB 列的查詢的記憶體需求,請考慮將 BLOB 列拆分為單獨的表,並在需要時使用聯接查詢引用它
  • • 由於檢索和顯示BLOB 值的效能需求可能與其他資料類型有很大不同,因此您可以將BLOB 特定表 放在不同的儲存裝置上,甚至是 單獨的儲存設備上資料庫實例。例如,要檢索 BLOB 可能需要大量順序磁碟讀取,這比 SSD 裝置更適合傳統硬碟。
  • 您可以將列值的雜湊值儲存在單獨的列中,對該列建立索引,然後在查詢中測試雜湊值,而不是測試非常長的文字字串是否相等。 (使用 MD5() 或 CRC32() 函數產生雜湊值。)

最佳化SQL語句

我們發現分兩步驟分析效能不佳的查詢很有用:

  • 了解您的應用程式檢索的資料是否超出您的需求。這通常意味著它訪問了太多行,但也可能訪問了太多列。
  • 找出MySQL 伺服器 分析的行數是否超出其需求。

優化 SELECT 語句

  • 避免在謂詞中使用函數
  • 避免在謂詞開頭使用萬用字元 (%)
  • 僅在必要時使用 DISTINCT 和 UNION
版本聲明 本文轉載於:https://dev.to/hulk-pham/mysql-optimize-tips-4oic?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-04-09
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列,選擇特定列的必要。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 的 colum...
    程式設計 發佈於2025-04-09
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    程式設計 發佈於2025-04-09
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-04-09
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-04-09
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, attributeError:SomeClass實...
    程式設計 發佈於2025-04-08
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-04-08
  • 如何使用node-mysql在單個查詢中執行多個SQL語句?
    如何使用node-mysql在單個查詢中執行多個SQL語句?
    在node-mysql node-mysql文檔最初出於安全原因最初禁用多個語句支持,因為它可能導致SQL注入攻擊。要啟用此功能,您需要在創建連接時將倍增設置設置為true: var connection = mysql.createconnection({{multipleStatement:...
    程式設計 發佈於2025-04-08
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-04-08
  • 如何在Java中執行命令提示命令,包括目錄更改,包括目錄更改?
    如何在Java中執行命令提示命令,包括目錄更改,包括目錄更改?
    在java 通過Java通過Java運行命令命令可能很具有挑戰性。儘管您可能會找到打開命令提示符的代碼段,但他們通常缺乏更改目錄並執行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。這種方法允許您:啟動一個過程,然後將其標準錯誤重定向到其標準輸出...
    程式設計 發佈於2025-04-08
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-04-08
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊上的div元素中的文本,您可以使用以下Javascript函數:實現以實現此函數: 在您的javascript代碼中添加了上述功能。參數。 使用...
    程式設計 發佈於2025-04-08
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-08
  • 我什麼時候應該在MySQL中使用複合主鍵,如何有效地實現它們?
    我什麼時候應該在MySQL中使用複合主鍵,如何有效地實現它們?
    在MySQL中的複合主鍵:選擇和實現的指南在設計關係數據庫時,主鍵的選擇至關重要。在MySQL中,複合主鍵提供了一種通過組合多個列來唯一識別行的方法。在本文中,我們將探討合成的主要鍵的正確創建,並解決具有自動插入替代主要鍵的表的特定情況。 考慮複合主鍵 在給定的兩種tables(tables_1 ...
    程式設計 發佈於2025-04-08
  • 如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    程式設計 發佈於2025-04-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3