MySQL回表查詢的實(shí)現(xiàn)示例
回表查詢是 MySQL 數(shù)據(jù)庫(kù)中一種常見(jiàn)的查詢操作,主要出現(xiàn)在使用索引進(jìn)行查詢的場(chǎng)景中。以下是具體介紹:
- 概念:當(dāng)查詢語(yǔ)句所需要的數(shù)據(jù)不能僅通過(guò)索引來(lái)獲取,還需要從數(shù)據(jù)表中獲取更多列的數(shù)據(jù)時(shí),就會(huì)發(fā)生回表查詢。MySQL 先通過(guò)索引找到滿足條件的記錄的主鍵值,然后再根據(jù)主鍵值回到數(shù)據(jù)表中查找其他列的數(shù)據(jù)。
- 舉例:假設(shè)有一個(gè)
students表,包含id、name、age和score等列,并且在name列上建立了索引。當(dāng)執(zhí)行查詢語(yǔ)句SELECT id, age FROM students WHERE name = 'John'時(shí),MySQL 會(huì)先在name索引中查找name為John的記錄對(duì)應(yīng)的id值,這是通過(guò)索引快速定位的過(guò)程。然后,由于查詢結(jié)果還需要age列的數(shù)據(jù),而age列不在name索引中,所以 MySQL 會(huì)根據(jù)找到的id值回到students表中查找對(duì)應(yīng)的age值,這個(gè)從表中獲取額外數(shù)據(jù)的過(guò)程就是回表查詢。 - 性能影響:一般來(lái)說(shuō),回表查詢的性能相對(duì)復(fù)雜一些。如果索引覆蓋了查詢所需的所有列,那么查詢可以直接在索引中完成,速度會(huì)很快。但當(dāng)需要回表時(shí),就需要額外的 I/O 操作來(lái)訪問(wèn)數(shù)據(jù)表,這可能會(huì)增加查詢的時(shí)間。不過(guò),如果索引設(shè)計(jì)合理,回表查詢的次數(shù)相對(duì)較少,對(duì)性能的影響通常是可以接受的。優(yōu)化回表查詢的方法包括合理設(shè)計(jì)索引,盡量讓索引覆蓋更多的查詢列,減少不必要的回表操作。
1. 創(chuàng)建表結(jié)構(gòu)并添加索引
-- 創(chuàng)建 students 表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
score DECIMAL(5, 2),
gender CHAR(1),
class VARCHAR(20)
);
-- 在 name 列上創(chuàng)建索引
CREATE INDEX idx_name ON students(name);這里創(chuàng)建了一個(gè) students 表,包含 id、name、age、score、gender 和 class 等列,并在 name 列上建立了索引。
2. 插入示例數(shù)據(jù)
-- 插入示例數(shù)據(jù)
INSERT INTO students (name, age, score, gender, class)
VALUES
('John', 18, 85.5, 'M', 'Class A'),
('Alice', 17, 90.0, 'F', 'Class B'),
('John', 19, 78.2, 'M', 'Class C'),
('Bob', 18, 88.8, 'M', 'Class A');插入了一些學(xué)生信息,其中有兩個(gè)名為 John 的學(xué)生。
3. 執(zhí)行回表查詢
-- 執(zhí)行回表查詢 SELECT id, age, score FROM students WHERE name = 'John';
查詢過(guò)程分析
- 索引查找:MySQL 首先使用 idx_name 索引,在該索引中查找 name 為 John 的記錄。由于索引中存儲(chǔ)了 name 列的值以及對(duì)應(yīng)的 id(索引關(guān)聯(lián)主鍵),所以能快速定位到兩條 name 為 John 的記錄的 id。
- 回表操作:查詢需要 age 和 score 列的數(shù)據(jù),而這兩列不在 idx_name 索引中。因此,MySQL 會(huì)根據(jù)之前從索引中獲取的 id 值,回到 students 表中查找對(duì)應(yīng)的 age 和 score 值,這就是回表查詢過(guò)程。
4. 性能影響分析
- 性能問(wèn)題:如果 students 表的數(shù)據(jù)量非常大,且有很多 name 為 John 的記錄,那么回表操作會(huì)變得頻繁。每次回表都需要進(jìn)行磁盤(pán) I/O 操作,而磁盤(pán) I/O 相對(duì)較慢,會(huì)顯著增加查詢時(shí)間。
- 可接受情況:若表中 name 為 John 的記錄較少,或者索引設(shè)計(jì)合理使得回表次數(shù)有限,那么對(duì)性能的影響通常是可以接受的。
5. 優(yōu)化方案
為了減少回表查詢,可以創(chuàng)建覆蓋索引。
-- 創(chuàng)建覆蓋索引 CREATE INDEX idx_name_age_score ON students(name, age, score);
再次執(zhí)行查詢:
SELECT id, age, score FROM students WHERE name = 'John';
此時(shí),由于 idx_name_age_score 索引包含了查詢所需的 name、age 和 score 列,MySQL 可以直接從該索引中獲取所需數(shù)據(jù),無(wú)需回表查詢,從而提高查詢性能。
到此這篇關(guān)于MySQL回表查詢的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySQL 回表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql語(yǔ)法時(shí)采用了雙引號(hào)““的錯(cuò)誤問(wèn)題
錯(cuò)誤原因:使用雙引號(hào)定義表名和列名導(dǎo)致MySQL報(bào)錯(cuò),應(yīng)使用反引號(hào),修改方案:將雙引號(hào)改為反引號(hào),避免語(yǔ)法沖突,總結(jié):在MySQL中,正確使用反引號(hào)引用標(biāo)識(shí)符,確保SQL語(yǔ)句符合MySQL語(yǔ)法規(guī)則2024-10-10
如何在SQL Server中實(shí)現(xiàn) Limit m,n 的功能
本篇文章是對(duì)在SQL Server中實(shí)現(xiàn) Limit m,n功能的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
MySQL中對(duì)表連接查詢的簡(jiǎn)單優(yōu)化教程
這篇文章主要介紹了MySQL中對(duì)表連接查詢的簡(jiǎn)單優(yōu)化教程,表連接查詢是MySQL最常用到的基本操作之一,因而其的優(yōu)化也非常值得注意,需要的朋友可以參考下2015-12-12
MySQL數(shù)據(jù)庫(kù)遠(yuǎn)程連接很慢的解決方案
本文給大家分享的是MySQL數(shù)據(jù)庫(kù)遠(yuǎn)程連接很慢的解決方法,簡(jiǎn)單的說(shuō)就是開(kāi)啟skip-name-resolve,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2016-12-12
mysql存儲(chǔ)過(guò)程之錯(cuò)誤處理實(shí)例詳解
這篇文章主要介紹了mysql存儲(chǔ)過(guò)程之錯(cuò)誤處理,結(jié)合實(shí)例形式詳細(xì)分析了mysql存儲(chǔ)過(guò)程錯(cuò)誤處理相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-12-12
選擇MySQL數(shù)據(jù)庫(kù)進(jìn)行連接的簡(jiǎn)單示例
這篇文章主要介紹了選擇MySQL數(shù)據(jù)庫(kù)進(jìn)行連接的簡(jiǎn)單示例,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05
MySQL定時(shí)備份數(shù)據(jù)庫(kù)(全庫(kù)備份)的實(shí)現(xiàn)
本文主要介紹了MySQL定時(shí)備份數(shù)據(jù)庫(kù)(全庫(kù)備份)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

