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

2022-09-21 00:33:12 字數 1251 閱讀 1776

目錄

表結構create table `demo` (

`id` int(11) not null auto_increment,

`name` varchar(50) character set utf8mb4 collate utf8mb4_090www.cppcns.com0_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(255oympqcib) character set utf8 collate utf8_general_ci default nuoympqcibll comment '工卡號',

primary key (`id`),

key `index_union` (`name`,`age`,`position`)

) engine=innodb auto_increment=450003 default charset=utf8;

450003條資料

limit分頁執**況

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

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

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

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

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

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

排好序的了,通過extra欄位也可以是使用了索引樹做排序。

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

MySQL 之分頁查詢

rows 記錄數 offset 偏移量 select from table limit offset,rows select from table limit rows offset offsetlimit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。...

mysql 索引探索

本文將從作用 引擎 分類 使用等方面來介紹 mysql 的索引。索引的建立是為了提高資料的訪問速度。生活中索引的例子有字典,字典的索引就是它的目錄,通過拼音或者筆畫我們可以在目錄中找到這個字以及它的頁碼,進而可以檢視這個字的具體解釋說明。資料庫引擎是提供了對資料的增加 刪除 修改 查詢和儲存的實現,...

mysql的分頁優化 mysql分頁優化

有個200多萬的使用者表,顯示列表時非常慢,查了一下原來使用了limit進行分頁。前幾頁用時很少 但是後面頁數就簡直不可忍了,實際的業務邏輯還有排序,就更慢了 試試用查詢時用帶索引的鍵來確定範圍。最大的id是103948598 時間和用limit比相差幾千倍啊!使用explain 檢視一下 mysq...