婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > mysql查詢時offset過大影響性能的原因和優化詳解

mysql查詢時offset過大影響性能的原因和優化詳解

熱門標簽:深圳 遵義地圖標注app 外呼系統從哪買 德惠市地圖標注 商家地圖標注哪個好 陜西400電話如何申請 承德電腦地圖標注 地圖標注賺錢真假 合肥營銷外呼系統收費

前言

mysql查詢使用select命令,配合limit,offset參數可以讀取指定范圍的記錄。本文將介紹mysql查詢時,offset過大影響性能的原因及優化方法。

準備測試數據表及數據

1.創建表

CREATE TABLE `member` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL COMMENT '姓名',
 `gender` tinyint(3) unsigned NOT NULL COMMENT '性別',
 PRIMARY KEY (`id`),
 KEY `gender` (`gender`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.插入1000000條記錄

?php
$pdo = new PDO("mysql:host=localhost;dbname=user","root",'');

for($i=0; $i1000000; $i++){
 $name = substr(md5(time().mt_rand(000,999)),0,10);
 $gender = mt_rand(1,2);
 $sqlstr = "insert into member(name,gender) values('".$name."','".$gender."')";
 $stmt = $pdo->prepare($sqlstr);
 $stmt->execute();
}
?>

mysql> select count(*) from member;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.23 sec)

3.當前數據庫版本

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.24 |
+-----------+
1 row in set (0.01 sec)

分析offset過大影響性能的原因

1.offset較小的情況

mysql> select * from member where gender=1 limit 10,1;
+----+------------+--------+
| id | name  | gender |
+----+------------+--------+
| 26 | 509e279687 |  1 |
+----+------------+--------+
1 row in set (0.00 sec)

mysql> select * from member where gender=1 limit 100,1;
+-----+------------+--------+
| id | name  | gender |
+-----+------------+--------+
| 211 | 07c4cbca3a |  1 |
+-----+------------+--------+
1 row in set (0.00 sec)

mysql> select * from member where gender=1 limit 1000,1;
+------+------------+--------+
| id | name  | gender |
+------+------------+--------+
| 1975 | e95b8b6ca1 |  1 |
+------+------------+--------+
1 row in set (0.00 sec)

當offset較小時,查詢速度很快,效率較高。 

2.offset較大的情況

mysql> select * from member where gender=1 limit 100000,1;
+--------+------------+--------+
| id  | name  | gender |
+--------+------------+--------+
| 199798 | 540db8c5bc |  1 |
+--------+------------+--------+
1 row in set (0.12 sec)

mysql> select * from member where gender=1 limit 200000,1;
+--------+------------+--------+
| id  | name  | gender |
+--------+------------+--------+
| 399649 | 0b21fec4c6 |  1 |
+--------+------------+--------+
1 row in set (0.23 sec)

mysql> select * from member where gender=1 limit 300000,1;
+--------+------------+--------+
| id  | name  | gender |
+--------+------------+--------+
| 599465 | f48375bdb8 |  1 |
+--------+------------+--------+
1 row in set (0.31 sec)

當offset很大時,會出現效率問題,隨著offset的增大,執行效率下降。 

分析影響性能原因

select * from member where gender=1 limit 300000,1;

因為數據表是InnoDB,根據InnoDB索引的結構,查詢過程為:

  • 通過二級索引查到主鍵值(找出所有gender=1的id)。
  • 再根據查到的主鍵值通過主鍵索引找到相應的數據塊(根據id找出對應的數據塊內容)。
  • 根據offset的值,查詢300001次主鍵索引的數據,最后將之前的300000條丟棄,取出最后1條。

不過既然二級索引已經找到主鍵值,為什么還需要先用主鍵索引找到數據塊,再根據offset的值做偏移處理呢?

如果在找到主鍵索引后,先執行offset偏移處理,跳過300000條,再通過第300001條記錄的主鍵索引去讀取數據塊,這樣就能提高效率了。

如果我們只查詢出主鍵,看看有什么不同

mysql> select id from member where gender=1 limit 300000,1;
+--------+
| id  |
+--------+
| 599465 |
+--------+
1 row in set (0.09 sec)

很明顯,如果只查詢主鍵,執行效率對比查詢全部字段,有很大的提升。  

推測

只查詢主鍵的情況

因為二級索引已經找到主鍵值,而查詢只需要讀取主鍵,因此mysql會先執行offset偏移操作,再根據后面的主鍵索引讀取數據塊。

需要查詢所有字段的情況

因為二級索引只找到主鍵值,但其他字段的值需要讀取數據塊才能獲取。因此mysql會先讀出數據塊內容,再執行offset偏移操作,最后丟棄前面需要跳過的數據,返回后面的數據。 

證實

InnoDB中有buffer pool,存放最近訪問過的數據頁,包括數據頁和索引頁。

為了測試,先把mysql重啟,重啟后查看buffer pool的內容。

mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('primary','gender') and TABLE_NAME like '%member%' group by index_name;
Empty set (0.04 sec)

可以看到,重啟后,沒有訪問過任何的數據頁。

查詢所有字段,再查看buffer pool的內容

mysql> select * from member where gender=1 limit 300000,1;
+--------+------------+--------+
| id  | name  | gender |
+--------+------------+--------+
| 599465 | f48375bdb8 |  1 |
+--------+------------+--------+
1 row in set (0.38 sec)

mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('primary','gender') and TABLE_NAME like '%member%' group by index_name;
+------------+----------+
| index_name | count(*) |
+------------+----------+
| gender  |  261 |
| PRIMARY |  1385 |
+------------+----------+
2 rows in set (0.06 sec)

可以看出,此時buffer pool中關于member表有1385個數據頁,261個索引頁。 

重啟mysql清空buffer pool,繼續測試只查詢主鍵

mysql> select id from member where gender=1 limit 300000,1;
+--------+
| id  |
+--------+
| 599465 |
+--------+
1 row in set (0.08 sec)

mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('primary','gender') and TABLE_NAME like '%member%' group by index_name;
+------------+----------+
| index_name | count(*) |
+------------+----------+
| gender  |  263 |
| PRIMARY |  13 |
+------------+----------+
2 rows in set (0.04 sec)

可以看出,此時buffer pool中關于member表只有13個數據頁,263個索引頁。因此減少了多次通過主鍵索引訪問數據塊的I/O操作,提高執行效率。

因此可以證實,mysql查詢時,offset過大影響性能的原因是多次通過主鍵索引訪問數據塊的I/O操作。(注意,只有InnoDB有這個問題,而MYISAM索引結構與InnoDB不同,二級索引都是直接指向數據塊的,因此沒有此問題 )。 

InnoDB與MyISAM引擎索引結構對比圖

這里寫圖片描述

優化方法

根據上面的分析,我們知道查詢所有字段會導致主鍵索引多次訪問數據塊造成的I/O操作。

因此我們先查出偏移后的主鍵,再根據主鍵索引查詢數據塊的所有內容即可優化。

mysql> select a.* from member as a inner join (select id from member where gender=1 limit 300000,1) as b on a.id=b.id;
+--------+------------+--------+
| id  | name  | gender |
+--------+------------+--------+
| 599465 | f48375bdb8 |  1 |
+--------+------------+--------+
1 row in set (0.08 sec)

附:MYSQL limit,offset 區別

SELECT
  keyword
FROM
  keyword_rank
WHERE
  advertiserid='59'
order by
  keyword
LIMIT 2 OFFSET 1;

比如這個SQL ,limit后面跟的是2條數據,offset后面是從第1條開始讀取

SELECT
  keyword
FROM
  keyword_rank
WHERE
  advertiserid='59'
ORDER BY
  keyword
LIMIT 2 ,1;

而這個SQL,limit后面是從第2條開始讀,讀取1條信息。

這兩個千萬別搞混哦。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • MySQL性能優化之如何高效正確的使用索引
  • MySQL數據庫查詢性能優化策略
  • Mysql高性能優化技能總結
  • MySQL性能優化神器Explain的基本使用分析
  • 通過MySQL慢查詢優化MySQL性能的方法講解
  • MySQL Limit性能優化及分頁數據性能優化詳解
  • MySQL中聚合函數count的使用和性能優化技巧
  • mysql千萬級數據分頁查詢性能優化
  • MYSQL開發性能研究之批量插入數據的優化方法
  • MySQL性能優化技巧分享

標簽:貴州 南陽 贛州 巴中 新余 商丘 揚州 三門峽

巨人網絡通訊聲明:本文標題《mysql查詢時offset過大影響性能的原因和優化詳解》,本文關鍵詞  mysql,查詢,時,offset,過大,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《mysql查詢時offset過大影響性能的原因和優化詳解》相關的同類信息!
  • 本頁收集關于mysql查詢時offset過大影響性能的原因和優化詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    椎名由奈av一区二区三区| 开心九九激情九九欧美日韩精美视频电影| 91啪亚洲精品| 成人av网在线| 成人免费看的视频| 国产精品一区二区久久精品爱涩 | 欧美一级一级性生活免费录像| 成人国产在线观看| 欧美图区在线视频| 欧洲一区二区三区在线| 欧美日韩久久久一区| 久久综合九色综合久久久精品综合| 欧美日韩午夜精品| 久久先锋影音av鲁色资源网| 国产三级精品三级| 欧美国产激情二区三区| 亚洲欧美成人一区二区三区| 亚洲一区二区三区四区在线| 激情久久五月天| 91免费国产在线| 欧美精品一区二区三区蜜臀| 亚洲国产精品高清| 国产中文一区二区三区| 91久久人澡人人添人人爽欧美| 日韩精品专区在线| 亚洲国产日日夜夜| 成人av资源在线观看| 51精品秘密在线观看| 亚洲免费高清视频在线| 国产一区二区三区日韩| 在线一区二区三区四区五区| 一区二区不卡在线播放 | 欧美精品vⅰdeose4hd| 亚洲视频免费在线| a在线欧美一区| 久久久久久久久久久久电影| 婷婷久久综合九色国产成人| 成人免费看片app下载| 国产欧美综合色| 91免费视频网址| 亚洲男人的天堂网| 91美女片黄在线观看| 中文字幕在线播放不卡一区| 国产精品99久久久久久似苏梦涵| 欧美精品v日韩精品v韩国精品v| 夜夜操天天操亚洲| 日韩欧美一级精品久久| 日本不卡高清视频| 久久久久国产免费免费| 成人免费观看视频| 亚洲国产精品天堂| 精品国产一区二区三区不卡| 人人精品人人爱| 久久久天堂av| 欧美色成人综合| 国产另类ts人妖一区二区| 国产精品九色蝌蚪自拍| 成人欧美一区二区三区在线播放| 欧美在线观看视频一区二区三区| 精品成人一区二区| 国产亚洲成年网址在线观看| 国产精品视频在线看| 奇米综合一区二区三区精品视频| 日韩电影免费在线观看网站| 99久精品国产| 乱中年女人伦av一区二区| 一区在线观看视频| 精品国产髙清在线看国产毛片 | 色综合久久综合网欧美综合网| 亚洲大片精品永久免费| 中文字幕色av一区二区三区| 欧美日韩另类国产亚洲欧美一级| 美国毛片一区二区三区| 日韩久久免费av| 欧美午夜一区二区| 欧亚洲嫩模精品一区三区| 成人av免费观看| 色噜噜狠狠一区二区三区果冻| 国产黄色91视频| 成人性生交大片免费看在线播放| 久久国产精品99久久人人澡| 久久99蜜桃精品| 国产成人在线视频播放| 国产成人超碰人人澡人人澡| 波多野结衣亚洲一区| 色先锋aa成人| 久久色.com| 亚洲男同性恋视频| 美女免费视频一区二区| 国产主播一区二区| 91免费观看视频在线| 欧美亚洲一区二区三区四区| 欧美日韩国产欧美日美国产精品| 欧美日韩欧美一区二区| 日韩一区二区三区三四区视频在线观看| 精品精品欲导航| 亚洲综合一二三区| 国产一区福利在线| 色久优优欧美色久优优| 欧美另类高清zo欧美| 国产三级欧美三级| 亚洲成人免费看| 91视频一区二区| 久久免费视频一区| 精品一区二区三区久久| 在线免费观看一区| 亚洲精品老司机| 大白屁股一区二区视频| 精品少妇一区二区三区在线视频| 18成人在线观看| 99国内精品久久| 国产精品黄色在线观看| 国产成人三级在线观看| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 91视频xxxx| 亚洲综合一区二区三区| 色久优优欧美色久优优| 五月婷婷综合激情| 日韩女优av电影| 国产一区二区三区观看| 国产婷婷色一区二区三区| av在线不卡免费看| 夜夜精品浪潮av一区二区三区| 欧美在线视频不卡| 久久av资源站| 亚洲欧美乱综合| 制服丝袜av成人在线看| 国产一区二区三区不卡在线观看| 久久亚洲精品国产精品紫薇| eeuss鲁片一区二区三区在线观看| 亚洲欧洲精品一区二区精品久久久| 色婷婷亚洲精品| 久久精品噜噜噜成人av农村| 中文字幕精品一区| 欧美一区二区久久| 日本精品免费观看高清观看| 蜜臀av一区二区| 亚洲精品乱码久久久久久久久| 337p亚洲精品色噜噜狠狠| 粉嫩绯色av一区二区在线观看| 亚洲精品伦理在线| 亚洲天堂av老司机| 欧美激情综合在线| 欧美一级艳片视频免费观看| 在线视频你懂得一区| av一区二区久久| 成人免费毛片嘿嘿连载视频| 国产伦理精品不卡| 另类小说一区二区三区| 青青草国产成人av片免费| 亚洲国产精品久久一线不卡| 国产精品三级视频| 一色屋精品亚洲香蕉网站| 中文字幕乱码亚洲精品一区| 久久久www成人免费无遮挡大片| 91精品国产综合久久婷婷香蕉| 色狠狠一区二区三区香蕉| 大胆欧美人体老妇| 一本到高清视频免费精品| 色综合久久天天综合网| 欧美亚洲国产一区二区三区va| 欧美手机在线视频| 日韩精品在线网站| 中文字幕成人av| 欧美大片在线观看| 国产在线观看一区二区| 综合欧美亚洲日本| 欧美精品一区在线观看| 国产成+人+日韩+欧美+亚洲| 亚洲欧洲精品天堂一级 | 国产视频视频一区| 亚洲日韩欧美一区二区在线| 亚洲一区二区三区在线| 九九**精品视频免费播放| 精品亚洲porn| 欧美午夜精品久久久久久超碰| 91精品免费在线观看| 成人免费在线视频观看| 午夜精品福利一区二区三区蜜桃| 福利电影一区二区三区| 欧美男生操女生| 无吗不卡中文字幕| 国产福利一区在线| 欧美视频一区二区三区四区| 久久精品视频网| 国产福利精品导航| 日韩欧美123| 久久精品国产一区二区| 在线播放视频一区| 亚洲mv在线观看| 91精品国产麻豆| 精品中文字幕一区二区| 欧美成人bangbros| 精品一区二区国语对白| 久久久久久一级片| 99精品偷自拍| 日韩电影免费在线看| 日韩精品最新网址| 97se狠狠狠综合亚洲狠狠| 一区二区在线观看视频|