MySQL覆蓋索引與大分頁詳解

核心知識點
覆蓋索引概念
查詢使用了索引,且返回的列在該索引中能全部找到。
例如,對于主鍵索引(聚集索引),能一次性獲取整行記錄;對于普通索引,若返回列包含在該索引及主鍵值中,也算覆蓋索引,否則可能需要回表查詢。

覆蓋索引判斷方法
根據(jù)查詢條件所走的索引類型(聚集索引或二級索引),判斷返回列是否都在該索引中。如根據(jù)id查詢走聚集索引,返回所有列是覆蓋索引;根據(jù)name查詢走二級索引,若返回列只有id和name則是覆蓋索引,若包含未在該二級索引中的列(如gender)則不是覆蓋索引。
覆蓋索引性能優(yōu)勢
一次性查詢出所有數(shù)據(jù),相比回表查詢性能更高,所以在開發(fā)中應(yīng)盡量避免使用“select *”,防止因返回列未創(chuàng)建索引而觸發(fā)回表查詢。

覆蓋索引在MySQL超大分頁問題中的應(yīng)用

超大分頁問題
當(dāng)表數(shù)據(jù)量很大時,使用limit進行分頁,越往后分頁效率越低。如查詢“limit 9000000, 10”,MySQL會排序前9000010條記錄,但僅取十條,900多萬條記錄的排序代價高導(dǎo)致性能低。
解決方法
使用覆蓋索引加子查詢優(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會排序大量記錄但僅取少量,導(dǎo)致性能低。
- 解決方案說明:用覆蓋索引加子查詢優(yōu)化,先分頁查詢按id排序獲取id集合,再用id集合關(guān)聯(lián)原表查詢提升效率。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL安裝與創(chuàng)建用戶操作(新手入門指南)
這篇文章主要為大家介紹了MySQL安裝與創(chuàng)建用戶的使用講解是非常適合小白新手的入門學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
MySQL 5.6 解壓縮版安裝配置方法圖文教程(win10)
這篇文章主要為大家詳細介紹了MySQL for Windows 解壓縮版安裝配置的相關(guān)資料,需要的朋友可以參考下2016-07-07
淺談mysql 系統(tǒng)用戶最大文件打開數(shù)限制
這篇文章主要介紹了mysql 系統(tǒng)用戶最大文件打開數(shù)限制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

