婷婷综合国产,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
    日韩1区2区3区| 欧美日韩电影一区| 成人在线视频一区二区| 欧美日韩一区二区三区视频| 久久奇米777| 美女久久久精品| 99久久精品免费看国产| 久久久精品tv| 国产一区二区影院| 精品免费日韩av| 日韩在线播放一区二区| 欧美日韩不卡在线| 五月激情丁香一区二区三区| 欧美综合天天夜夜久久| 精品国产99国产精品| 激情综合五月天| 亚洲精品一区二区三区香蕉| 精品一区二区三区免费视频| 欧美第一区第二区| 久久99精品国产麻豆不卡| 日韩欧美中文字幕精品| 久久99精品久久只有精品| 日韩精品一区二区三区在线| 经典一区二区三区| 国产三级一区二区| 成人小视频在线| 中文字幕一区二区三区精华液| 国产麻豆视频一区| 国产精品日产欧美久久久久| 成人av在线资源| 一区二区三区在线免费视频| 欧美日韩综合一区| 美女视频黄频大全不卡视频在线播放| xnxx国产精品| 99精品视频在线观看| 亚洲一区二区av电影| 日韩一区二区免费高清| 五月婷婷色综合| 久久精品国产99久久6| 欧美va亚洲va国产综合| 国产精品白丝av| 亚洲人成精品久久久久| 欧美喷水一区二区| 国产一区二区在线看| 1区2区3区国产精品| 欧美日韩一区二区在线观看| 捆绑调教一区二区三区| 欧美经典一区二区| 精品污污网站免费看| 国内精品国产三级国产a久久| 国产精品美女久久久久久| 欧美视频在线观看一区| 国产一区二区在线观看免费| 一区二区三区鲁丝不卡| 日韩免费高清电影| 一本久久a久久精品亚洲 | 免费的国产精品| 国产日韩欧美a| 欧美私人免费视频| 国产不卡视频在线播放| 婷婷中文字幕一区三区| 国产精品女人毛片| 欧美成人一区二区三区| 在线视频中文字幕一区二区| 国产麻豆成人精品| 日韩精品福利网| 国产精品传媒入口麻豆| 欧美一区二区三区爱爱| 91视频国产观看| 久久成人免费网| 亚洲乱码国产乱码精品精小说| 26uuu国产日韩综合| 91精品欧美福利在线观看| www.欧美色图| 国产精品一卡二卡在线观看| 综合欧美一区二区三区| 日本视频在线一区| 亚洲国产精品一区二区久久恐怖片 | 国内外成人在线| 亚洲综合丁香婷婷六月香| 国产人久久人人人人爽| 欧美一卡2卡三卡4卡5免费| 色激情天天射综合网| 国产福利不卡视频| 另类小说视频一区二区| 亚洲午夜私人影院| 亚洲免费观看高清完整| 国产日韩v精品一区二区| 欧美成人猛片aaaaaaa| 欧美日韩在线三区| 在线看国产一区二区| 99久久伊人精品| 国产福利一区二区| 色综合天天综合网国产成人综合天| 国产麻豆日韩欧美久久| 韩国午夜理伦三级不卡影院| 首页亚洲欧美制服丝腿| 亚洲精品久久嫩草网站秘色| 国产精品久久久久国产精品日日 | 国产精品久久久久久久久搜平片| 日韩欧美国产一二三区| 欧美日本一区二区三区四区| 色婷婷久久99综合精品jk白丝| 大桥未久av一区二区三区中文| 国产一区二区三区美女| 久久99精品国产麻豆不卡| 久久爱另类一区二区小说| 日本不卡视频在线观看| 亚洲123区在线观看| 一区二区三区四区在线免费观看| 欧美videos大乳护士334| 日韩女优电影在线观看| 日韩视频免费观看高清完整版| 欧美午夜精品电影| 欧美日韩成人综合天天影院| 欧美日本一道本| 精品1区2区3区| 日韩欧美国产麻豆| 久久综合久久99| 国产精品你懂的在线欣赏| 欧美国产综合色视频| 国产精品美女久久久久久| 亚洲人成在线观看一区二区| 亚洲男女毛片无遮挡| 亚洲乱码国产乱码精品精可以看 | 日韩欧美色综合| 欧美国产日产图区| 国产精品国模大尺度视频| 亚洲人精品一区| 三级精品在线观看| 久久国产综合精品| 黑人巨大精品欧美一区| 不卡的电视剧免费网站有什么| 91久久香蕉国产日韩欧美9色| 欧美手机在线视频| 精品欧美乱码久久久久久1区2区| 久久精品人人做人人综合| 国产精品日日摸夜夜摸av| 一区二区三区四区视频精品免费 | 成人一区二区三区视频在线观看| 91亚洲精品乱码久久久久久蜜桃| 欧洲国内综合视频| 欧美一区二区三区喷汁尤物| 精品福利在线导航| 国产精品国产馆在线真实露脸| 亚洲精品国产无天堂网2021| 日韩国产一区二| 国产成人在线电影| 欧美少妇xxx| 26uuu精品一区二区在线观看| 亚洲欧美偷拍卡通变态| 亚洲成人av福利| 国产很黄免费观看久久| 一本大道av伊人久久综合| 97精品久久久久中文字幕 | 五月综合激情网| 国产一区二区三区在线观看免费视频 | 亚洲国产综合色| 国产一区二区剧情av在线| 色噜噜狠狠成人网p站| 精品日韩欧美在线| 亚洲精品成人精品456| 精品一区二区三区欧美| 欧美在线看片a免费观看| 久久久久九九视频| 亚洲一本大道在线| 国产aⅴ精品一区二区三区色成熟| 欧美色中文字幕| 国产精品美女久久久久久久久久久 | av在线不卡网| 精品剧情在线观看| 亚洲国产视频在线| 成人高清在线视频| 日韩一区二区三区三四区视频在线观看| 日韩毛片视频在线看| 国产美女一区二区三区| 欧美日韩高清一区| 一区二区三区精品视频在线| 成人在线综合网站| 久久午夜国产精品| 久久国产免费看| 欧美欧美午夜aⅴ在线观看| 亚洲欧美影音先锋| 国产福利一区二区三区视频在线 | 久久一留热品黄| 久久精品国产99久久6| 欧美在线|欧美| 亚洲免费观看高清| 国产自产v一区二区三区c| 欧美精品v国产精品v日韩精品 | 国模套图日韩精品一区二区 | 91久久精品一区二区三| 国产精品国产三级国产aⅴ原创| 精品一区二区三区久久| 日韩一级欧美一级| 青娱乐精品在线视频| 国产精品18久久久久久久网站| 国产精品视频九色porn| 久久草av在线| 精品国产乱码久久久久久久久|