MySQL是目前非常流行的關系型數據庫管理系統,廣泛應用于各種應用場景,如電商、金融、游戲等。在使用MySQL時,回表查詢是一種常見的場景。
回表查詢指的是當我們查詢一條記錄時,MySQL首先會在聚集索引上查找,然后根據聚集索引中的非聚集索引的指針找到對應的數據行,這個過程就稱為回表查詢。
對于回表查詢,雖然在單次查詢時對性能的影響不大,但是在大數據量下,它的性能優化是非常重要的,下面我們通過代碼演示,來看一下回表查詢的相關情況。
-- 創建測試表 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `age` int(11) DEFAULT NULL, `score` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name_index` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; -- 插入測試數據 INSERT INTO `student` (`name`, `age`, `score`) VALUES ('小明', 20, 90), ('小紅', 21, 93), ('小李', 23, 95);
我們首先使用explain語句來查看回表查詢的執行情況:
EXPLAIN SELECT `id`, `name`, `age`, `score` FROM `student` WHERE `name` = '小明';
執行結果如下:
+----+-------------+---------+------------+------+---------------+------+---------+-------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+------+---------------+------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | student | NULL | ref | name_index | name | 153 | const | 1 | 100.00 | Using index | +----+-------------+---------+------------+------+---------------+------+---------+-------+------+----------+-------------+
從結果可以看出,查詢使用了非聚集索引,沒有使用聚集索引,同時Extra列中顯示了使用了“Using index”。
如果我們希望在回表查詢時能夠同時命中聚集索引和非聚集索引,我們需要創建覆蓋索引,它的定義如下:
ALTER TABLE `student` ADD INDEX `cover_index` (`name`, `age`, `score`) USING BTREE;
然后,我們再次使用explain語句來查看查詢執行情況:
EXPLAIN SELECT `id`, `name`, `age`, `score` FROM `student` WHERE `name` = '小明';
執行結果如下:
+----+-------------+---------+------------+-------+---------------+--------------+---------+------+------+----------+--------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+-------+---------------+--------------+---------+------+------+----------+--------------------------+ | 1 | SIMPLE | student | NULL | index | cover_index | cover_index | 158 | NULL | 1 | 100.00 | Using where; Using index | +----+-------------+---------+------------+-------+---------------+--------------+---------+------+------+----------+--------------------------+
從結果可以看出,查詢使用了索引,同時使用了“Using where”和“Using index”。
綜上,回表查詢是MySQL常見的查詢場景之一,需要根據具體情況進行性能優化,避免潛在的性能瓶頸。