MySQL覆蓋索引與大分頁詳解
核心知識點
覆蓋索引概念
查詢使用了索引,且返回的列在該索引中能全部找到。
例如,對于主鍵索引(聚集索引),能一次性獲取整行記錄;對于普通索引,若返回列包含在該索引及主鍵值中,也算覆蓋索引,否則可能需要回表查詢。
覆蓋索引判斷方法
根據(jù)查詢條件所走的索引類型(聚集索引或二級索引),判斷返回列是否都在該索引中。如根據(jù)id查詢走聚集索引,返回所有列是覆蓋索引;根據(jù)name查詢走二級索引,若返回列只有id和name則是覆蓋索引,若包含未在該二級索引中的列(如gender)則不是覆蓋索引。
覆蓋索引性能優(yōu)勢
一次性查詢出所有數(shù)據(jù),相比回表查詢性能更高,所以在開發(fā)中應盡量避免使用“select *”,防止因返回列未創(chuàng)建索引而觸發(fā)回表查詢。
覆蓋索引在MySQL超大分頁問題中的應用
超大分頁問題
當表數(shù)據(jù)量很大時,使用limit進行分頁,越往后分頁效率越低。如查詢“limit 9000000, 10”,MySQL會排序前9000010條記錄,但僅取十條,900多萬條記錄的排序代價高導致性能低。
解決方法
使用覆蓋索引加子查詢優(yōu)化。先通過覆蓋索引分頁查詢獲取表中按id排序后的分頁id集合(操作id效率高,因id是覆蓋索引),再通過該id集合到原表做關(guān)聯(lián)查詢提升效率。
面試回答思路
- 覆蓋索引定義解釋:覆蓋索引指查詢使用索引且返回列都在索引中能找到,如根據(jù)id查詢走聚集索引可一次獲取所有數(shù)據(jù)。
- 開發(fā)中的注意事項:避免使用“select *”,防止因返回列未建索引觸發(fā)回表查詢影響性能。
- 超大分頁問題闡述:說明表數(shù)據(jù)量大時用limit分頁,越往后效率越低,如“limit 9000000, 10”的查詢,MySQL會排序大量記錄但僅取少量,導致性能低。
- 解決方案說明:用覆蓋索引加子查詢優(yōu)化,先分頁查詢按id排序獲取id集合,再用id集合關(guān)聯(lián)原表查詢提升效率。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql條件查詢and or使用方法及優(yōu)先級實例分析
這篇文章主要介紹了mysql條件查詢and or使用方法及優(yōu)先級,結(jié)合實例形式分析了mysql條件查詢and or基本功能、用法及優(yōu)先級相關(guān)操作技巧,需要的朋友可以參考下2020-04-04MySQL主從數(shù)據(jù)庫搭建的實現(xiàn)
本文主要介紹了MySQL8.0主從復制搭建步驟,包括配置文件修改、復制用戶權(quán)限設置、主庫狀態(tài)查詢、SSL證書生成及數(shù)據(jù)同步,具有一定的參考價值,感興趣的可以了解一下2025-06-06