亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL深分頁(yè)問(wèn)題解決思路

 更新時(shí)間:2022年12月22日 14:33:14   作者:MinggeQingchun  
這篇文章主要介紹了優(yōu)雅地解決mysql深分頁(yè)問(wèn)題,本文將會(huì)討論當(dāng)mysql表大數(shù)據(jù)量的情況,如何優(yōu)化深分頁(yè)問(wèn)題,并附上最近的優(yōu)化慢sql問(wèn)題的案例偽代碼,需要的朋友可以參考下

一、MySQL深分頁(yè)問(wèn)題

我們?cè)谌粘i_(kāi)發(fā)中,查詢(xún)數(shù)據(jù)量比較大的時(shí)候,后端基本都會(huì)通過(guò)前端,移動(dòng)端傳過(guò)來(lái)的頁(yè)碼,每頁(yè)數(shù)據(jù)行數(shù),通過(guò)SQL中的 limit 進(jìn)行分頁(yè),如果查詢(xún)頁(yè)數(shù)比較小的時(shí)候,不會(huì)出現(xiàn)太大問(wèn)題,但是如果查詢(xún)頁(yè)碼比較大的時(shí)候,性能就會(huì)出現(xiàn)急劇下降瓶頸

如:

假設(shè)有一個(gè)千萬(wàn)量級(jí)的表,取1到10條數(shù)據(jù)

select column_name1,column_name2... from table limit 0,10;
select column_name1,column_name2... from table limit 1000,10;

這兩條語(yǔ)句查詢(xún)時(shí)間應(yīng)該在毫秒級(jí)完成

select column_name1,column_name2... from table limit 1000000,10;

這條語(yǔ)句執(zhí)行之間在秒級(jí)完成,查詢(xún)效率低下,還可能導(dǎo)致接口超時(shí)

使用select column_name1,column_name2... from table_name表名 limit offset, rows 的情況下直接?limit 1000000,10 掃描的是約100萬(wàn)條數(shù)據(jù),并且是需要回表100W次,也就是說(shuō)?部分性能都耗在隨機(jī)訪問(wèn)上,到頭來(lái)只?到10條數(shù)據(jù)(總共取1000010條數(shù)據(jù)只留10條記錄)

這種查詢(xún)的慢,其實(shí)是因?yàn)?limit 后面的偏移量太大導(dǎo)致的

1、limit 語(yǔ)法解讀

limit用于數(shù)據(jù)的分頁(yè)查詢(xún),也會(huì)用于數(shù)據(jù)的截取,limit的用法:

SELECT column_name1,column_name2... FROM table_name表名 LIMIT offset,rows
或
SELECT column_name1,column_name2... FROM table_name表名 LIMIT rows OFFSET offset  

注:

table_name :表名

column_name:字段名

第一種:SELECT * FROM table LIMIT offset, rows # 常用形式

-- 從0開(kāi)始,截取5條記錄,即檢索行為1到5
SELECT column_name1,column_name2... FROM table_name表名 limit 0,5
-- 注意: 關(guān)鍵字limit后面的兩個(gè)參與用逗號(hào)分割

第二種:SELECT * FROM table LIMIT rows OFFSET offset

-- 從0開(kāi)始,截取5條記錄,即檢索行為1到5
SELECT column_name1,column_name2... FROM table_name表名 limit 5 offset 0
-- 注意: 使用limit和offset兩個(gè)關(guān)鍵字,并且各帶一個(gè)參數(shù),中間沒(méi)有逗號(hào)分割

第三種:SELECT * FROM table LIMIT rows

-- 截取記錄的前五行數(shù)據(jù),可以理解為offset的默認(rèn)值為0
SELECT column_name1,column_name2... FROM table_name表名 limit 5

2、回表

回表,顧名思義就是回到表中,也就是先通過(guò)普通索引掃描出數(shù)據(jù)所在的行,再通過(guò)行主鍵ID取出索引中未包含的數(shù)據(jù)。所以回表的產(chǎn)生也是需要一定條件的,如果一次索引查詢(xún)就能獲得所有的select記錄就不需要回表,如果select所需獲得列中有其他的非索引列,就會(huì)發(fā)生回表動(dòng)作。即基于非主鍵索引的查詢(xún)需要多掃描一棵索引樹(shù)

主鍵索引樹(shù)的葉子節(jié)點(diǎn)直接就是我們要查詢(xún)的整行數(shù)據(jù),而非主鍵索引的葉子節(jié)點(diǎn)是主鍵的值,查到主鍵的值以后,還需要再通過(guò)主鍵的值再進(jìn)行一次查詢(xún)

回表,簡(jiǎn)單說(shuō)就是mysql內(nèi)部需要經(jīng)過(guò)兩次查詢(xún)

第一次先索引掃描,然后再通過(guò)主鍵去取索引中未能提供的數(shù)據(jù)

create `table` tb_name(
    `id` int(11) not null auto_increment , 
    `k` int(11) default '0' ,
    `name` varchar(16),
    primary key(id)
    index (k)
)engine=InnoDB;

我們提取id=500這一行的全部數(shù)據(jù),這里通過(guò)主鍵id定位到這一行,然后返回?cái)?shù)據(jù)

select * from T where ID=500;
+-----+---+-------+
| id  | k | name  |
+-----+---+-------+
| 500 | 5 | name5 |
+-----+---+-------+

這里我們先通過(guò)普通索引,搜索 k 索引樹(shù),得到 ID 的值為 500,再到 ID 索引樹(shù)搜索一次。這個(gè)過(guò)程即為回表

select * from T where k=5;
+-----+---+-------+
| id  | k | name  |
+-----+---+-------+
| 500 | 5 | name5 |
+-----+---+-------+

二、優(yōu)化方案

(一)模仿百度、谷歌方案(前端業(yè)務(wù)控制)

類(lèi)似于分段。我們給每次只能翻100頁(yè)、超過(guò)一百頁(yè)的需要重新加載后面的100頁(yè)。這樣就解決了每次加載數(shù)量數(shù)據(jù)大 速度慢的問(wèn)題了

這種方式比較簡(jiǎn)單粗暴,就是不允許查看這么靠后的數(shù)據(jù)

(二)索引覆蓋 + 子查詢(xún)

根據(jù)主鍵 id,在上面建了索引,先在索引樹(shù)中找到開(kāi)始位置的 id 值,再根據(jù)找到的 id 值查詢(xún)行數(shù)據(jù)

SELECT 
    id,name,age 
FROM
    t_user user
WHERE
    user.id = (select MIN(id) from t_user where age = #{age})
SELECT 
    id,name,age 
FROM 
    t_user 
WHERE 
    id >= (SELECT id FROM t_user order by id LIMIT 80000,1) 
LIMIT 10

(三)起始位置重定義(記錄每次取出的最大id, 然后where id > 最大id)

這種方法適用于:除了主鍵ID等離散型字段外,也適用連續(xù)型字段datetime等

最大id由前端分頁(yè) pageNum 和 pageIndex 計(jì)算出來(lái)

select * from table_name Where id > 最大id limit 10000, 10;

到此這篇關(guān)于MySQL深分頁(yè)問(wèn)題解決思路的文章就介紹到這了,更多相關(guān)MySQL深分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CentOS系統(tǒng)下如何設(shè)置mysql每天自動(dòng)備份

    CentOS系統(tǒng)下如何設(shè)置mysql每天自動(dòng)備份

    備份是容災(zāi)的基礎(chǔ),是指為防止系統(tǒng)出現(xiàn)操作失誤或系統(tǒng)故障導(dǎo)致數(shù)據(jù)丟失,而將全部或部分?jǐn)?shù)據(jù)集合從應(yīng)用主機(jī)的硬盤(pán)或陣列復(fù)制到其它的存儲(chǔ)介質(zhì)的過(guò)程。本文將詳細(xì)介紹在CentOS系統(tǒng)下如何設(shè)置mysql每天自動(dòng)備份,有需要的朋友們下面來(lái)一起看看吧。
    2016-10-10
  • CentOS 7下安裝與配置MySQL 5.7

    CentOS 7下安裝與配置MySQL 5.7

    Mysql5.7和之前版本的MySQL有一些不同,現(xiàn)把CentOS 7下MySQL 5.7安裝、配置完整過(guò)程記下來(lái),或許對(duì)新手來(lái)說(shuō)有用。希望大家能夠喜歡
    2018-01-01
  • 通過(guò)yum方式安裝mySql數(shù)據(jù)庫(kù)的全過(guò)程

    通過(guò)yum方式安裝mySql數(shù)據(jù)庫(kù)的全過(guò)程

    當(dāng)工作需要部署mysql時(shí),通過(guò)手動(dòng)上傳安裝包以及依賴(lài)包的方式安裝mysql會(huì)比較麻煩,可以添加官方y(tǒng)um源,來(lái)實(shí)現(xiàn)自動(dòng)安裝依賴(lài),方便快捷,下面這篇文章主要給大家介紹了關(guān)于通過(guò)yum方式安裝mySql數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • MySQL中關(guān)于datetime、date、time、str之間的轉(zhuǎn)化與比較

    MySQL中關(guān)于datetime、date、time、str之間的轉(zhuǎn)化與比較

    這篇文章主要介紹了MySQL中關(guān)于datetime、date、time、str之間的轉(zhuǎn)化與比較,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 詳解MySQL中InnoDB的存儲(chǔ)文件

    詳解MySQL中InnoDB的存儲(chǔ)文件

    本篇是一篇關(guān)于MySQL專(zhuān)題知識(shí)點(diǎn)的內(nèi)容,詳細(xì)講述了InnoDB的存儲(chǔ)文件的相關(guān)內(nèi)容,感興趣的朋友學(xué)習(xí)下。
    2018-02-02
  • MySQL+Redis緩存+Gearman共同構(gòu)建數(shù)據(jù)庫(kù)緩存的方法

    MySQL+Redis緩存+Gearman共同構(gòu)建數(shù)據(jù)庫(kù)緩存的方法

    這篇文章主要介紹了MySQL+Redis緩存+Gearman共同構(gòu)建數(shù)據(jù)庫(kù)緩存,部署后在MySQL端進(jìn)行創(chuàng)建一個(gè)用戶(hù)給與遠(yuǎn)程登錄權(quán)限,使得Redis作為緩存可以用來(lái)同步數(shù)據(jù)使用,需要的朋友可以參考下
    2022-10-10
  • MySql 5.6.36 64位綠色版安裝圖文教程

    MySql 5.6.36 64位綠色版安裝圖文教程

    這篇文章主要介紹了MySql 5.6.36 64位綠色版安裝圖文教程,需要的朋友可以參考下
    2017-05-05
  • MySQL死鎖使用詳解及檢測(cè)和避免方法

    MySQL死鎖使用詳解及檢測(cè)和避免方法

    這篇文章主要介紹了MySQL死鎖使用詳解及檢測(cè)和避免方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 這種sql寫(xiě)法真的會(huì)導(dǎo)致索引失效嗎

    這種sql寫(xiě)法真的會(huì)導(dǎo)致索引失效嗎

    這篇文章主要給大家介紹了關(guān)于網(wǎng)上流傳的某種sql寫(xiě)法會(huì)導(dǎo)致索引失效的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用sql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • mysql啟用skip-name-resolve模式時(shí)出現(xiàn)Warning的處理辦法

    mysql啟用skip-name-resolve模式時(shí)出現(xiàn)Warning的處理辦法

    在優(yōu)化MYSQL配置時(shí),加入 skip-name-resolve ,在重新啟動(dòng)MYSQL時(shí)檢查啟動(dòng)日志,發(fā)現(xiàn)有警告信息
    2012-07-07

最新評(píng)論