SQL進階知識:四、索引優化

今天介紹下關于索引優化的詳細介紹,并結合MySQL數據庫提供實際例子。

索引優化是數據庫性能優化的關鍵環節之一,尤其是在處理大量數據時。索引可以加快查詢速度,減少數據掃描范圍,但不當的索引設計也可能導致性能問題。以下是關于索引優化的詳細介紹,以及基于MySQL的實際例子。


一、索引的基本概念

1. 索引的作用

索引類似于書籍的目錄,它可以幫助數據庫快速定位到需要的數據,而無需掃描整個表。索引可以顯著提高查詢效率,尤其是在大數據量的情況下。

2. 索引的類型

MySQL支持多種類型的索引:

  • 普通索引(Normal Index):最基本的索引類型,沒有唯一性限制。
  • 唯一索引(Unique Index):索引列的值必須唯一,但允許有NULL值。
  • 主鍵索引(Primary Key Index):特殊的唯一索引,表中只能有一個主鍵索引,且主鍵列不允許有NULL值。
  • 全文索引(Full-Text Index):用于全文搜索,支持對文本數據的快速搜索。
  • 組合索引(Composite Index):在多個列上創建索引,用于優化多列查詢。

3. 索引的存儲結構

MySQL通常使用**B樹(B-Tree)**作為索引的存儲結構。B樹索引適用于范圍查詢和等值查詢。


二、索引優化的關鍵點

1. 選擇合適的列創建索引

  • 高選擇性(High Selectivity):選擇性高的列(即列中值的重復度低)更適合創建索引。例如,id列通常比gender列更適合創建索引。
  • 查詢頻率高:優先為經常出現在WHERE子句、JOIN條件或ORDER BY子句中的列創建索引。

2. 避免過度索引

  • 索引的維護成本:索引會占用額外的存儲空間,并且在插入、更新和刪除數據時需要額外的維護成本。
  • 選擇性低的列:對于選擇性低的列(如性別、狀態等),創建索引可能不會帶來顯著的性能提升。

3. 使用組合索引

  • 最左前綴原則:組合索引的查詢條件必須從索引的最左列開始,否則索引可能不會被使用。
  • 覆蓋索引:如果查詢的所有列都在索引中,MySQL可以直接從索引中獲取數據,而無需訪問表。

4. 避免在索引列上使用函數

在索引列上使用函數會導致索引失效。例如:

-- 不推薦:會導致索引失效
SELECT * FROM users WHERE YEAR(birthdate) = 1990;-- 推薦:避免在索引列上使用函數
SELECT * FROM users WHERE birthdate BETWEEN '1990-01-01' AND '1990-12-31';

5. 定期維護索引

  • 重建索引:在大量數據更新后,索引可能會變得碎片化,影響性能。可以通過ALTER TABLEOPTIMIZE TABLE重建索引。
  • 刪除無用索引:定期檢查索引的使用情況,刪除那些從未被使用的索引。

三、實際例子

示例1:優化單列索引

假設有一個users表,記錄用戶的個人信息:

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),email VARCHAR(100),birthdate DATE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
場景:優化查詢用戶郵箱的查詢
-- 創建索引
CREATE INDEX idx_email ON users(email);-- 查詢用戶郵箱
SELECT * FROM users WHERE email = 'example@example.com';

解釋

  • 創建了一個普通索引idx_email,用于優化基于email列的查詢。
  • 查詢時,MySQL會使用索引快速定位到匹配的行,而無需掃描整個表。

示例2:優化組合索引

假設需要根據用戶的birthdatecreated_at進行查詢。

場景:優化基于birthdatecreated_at的查詢
-- 創建組合索引
CREATE INDEX idx_birthdate_created_at ON users(birthdate, created_at);-- 查詢用戶
SELECT * FROM users WHERE birthdate = '1990-01-01' AND created_at >= '2023-01-01';

解釋

  • 創建了一個組合索引idx_birthdate_created_at,包含birthdatecreated_at兩列。
  • 查詢時,MySQL會使用組合索引快速定位到匹配的行。
  • 注意:查詢條件必須從索引的最左列開始,否則索引可能不會被使用。

示例3:優化覆蓋索引

假設需要查詢用戶的idname,并且這兩個字段經常一起查詢。

場景:優化查詢用戶idname
-- 創建覆蓋索引
CREATE INDEX idx_id_name ON users(id, name);-- 查詢用戶
SELECT id, name FROM users WHERE id = 1;

解釋

  • 創建了一個組合索引idx_id_name,包含idname兩列。
  • 查詢時,MySQL可以直接從索引中獲取idname,而無需訪問表,從而提高查詢效率。

示例4:避免在索引列上使用函數

假設需要查詢用戶的出生年份。

場景:優化查詢用戶出生年份
-- 查詢用戶出生年份(不推薦)
SELECT * FROM users WHERE YEAR(birthdate) = 1990;-- 查詢用戶出生年份(推薦)
SELECT * FROM users WHERE birthdate BETWEEN '1990-01-01' AND '1990-12-31';

解釋

  • 第一個查詢中,YEAR(birthdate)會導致索引失效,MySQL需要掃描整個表。
  • 第二個查詢中,使用BETWEEN避免了函數,MySQL可以利用索引快速定位到匹配的行。

示例5:定期維護索引

假設表中有大量數據更新,需要重建索引以優化性能。

場景:重建索引
-- 重建索引
ALTER TABLE users DROP INDEX idx_email;
ALTER TABLE users ADD INDEX idx_email (email);-- 或者使用OPTIMIZE TABLE
OPTIMIZE TABLE users;

解釋

  • 使用ALTER TABLE刪除并重新創建索引,可以優化索引的存儲結構。
  • 使用OPTIMIZE TABLE可以清理表中的碎片,優化表和索引的存儲。

四、總結

索引優化是提高數據庫性能的重要手段。通過合理選擇索引列、使用組合索引、避免在索引列上使用函數以及定期維護索引,可以顯著提升查詢效率。然而,索引的創建和維護也需要謹慎,避免過度索引導致的性能問題。

以上就是基于Mysql,有關查詢相關的進階知識,希望對你有所幫助~
后續會連續發布多篇SQL進階相關內容;
期待你的關注,學習更多知識;

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

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

相關文章

(PYTHON)函數

函數的基本概念: python中函數分為以下四種: 1,python內置函數:如abs,len,max,min; 2,標準庫函數:通過import聲明標準庫,如:math&a…

Winform(1.Winform控件學習)

使用的控件有:Button,Label,TextBox button:表示一個按鈕,用戶點擊按鈕觸發事件 click事件最常用 label:標簽,用于顯示文本 Name屬性:變量名稱 textBox:輸入框 Form1代碼: using System; using System.Collections.Generic; using System.ComponentModel; using Sys…

linux centOS7.9 No package docker-ce available

docker pull apache/apisix:3.2.2-centos Error response from daemon: missing signature key 處理方式如下: 問題:在純凈機里安裝docker時報錯No package docker-ce available。 解決辦法: 1、更新yum,使用yum -y upgrade&#…

小白學習java第15天:JDBC

1.數據庫驅動 想一下我們之前是怎么操作數據庫,是不是使用SQL語句對其mysql數據庫管理系統,然后管理系統在進行數據庫(硬盤文件里面的)進行操作。那么我現在想使用應用程序對其數據庫進行操作,應該怎么辦呢&#xff1…

django之數據的翻頁和搜索功能

數據的翻頁和搜素功能 目錄 1.實現搜素功能 2.實現翻頁功能 一、實現搜素功能 我們到bootstrap官網, 點擊組件, 然后找到輸入框組, 并點擊作為額外元素的按鈕。 我們需要使用上面紅色框里面的組件, 就是搜素組件, 代碼部分就是下面紅色框框出來的部分。 把這里的代碼復制…

Kotlin Multiplatform--02:項目結構進階

Kotlin Multiplatform--02:項目結構進階 引言正文 引言 在上一章中,我們對 Kotlin Multiplatform 項目有了基本的了解,已經可以進行開發了。但我們只是使用了系統默認的項目結構。本章介紹了如何進行更復雜的項目結構管理。 正文 在上一章中&…

【Git】連接github時的疑難雜癥(DNS解析失敗)

大家好,我是jstart千語。最近在將項目推送到github的時候,突然github就拒絕訪問了,即使掛了VPN,網頁也進不去,通過git也不能把代碼推送上去。 即使后面看別人的一些解決方案,比如取消代理啊、更換ssh的方式…

ViTMAE:掩碼自編碼器是可擴展的視覺學習者

摘要 本文展示了掩碼自編碼器(MAE)作為計算機視覺中的可擴展自監督學習方法。我們的MAE方法很簡單:我們對輸入圖像進行隨機掩碼,并重建缺失的像素。該方法基于兩個核心設計。首先,我們開發了一種非對稱的編碼器-解碼器…

全球碳化硅晶片市場深度解析:技術迭代、產業重構與未來賽道爭奪戰(2025-2031)

一、行業全景:從“材料突破”到“能源革命”的核心引擎 碳化硅(SiC)作為第三代半導體材料的代表,憑借其寬禁帶(3.26eV)、高臨界擊穿場強(3MV/cm)、高熱導率(4.9W/cmK&…

AWS Glue ETL設計與調度最佳實踐

一、引言 在AWS Glue中設計和調度ETL過程時,需結合其無服務器架構和托管服務特性,采用系統化方法和最佳實踐,以提高效率、可靠性和可維護性。本文將從調度策略和設計方法兩大維度詳細論述,并輔以實際案例說明。 二、調度策略的最…

數據結構手撕--【二叉樹】

目錄 定義結構體: 初始化: 手動創建一個二叉樹: 前序遍歷: 中序遍歷: 后序遍歷 二叉樹節點個數: 葉子節點個數: 二叉樹第k層節點個數: 二叉樹的高度: 查找值為x…

2025 Java 開發避坑指南:如何避免踩依賴管理的坑?

在 Java 開發的世界里,依賴管理就像是一座看不見的橋梁,連接著項目所需的各種第三方庫和框架。然而,這座橋梁并非總是穩固,稍有不慎就可能掉入 “依賴地獄”,導致項目編譯失敗、運行異常。2025 年,隨著開源…

用node打開一個網頁

前言 使用node打開網頁,要求跨平臺 方案 使用子進程來用命令行打開網頁鏈接就可以了,需要注意的是Mac系統使用的是open命令,Windows系統使用的是start命令,Linux等系統使用xdg-open命令。針對不同的操作系統使用不同的命令。 封…

使用功能包組織C++節點的具體教程

在 ROS(Robot Operating System)中,使用功能包(package)來組織 C 節點是一種常見且有效的方式,它能讓代碼結構更清晰、便于管理和復用。 1. 環境準備 確保已經安裝了 ROS,這里以 ROS 2 Humble…

二項式分布html實驗

二項式分布html實驗 本文將帶你一步步搭建一個純前端的二項分布 Monte-Carlo 模擬器。 只要一個 HTML 文件,打開就能運行: 動態輸入試驗次數 n、成功概率 p 與重復次數 m點擊按鈕立刻得到「模擬頻數 vs 理論頻數」柱狀圖隨著 m 增大,兩組柱狀…

通過 API 對接應用網絡商城實現訂單自動化

前言 API(Application Programming Interface)即應用程序編程接口,是一種允許不同軟件應用程序之間進行交互和數據共享的工具。它通過定義一組明確的規則和協議,使得各個軟件系統能夠以標準化的方式相互通信。 在支付領域&#x…

openwrt作旁路由時的幾個常見問題 openwrt作為旁路由配置zerotier 圖文講解

1 先看openwrt時間,一定要保證時間和瀏覽器和服務器是一致的,不然無法更新 2 openwrt設置旁路由前先測試下,路由器能否ping通主路由,是否能夠連接外網,好多旁路由設置完了,發現還不能遠程好多就是旁路由本…

FANUC機器人GI與GO位置數據傳輸設置

FANUC機器人GI與GO位置數據傳輸設置(整數小數分開發) 一、概述 在 Fanuc 機器人應用中,如果 IO 點位足夠,可以利用機器人 IO 傳輸位置數據及偏移位置數據等。 二、操作步驟 1、確認通訊軟件安裝 首先確認機器人控制柜已經安裝…

UE5 Assimp 自用

記錄一下配assimp庫到ue中的過程。因為想在ue里面實現一些幾何處理(雖然ue好像有相關的geo的代碼),遂配置了一下assimp。 1. 編譯整理生成自己所需要的文件。cmake編譯,下載github 的官方的assimp-master,然后cmake都是默認的就行…

第18章:MCP在創作領域中的應用

第18章:MCP在創作領域中的應用 創意過程,無論是寫作、繪畫、音樂創作還是設計,往往充滿了不確定性、迭代和靈感的迸發。傳統 AI 在創意領域的應用常常局限于風格遷移、簡單內容生成等。MCP 框架通過其對記憶、上下文和規劃的整合,為 AI Agent 參與和輔助更深層次的創意活動…