MySQL 索引優化與慢查詢優化:原理與實踐

MySQL是一個廣泛使用的關系型數據庫管理系統,優化MySQL的性能對于保證應用的高效運行至關重要。本文將詳細介紹MySQL索引優化與慢查詢優化的原理和實踐方法。

一、MySQL索引優化

1.1 索引的基本概念

索引是一種用于提高數據庫查詢速度的數據結構。常見的索引類型包括:

  • B-Tree索引:適用于大多數查詢。
  • Hash索引:用于精確匹配查詢。
  • Full-Text索引:用于全文搜索。
  • Spatial索引:用于地理空間數據查詢。

1.2 索引的工作原理

索引通過減少需要掃描的行數,提高數據檢索的速度。它相當于書籍的目錄,通過索引快速定位需要的數據,而不必逐行掃描整個表。

1.3 創建索引的基本語法

創建索引用于提高查詢性能,可以在表創建時定義,也可以在表創建后添加。

-- 在表創建時定義索引
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),email VARCHAR(50),INDEX (email)
);-- 在表創建后添加索引
CREATE INDEX idx_email ON users(email);

1.4 索引優化的原則

選擇合適的列創建索引
  • 主鍵和唯一鍵:自動創建索引。
  • 頻繁出現在?WHEREORDER BYGROUP BY中的列:應創建索引。
  • 選擇性高的列:應創建索引,高選擇性意味著列中有很多不同的值。
避免不必要的索引
  • 低選擇性列:如性別(男、女)等不應創建索引。
  • 過多的索引:會增加寫操作的開銷,影響插入、更新和刪除操作的性能。
使用覆蓋索引

覆蓋索引包含所有需要查詢的列,減少回表查詢的次數。

-- 使用覆蓋索引的查詢示例
SELECT id, email FROM users WHERE email = 'example@example.com';

1.5 索引設計的最佳實踐

聯合索引

在多個列上創建聯合索引,提高多條件查詢的效率。

CREATE INDEX idx_name_email ON users(name, email);
前綴索引

對于長文本列,可以使用前綴索引,減少索引的存儲空間。

CREATE INDEX idx_email_prefix ON users(email(10));
分區表

對于大表,可以使用分區表來提高查詢性能。

ALTER TABLE orders 
PARTITION BY RANGE (YEAR(order_date)) (PARTITION p0 VALUES LESS THAN (2020),PARTITION p1 VALUES LESS THAN (2021),PARTITION p2 VALUES LESS THAN MAXVALUE
);

二、MySQL慢查詢優化

2.1 慢查詢的定義

慢查詢是指執行時間超過指定閾值的查詢。識別和優化慢查詢可以顯著提升數據庫性能。

2.2 開啟慢查詢日志

首先,需要開啟慢查詢日志以記錄執行時間超過指定閾值的查詢。

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 2;  -- 設置慢查詢閾值為2秒

2.3 分析慢查詢日志

使用?mysqldumpslow工具分析慢查詢日志,找出最頻繁和最耗時的查詢。

mysqldumpslow -s t /var/log/mysql/slow.log

2.4 使用EXPLAIN分析查詢

使用?EXPLAIN命令查看查詢執行計劃,找出查詢性能瓶頸。

EXPLAIN SELECT * FROM users WHERE email = 'example@example.com';

EXPLAIN輸出中,關鍵字段包括:

  • type:訪問類型,取值從好到差分別為?systemconsteq_refrefrangeindexALL
  • possible_keys:可能使用的索引。
  • key:實際使用的索引。
  • rows:掃描的行數,越少越好。
  • Extra:附加信息,如?Using index表示使用覆蓋索引,Using where表示需要過濾。

2.5 優化查詢語句

使用索引

確保查詢條件使用了索引覆蓋的列。

SELECT id, email FROM users WHERE email = 'example@example.com';
避免SELECT*

只選擇需要的列,減少數據傳輸量。

SELECT id, email FROM users WHERE email = 'example@example.com';
拆分復雜查詢

將復雜查詢拆分為多個簡單查詢,提高性能。

-- 將復雜查詢拆分為簡單查詢
SELECT id FROM users WHERE email = 'example@example.com';
SELECT * FROM user_details WHERE user_id = 1;
使用子查詢代替聯接

在某些情況下,使用子查詢代替聯接可以提高性能。

-- 使用子查詢代替聯接
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);

2.6 緩存查詢結果

使用緩存減少對數據庫的直接查詢,提高查詢性能。

-- 使用Memcached或Redis緩存查詢結果

2.7 定期優化表

定期優化表結構,提高查詢性能。

OPTIMIZE TABLE users;

三、實際案例分析

3.1 案例背景

假設我們有一個存儲用戶訂單的表?orders,需要定期統計訂單數據,并優化查詢性能。

3.2 表結構

CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,user_id INT,product_id INT,order_date DATE,amount DECIMAL(10, 2)
);
?

3.3 優化查詢性能的步驟

創建索引

為常用查詢條件創建索引。

CREATE INDEX idx_user_id ON orders(user_id);
CREATE INDEX idx_order_date ON orders(order_date);
分析慢查詢日志

開啟慢查詢日志并分析最耗時的查詢。

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 1;mysqldumpslow -s t /var/log/mysql/slow.log
?
使用EXPLAIN優化查詢

使用?EXPLAIN命令查看查詢執行計劃,并優化查詢語句。

EXPLAIN SELECT * FROM orders WHERE user_id = 1 AND order_date >= '2023-01-01';
?
優化查詢語句

確保查詢條件使用索引,減少數據傳輸量和復雜查詢。

SELECT order_id, amount FROM orders WHERE user_id = 1 AND order_date >= '2023-01-01';
?
使用緩存

對于頻繁執行的查詢,使用緩存技術提高性能。

-- 使用Redis緩存查詢結果
?
定期優化表

定期優化表結構,提高查詢性能。

OPTIMIZE TABLE orders;

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

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

相關文章

【AS32系列MCU調試教程】應用開發:基于AS32芯片的流水燈功能實現

摘要: 本文以國科安芯的AS32系列MCU芯片為例,聚焦于基于 AS32 芯片的流水燈功能開發,深入闡述了開發環境搭建、工程配置以及調試等關鍵環節。通過詳盡的實驗過程與結果分析,旨在為相關領域技術人員提供一套系統、高效且成本可控的…

爬蟲001----介紹以及可能需要使用的技術棧

首先1??。。。全篇使用的技術棧當然是python了,畢竟作為一名點點點工程師,實際工作中做測試開發用的也是python,畢竟測試框架么,不需要什么"速度"。也會一點點cpp和js,但不多。什么?你說go和ja…

Java 中基于條件動態決定字段參與分組的實現方法

在 Java 的 Stream API 中,Collectors.groupingBy()方法為數據分組提供了強大的支持。通過它,我們可以輕松地將集合中的元素按照某個屬性進行分組,比如按照商品類別、日期等。然而,在實際業務場景中,有時需要根據特定條…

AppBarLayout+ CoordinatorLayout,ViewPager2為什么不會覆蓋AppBarLayout

<?xml version"1.0" encoding"utf-8"?> <layout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools&quo…

【群體智能優化算法系列 】一 粒子群算法 (Particle Swarm Optimization, PSO)

【群體智能優化算法系列 】一 粒子算法 一&#xff1a;前言二&#xff1a;算法原理2.1 核心思想2.2 PSO核心公式?2.3 PSO算法流程圖 三&#xff1a;python實現 二維Rastrigin函數 最低點檢索例子參考 一&#xff1a;前言 粒子群算法是由Kennedy和Eberhart在1995年提出的一種基…

Jupyter notebook調試:設置斷點運行

寫了一段小代碼&#xff0c;主要是用來測試一段序列的k均值聚類效果&#xff1b; 中間想到debug一下&#xff0c;但是想到自己似乎從來沒有正式地接觸過jupyter notebook中地debug&#xff0c;平時也只是多開幾個cell&#xff0c;然后在其他cell中復制粘貼部分代碼&#xff0c…

[12-2] BKP備份寄存器RTC實時時鐘 江協科技學習筆記(14個知識點)

1 2 3 4 5 6 7 8 RTC是“Real-Time Clock”的縮寫&#xff0c;中文意思是“實時時鐘”。這是一種在電子設備中使用的時鐘&#xff0c;它能夠提供準確的時間信息&#xff0c;即使在設備斷電的情況下也能繼續運行&#xff0c;因為它通常由一個小型電池供電。RTC廣泛應用于計算機…

優化給AI的“提問技巧”(提示工程),讓大型語言模型(比如GPT)更好地扮演“心理治療助手”的角色

優化給AI的“提問技巧”(提示工程),讓大型語言模型(比如GPT)更好地扮演“心理治療助手”的角色 尤其是在“問題解決療法”(PST)中幫助 caregivers(家庭護理者)緩解焦慮、疲勞等心理癥狀。以下是核心內容的通俗解讀: 一、研究背景:AI當心理醫生靠譜嗎? 現狀:全球…

Java的lambda表達式應用

Lambda表達式是Java 8引入的一項強大特性&#xff0c;它允許以更加簡潔的方式表示匿名函數。Lambda表達式不僅讓代碼更加簡潔、清晰&#xff0c;而且為函數式編程提供了有力支持&#xff0c;從而提升了Java語言的表達能力。 本文主要講解lambda應用stream處理集合的應用。 1、…

云原生/容器相關概念記錄

文章目錄 網絡與虛擬化技術云平臺與架構容器與編排容器網絡方案性能優化與工具硬件與協議 網絡與虛擬化技術 P4可編程網關 P4: Programming Protocol-independent Packet Processors一種基于P4語言的可編程網絡設備&#xff0c;支持自定義數據包處理邏輯。P4可編程技術詳解&am…

[C++] traits機制

文章目錄 C之type_traitsis_floating_point<T> ..的使用std::enable_if<T>::type的使用std::remove_cv 如何自定義traits C之type_traits is_floating_point …的使用 一般在定義打印模板函數的時候&#xff0c;當我們用printf進行終端日志打印&#xff0c;需要根…

OpenCV 視頻處理與保存

一、知識點 1、VideoCapture類 (1)、用于從視頻文件、攝像機或圖像序列中捕獲視頻幀。 (2)、構造函數 VideoCapture(const String & filename, int apiPreference CAP_ANY) a、filename可以是視頻文件的名稱(例如"video.avi")&#xff0c;可以是圖…

【Leetcode】字符串之二進制求和、字符串相乘

文章目錄 算法原理二進制求和題目鏈接題目描述解題思路代碼 字符串相乘題目鏈接題目描述解題思路代碼 算法原理 這兩道題都是屬于算法里一種經典題型&#xff1a;高精度加/減/乘/除法&#xff0c;需要我們模擬加/減/乘/除 列豎式運算。 二進制求和 題目鏈接 題目鏈接 題目描…

MongoDB:索引

目錄 1、索引數據結構&#xff1a;B-樹 2、索引類型 2.1 單字段索引 2.2 復合索引&#xff08;最重要&#xff01;&#xff09; 2.3 多鍵索引&#xff08;數組字段&#xff09; 2.4 地理空間索引 2.5 全文索引 2.6 哈希索引&#xff08;分片專用&#xff09; 2.7 TTL …

【大模型】Transformer架構完全解讀:從“盲人摸象“到“通曉萬物“的AI進化論

&#x1f916; Transformer架構完全解讀&#xff1a;從"盲人摸象"到"通曉萬物"的AI進化論 —— 一位大模型探索者的技術日記 ? 第一章&#xff1a;為什么說Transformer是AI界的"蒸汽機革命"&#xff1f; 1.1 從RNN到Transformer&#xff1a;…

JavaEE:使用JMeter進行接口并發測試

一、下載與安裝&#xff1a; 1.下載apache-jmeter-5.6.3.zip&#xff1a; https://jmeter.apache.org/download_jmeter.cgi 2.解壓到D:\Program Files\apache-jmeter-5.6.3目錄 3.添加JDK環境配置到D:\Program Files\apache-jmeter-5.6.3\bin\jmeter.bat文件開頭&#xff1…

【筆記】MSYS2 的 MinGW64 環境中正確安裝 Python 相關環境管理工具 (Poetry、Virtualenv、Pipenv 和 UV)

MSYS2 環境配置與 Python 項目依賴管理筆記_msys更新python-CSDN博客 【技術筆記】MSYS2 指定 Python 版本安裝方案_pacman -u 安裝指定版本-CSDN博客 更多關于 MSYS2 開發環境的配置&#xff0c;請查看往期筆記。 簡介 本筆記將記錄我們在 MSYS2 的 MinGW64 環境中安裝 Pytho…

ubuntu添加域名解析服務器地址

在 Ubuntu 中配置域名解析主要有兩種方式&#xff1a;靜態修改 /etc/hosts 文件 和 動態修改 DNS 解析服務器配置。以下是詳細操作指南&#xff1a; 建議優選:二、永久方案&#xff1a;修改 DNS 解析服務&#xff08;推薦&#xff09;中的方法1 一、臨時方案&#xff1a;修改…

通過 AIOps 、生成式 AI 和機器學習實現更智能的可觀測性

支持 AIOps 的理由 人工智能運維&#xff08;AIOps&#xff09;是將人工智能&#xff08;AI&#xff09;、機器學習&#xff08;ML&#xff09;和分析技術應用于提升 IT 運維團隊日常工作的過程。簡單來說&#xff0c;AIOps 是軟件系統通過 AI 和 ML 以及相關分析技術來簡化和…

【DataWhale組隊學習】AI辦公實踐與應用

AI辦公-PPT制作 1. 使用大模型制作PPT的常見流程 使用大模型生成PPT的文稿將文稿的內容喂給可以直接生成PPT的大模型&#xff0c;生成PPT 2. 使用大模型生成PPT文稿 我們可以先使用上一章提過的那些大模型去生成一個PPT的文稿。那根據上一章的內容&#xff0c;我們想要去讓…