MySQL索引優化,性能飆升的秘密!

0.前言

假設你經營一家電商平臺,某天用戶突然投訴商品搜索加載時間超過10秒。技術團隊緊急排查,發現一條原本執行0.1秒的查詢語句,在百萬級數據量下竟變成了全表掃描。這時,數據庫索引猶如深夜急診室里的救命儀器——它的存在與否,直接決定系統是起死回生還是徹底崩潰。

索引設計的底層邏輯如同城市交通規劃。想象早高峰時的十字路口,無序的車流必然引發堵塞。B+樹結構通過分層導航,讓數據查詢像ETC通道般快速通行。某金融平臺曾將交易記錄的查詢響應時間從8秒縮短至0.2秒,秘密就在于將單列索引改造為組合索引,如同在十字路口增設定向車道。

1.索引設計原則

  • 代碼先行,索引后上:給數據庫表添加索引,一般應該等到主體業務功能開發完畢,把涉及到該表相關sql都要拿出來分析之后再建立索引。

  • 高頻查詢列:優先為 WHERE、JOIN、ORDER BY、GROUP BY 等子句中頻繁使用的列創建索引。

  • 避免低基數列:低基數列(如性別、狀態等重復值多的列)不適合創建索引,因為它們的區分度低,索引效果不明顯。盡量使用那些基數比較大的字段,就是值比較多的字段,那么才能發揮出B+樹快速二分查找的優勢來。列的唯一性越高,索引效果越好。

  • 聯合索引盡量覆蓋條件:對于多列查詢,優先使用組合索引(多列索引),但需遵循最左前綴原則。同時將查詢中使用頻率最高的列放在前面,同時考慮查詢的過濾性,將過濾性更強的列放在前面。

  • 長字符串可以采用前綴索引:盡量對字段類型較小的列設計索引,比如說什么tinyint之類的,因為字段類型較小的話,占用磁盤空間也會比較小,在搜索的時候性能也會比較好一點。對于長字符串列(如 VARCHAR),可以使用前綴索引(如 CREATE INDEX idx_name ON users(name(10))),以節省空間。

  • 選擇合適的索引類型:優先使用自增整數作為主鍵,避免使用 UUID 等無序主鍵。

  • 控制索引數量:索引會增加寫操作(INSERT/UPDATE/DELETE)的開銷。建議單表索引不超過?5個,避免冗余索引。優先建聯合索引。查詢時調整SQL條件順序,使其與索引列的順序一致。

2.索引優化

分頁查詢優化

很多時候我們業務系統實現分頁功能可能會用如下sql實現

SELECT * FROM orders ORDER BY id LIMIT 10000, 10;

表示從表 orders 中取出從 10001 行開始的 10 行記錄。看似只查詢了 10 條記錄,實際這條 SQL 是先讀取 10010條記錄,然后拋棄前 10000 條記錄,然后讀到后面 10 條想要的數據。因此要查詢一張大表比較靠后的數據,執行效率是非常低的。

優化1:根據自增且連續的主鍵排序的分頁查詢

SELECT * FROM orders WHERE id > 100000 ORDER BY id LIMIT 10;

優化2:根據非主鍵字段排序的分頁查詢

SELECT * FROM orders ORDER BY name LIMIT 10000, 10;

關鍵是讓排序時返回的字段盡可能少,所以可以讓排序和分頁操作先查出主鍵,然后根據主鍵查到對應的記錄,SQL改寫如下:

select * from orders e inner join (select id from orders order by name limit 90000,5) ed
on e.id = ed.id;

Join關聯查詢優化

優化1:關聯字段加索引;

優化2:優先選擇小表做驅動表。

一次一行循環地從第一張表(稱為驅動表)中讀取行,在這行數據中取到關聯字段,根據關聯字段在另一張表(被驅動表)里取出滿足條件的行,然后取出兩張表的結果合集。

當使用left join時,左表是驅動表,右表是被驅動表,當使用right join時,右表時驅動表,左表是被驅動表,
當使用join時,mysql會選擇數據量比較小的表作為驅動表,大表作為被驅動表。

in和exsits優化

原則:小表驅動大表,即小的數據集驅動大的數據集

in:當B表的數據集小于A表的數據集時,in優于exists

select * from A where id in (select id from B)

exists:當A表的數據集小于B表的數據集時,exists優于in

將主查詢A的數據,放到子查詢B中做條件驗證,根據驗證結果(true或false)來決定主查詢的數據是否保留

select * from A where exists (select 1 from B where B.id = A.id)

3.最后

通過合理設計索引,可以顯著提升 MySQL 的查詢性能,同時減少系統資源的消耗。在實際應用中,建議根據具體場景靈活調整索引設計和查詢語句,以達到最佳的性能表現。

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

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

相關文章

基于STM32、HAL庫、HS12864(ST7920,并行接口)C語言程序設計

1、hs12864.h頭文件: #ifndef __HS12864_H #define __HS12864_H #ifdef __cplusplus extern "C" {#endif #include "stm32l4xx_hal.h" // 控制線定義 - 根據實際硬件修改 #define HS12864_RS_GPIO_PORT GPIOC #define HS12864_RS_PIN GPIO_PI…

【C語言】C語言 實踐課題選題系統(源碼+報告+數據文件)【獨一無二】

👉博__主👈:米碼收割機 👉技__能👈:C/Python語言 👉專__注👈:專注主流機器人、人工智能等相關領域的開發、測試技術。 系C語言 實踐課題選題系統(源碼報告數據…

基于SpringBoot的“高考志愿智能推薦系統”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“高考志愿智能推薦系統”的設計與實現(源碼數據庫文檔PPT) 開發語言:Java 數據庫:MySQL 技術:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系統展示 系統總體結構圖 系統首頁界面 系統注冊頁…

React 低代碼項目:組件設計

React 低代碼項目:組件設計 Date: February 6, 2025 React表單組件 **目標:**使用 Ant Design 表單組件,開發登錄、注冊、搜索功能 內容: 使用 React 表單組件、受控組件使用 Ant Design 表單組件使用 表單組件的校驗和錯誤提…

深入剖析 Vue 的響應式原理:構建高效 Web 應用的基石

深入剖析 Vue 的響應式原理:構建高效 Web 應用的基石 在前端開發的廣闊天地里,Vue.js 憑借其簡潔易用的特性和強大的功能,成為眾多開發者的心頭好。其中,響應式原理作為 Vue 的核心亮點之一,讓數據與視圖之間實現了高…

QCustomplot庫運用

最近需要用到這個庫顯示數據,需要在一個曲線圖4個Y軸共用一個X軸,并且做游標,跟隨鼠標移動,并且實時反饋數據到表格中。記錄一下程序。 customPlot new QCustomPlot(this); customPlot->setBackground(QBrush(QColor(204,204,…

STM32 串口 (DMA + 空閑中斷 + 環形緩沖區)

STM32 串口 (DMA 空閑中斷 環形緩沖區) 1. 基本概念 UART 空閑中斷(IDLE): 當串口 RX 線上 連續一段時間沒有數據接收,USART 外設觸發 空閑中斷。空閑中斷的主要作用是通知數據傳輸完成或當前幀結束。 D…

股指期貨是什么?股指期貨日內拐點有什么特征?

股指期貨是一種金融衍生品,股指期貨日內拐點就是在一天交易過程中,市場走勢發生顯著改變的那個點。 股指期貨是什么? 股指是一個指數,比如上證50指數、滬深300指數、中證500指數以及中證1000指數,這是一堆股票的一個整…

Opensearch/ElasticSearch-ctx查詢內容不全的問題

問題 在OpenSearch中,我希望在action中把一整條log作為報警內容發送出來,但是根據文檔,配置為ctx.results.0.hits.hits.0._source.log,但是發現根本找不到這個值 經過查詢,我發現在返回的ctx中僅存在如下的值 resul…

vue2和vue3插槽slot最通俗易懂的區別理解

在 Vue 的組件通信中,slot(插槽)的編譯優化是一個重要的性能提升點。以下是 Vue2 和 Vue3 在 slot 處理上的差異及優化原理,用更直觀的方式解釋: Vue2 的 Slot 更新機制 想象一個父子組件場景: 父組件&am…

【16屆藍橋杯寒假刷題營】第1期DAY4

1.披薩和西藍花 - 藍橋云課 1. 披薩和西藍花 問題描述 在接下來的 N 天里(編號從 1 到 N),坤坤計劃烹飪披薩或西蘭花。他寫下一個長度為 N 的字符串 A,對于每個有效的 i,如果字符 Ai 是 1,那么他將在第 i…

你需要了解的遠程登錄協議——Telnet

你需要了解的遠程登錄協議——Telnet 一. 什么是Telnet?二. Telnet的優缺點三. Telnet vs SSH:哪一個更適合?四. Telnet的應用場景 前言 點個免費的贊和關注,有錯誤的地方請指出,看個人主頁有驚喜。 作者:神…

本地部署【LLM-deepseek】大模型 ollama+deepseek/conda(python)+openwebui/docker+openwebui

通過ollama本地部署deepseek 總共兩步 1.模型部署 2.[web頁面] 參考官網 ollama:模型部署 https://ollama.com/ open-webui:web頁面 https://github.com/open-webui/open-webui 設備參考 Mac M 芯片 windows未知 蒸餾模型版本:deepseek-r1:14b 運行情況macminim2 24256 本地…

PHP在線題庫小程序

📚 在線題庫小程序:學習提分新神器,輕松躍升學霸行列 這是一款專為追夢學子精心策劃、基于ThinkPHPUniApp框架匠心打造的在線題庫類微信小程序系統。它宛如一把?智慧鑰匙?,為追求高效學習的你解鎖🔓知識寶庫的大門。…

Java開發中的連接池技術介紹

連接池技術是Java開發中用于管理數據庫連接的重要技術,尤其在SSM(Spring、Spring MVC、MyBatis)架構中,連接池能夠顯著提升數據庫操作的性能和資源利用率。下面我們將詳細介紹連接池技術解決的問題、配置方案以及代碼實現。 1. 連…

Unity-Mirror網絡框架-從入門到精通之Pong示例

文章目錄 前言示例介紹NetworkManagerPongBallPlayer總結前言 在現代游戲開發中,網絡功能日益成為提升游戲體驗的關鍵組成部分。本系列文章將為讀者提供對Mirror網絡框架的深入了解,涵蓋從基礎到高級的多個主題。Mirror是一個用于Unity的開源網絡框架,專為多人游戲開發設計…

布隆過濾器到底是什么東西?它有什么用

布隆過濾器:用概率換空間的奇妙數據結構 引言:當空間成為奢侈品 在互聯網每天產生2.5萬億字節數據的時代,Google每秒處理超過9萬次搜索請求,Redis緩存系統支撐著百萬級QPS的訪問。面對如此海量的數據處理需求,傳統的…

任務1 將單表中的單個rfid增加為多個rfid

方案 使用連表查詢解決 單獨創建一個rfid的表 讓tool_id對應多個rfid 需要優化的表 1:tool_materials_stock 庫存管理 已完成 數據遷移完成 原庫rfid字段未刪除 2:tool_borrow_return 借出借還管理 已完成 3:too…

OutSystems Platform Tools Platform Services

概述(Overview) outsystems是一整套低代碼的企業級應用(WEB 和 移動端)的開發環境。 本文主要講解outsystems的Platform Tools與Platform Services 平臺工具(Platform Tools) 集成開發環境IDE&#xff0…

【深度解析】ETERM指令:離港系統的核心技術

在民航離港系統中,ETERM(中航信終端模擬系統)是廣泛使用的指令操作系統,主要用于航班控制、旅客值機、登機等操作。以下是一些核心的ETERM指令及其功能分類: 1. 航班信息查詢與操作 FLR:顯示航班列表&…