MySQL索引優化之分頁探索詳細介紹

​​MySQL​​索引優化之分頁探索

表結構

CREATE TABLE `demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '年齡',
  `position` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '職位',
  `card_num` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '工卡號',
  PRIMARY KEY (`id`),
  KEY `index_union` (`name`,`age`,`position`)
) ENGINE=InnoDB AUTO_INCREMENT=450003 DEFAULT CHARSET=utf8;

450003條數據

limit分頁執行情況

MySQL索引優化之分頁探索_子節點

像select * from demo limit 90000,10;考慮到回表,所以mysql幹脆選擇全表掃描。

mysql不是直接從第90000行開始計算10條,而是從第一個葉子節點開始計數,計算90010行。

案例一

MySQL索引優化之分頁探索_分頁_02

針對上圖,當id是連續自增的時候,可以用主鍵篩選出id=90000之後的數據。因為主鍵的索引是B+樹結構,本身就是有序的。

MySQL索引優化之分頁探索_數據_03

案例二

MySQL索引優化之分頁探索_數據_04

先按照name排序,然後再從第90000行起找10行,雖然name是索引,但select的列在index_union索引樹上並沒有保存。

所以還會涉及到回表,於是mysql直接選擇掃主鍵索引樹的葉子結點,先將40多萬數據根據name排好序,然後計算90000行+10行。

優化方法:利用子查詢解決最消耗時間的排序和回表問題,聯合索引樹種保存有主鍵id,order by name的話可以將name、age、position整個索引充分使用因為確定瞭最左列的排序,其餘的倆列age、和position其實也是

排好序的瞭,通過Extra字段也可以是使用瞭索引樹做排序。

最外層的查詢是根據主鍵來關聯的,所以幾乎可以忽略。10+10 因為id是主鍵,可以直接拿臨時表10條數據去掃。

MySQL索引優化之分頁探索_分頁_05

到此這篇關於MySQL索引優化之分頁探索詳細介紹的文章就介紹到這瞭,更多相關MySQL分頁探索內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: