欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql的limit用法及邏輯分頁(yè)和物理分頁(yè)

 更新時(shí)間:2023年03月30日 09:40:51   作者:super先生  
本文主要介紹了mysql的limit用法及邏輯分頁(yè)和物理分頁(yè),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

物理分頁(yè)為什么用limit

在講解limit之間,我們先說說分頁(yè)的事情。

分頁(yè)有邏輯分頁(yè)和物理分頁(yè),就像刪除有邏輯刪除和物理刪除。邏輯刪除就是改變數(shù)據(jù)庫(kù)的狀態(tài),物理刪除就是直接刪除數(shù)據(jù)庫(kù)的記錄,而邏輯刪除只是改變?cè)摂?shù)據(jù)庫(kù)的狀態(tài)。例如:

同理,邏輯分頁(yè)和物理分頁(yè)是有區(qū)別的

物理分頁(yè)邏輯分頁(yè)Cool
物理分頁(yè)依賴的是某一物理實(shí)體,這個(gè)物理實(shí)體就是數(shù)據(jù)庫(kù),比如MySQL數(shù)據(jù)庫(kù)提供了limit關(guān)鍵字,程序員只需要編寫帶有l(wèi)imit關(guān)鍵字的SQL語句,數(shù)據(jù)庫(kù)返回的就是分頁(yè)結(jié)果。邏輯分頁(yè)依賴的是程序員編寫的代碼。數(shù)據(jù)庫(kù)返回的不是分頁(yè)結(jié)果,而是全部數(shù)據(jù),然后再由程序員通過代碼獲取分頁(yè)數(shù)據(jù),常用的操作是一次性從數(shù)據(jù)庫(kù)中查詢出全部數(shù)據(jù)并存儲(chǔ)到List集合中,因?yàn)長(zhǎng)ist集合有序,再根據(jù)索引獲取指定范圍的數(shù)據(jù)。概念
每次都要訪問數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)造成的負(fù)擔(dān)大只需要訪問一次數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)負(fù)擔(dān)
每次只讀取一部分?jǐn)?shù)據(jù),占用的內(nèi)存空間較小一次性將數(shù)據(jù)讀取到內(nèi)存,占用較大的內(nèi)存空間。如果使用java開發(fā),Java本身引用的框架就占用了很多內(nèi)存,這無疑加重了服務(wù)器的負(fù)擔(dān)。服務(wù)器負(fù)擔(dān)
每次需要數(shù)據(jù)時(shí)都訪問數(shù)據(jù)庫(kù),能夠獲取數(shù)據(jù)庫(kù)的最新狀態(tài),實(shí)時(shí)性強(qiáng)因?yàn)橐淮涡宰x入到內(nèi)存,數(shù)據(jù)發(fā)生了改變,數(shù)據(jù)庫(kù)逇最新狀態(tài)無法實(shí)時(shí)反映到操作中實(shí)時(shí)性
數(shù)據(jù)庫(kù)量大、更新頻繁的場(chǎng)合數(shù)據(jù)量較小、數(shù)據(jù)穩(wěn)定的場(chǎng)合服務(wù)器負(fù)擔(dān)
為什么邏輯分頁(yè)占用較大的內(nèi)存空間,比如我有一張表,表的信息是:
-- ----------------------------
-- Table structure for vote_record_memory
-- ----------------------------
DROP TABLE IF EXISTS `vote_record_memory`;
CREATE TABLE `vote_record_memory` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(20) NOT NULL,
  `vote_id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  `create_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `index_id` (`user_id`) USING HASH
) ENGINE=MEMORY AUTO_INCREMENT=3000001 DEFAULT CHARSET=utf8;

向該表中插入300萬條數(shù)據(jù)后,再轉(zhuǎn)儲(chǔ)到桌面,查看轉(zhuǎn)儲(chǔ)后的SQL文件的屬性:

這是多么龐大的數(shù)據(jù),占用的內(nèi)存多么可怕,為什么我們?cè)龠x用數(shù)據(jù)庫(kù)。這也是我們使用云服務(wù)器時(shí),設(shè)定mysql的存儲(chǔ)空間的大小。

我們一般不推薦使用邏輯分頁(yè),而使用物理分頁(yè)。在使用物理分頁(yè)的時(shí)候,就要考慮到limit的用法。

解釋limit

limit X,Y ,跳過前X條數(shù)據(jù),讀取Y條數(shù)據(jù)

  • X表示第一個(gè)返回記錄行的偏移量,Y表示返回記錄行的最大數(shù)目
  • 如果X為0的話,即 limit 0, Y,相當(dāng)于limit Y、

通過業(yè)務(wù)分析limit

我有一張工資表,只顯示最新的前兩條記錄,同時(shí)進(jìn)行員工姓名和工資提成備注查詢

SELECT
	cue.real_name empName,
	zs.push_money AS pushMoney,
	zs.push_money_note AS pushMoneyNote,
	zs.create_datetime AS createTime
FROM
	zq_salary zs  //主表
LEFT JOIN core_user_ext cue ON cue.id = zs.user_id   //從表 on之后是從表的條件
WHERE
	zs.is_deleted = 0
AND (
	cue.real_name LIKE '%李%'
	OR zs.push_money_note LIKE '%測(cè)%'
)
ORDER BY
	zs.create_datetime DESC
LIMIT 2;

就相當(dāng)于
ORDER BY
	zs.create_datetime DESC
LIMIT 0,2;

limit的效率問題

我有一個(gè)需求,就是從vote_record_memory表中查出3600000到3800000的數(shù)據(jù),此時(shí)在id上加個(gè)索引,索引的類型是Normal,索引的方法是BTREE,分別用兩種方法查詢

-- 方法1
SELECT * FROM vote_record_memory vrm  LIMIT 3600000,20000 ;

-- 方法2
SELECT * FROM vote_record_memory vrm WHERE vrm.id >= 3600000 LIMIT 20000 

你會(huì)發(fā)現(xiàn),方法2的執(zhí)行效率遠(yuǎn)比方法1的執(zhí)行效率高,幾乎是方法1的九分之一的時(shí)間。

為什么方法1的效率低,而方法二的效率高呢?

分析一

因?yàn)樵诜椒?中,我們使用的單純的limit。limit隨著行偏移量的增大,當(dāng)大到一定程度后,會(huì)出現(xiàn)效率下降。而方法2用上索引加where和limit,性能基本穩(wěn)定,受偏移量和行數(shù)的影響不大。

分析二

我們用explain來分析:

可見,limit語句的執(zhí)行效率未必很高,因?yàn)闀?huì)進(jìn)行全表掃描,這就是為什么方法1掃描的的行數(shù)是400萬行的原因。方法2的掃描行數(shù)是47945行,這也是為什么方法2執(zhí)行效率高的原因。我們盡量避免全表掃描查詢,尤其是數(shù)據(jù)非常龐大,這張表僅有400萬條數(shù)據(jù),方法1和方法就有這么大差距,可想而知上千萬條的數(shù)據(jù)呢。

能用索引的盡量使用索引,type至少達(dá)到range級(jí)別,這不是我說的,這是阿里巴巴開發(fā)手冊(cè)的5.2.8中要求的

我不用索引查詢到的結(jié)果和返回的時(shí)間和方法1的時(shí)間差不多:

SELECT * FROM vote_record_memory vrm WHERE vrm.id >= 3600000 LIMIT

20000 受影響的行: 0 時(shí)間: 0.196s

這也就是我們?yōu)槭裁幢M量使用索引的原因。mysql索引方法一般有BTREE索引和HASH索引,hash索引的效率比BTREE索引的效率高,但我們經(jīng)常使用BTREE索引,而不是hash索引。因?yàn)樽钪匾囊稽c(diǎn)就是:Hash索引僅僅能滿足"=",“IN"和”<=>"查詢,不能使用范圍查詢。

如果是范圍查詢,我們?yōu)槭裁从肂TREE索引的原因。BTREE索引就是二叉樹索引,學(xué)過數(shù)據(jù)結(jié)構(gòu)的應(yīng)該都清楚,這里就不贅述了。

limit物理分頁(yè)

我們都知道limit一般有兩個(gè)參數(shù),X和Y,X表示跳過X個(gè)數(shù)據(jù),讀取Y個(gè)數(shù)據(jù),我們就此來查詢數(shù)據(jù)

頁(yè)數(shù)每頁(yè)顯示的行數(shù)limit語句計(jì)算方式
第一頁(yè)20limit 0,20limit 0*20,20
第二頁(yè)20limit 20,20limit 1*20,20
第三頁(yè)20limit 40,20limit 2*20,20
第四頁(yè)20limit 60,20limit 3*20,20
如果是SQL語句來進(jìn)行分頁(yè)的話,我們可以看到的是:
-- 首頁(yè)
SELECT * from vote_record_memory LIMIT 0,20;

-- 第二頁(yè)
SELECT * from vote_record_memory LIMIT 20,20;

-- 第三頁(yè)
SELECT * from vote_record_memory LIMIT 40,20;

-- 第四頁(yè)
SELECT * from vote_record_memory LIMIT 60,20;

-- n頁(yè)
SELECT * from vote_record_memory LIMIT (n-1)*20,20;

這里寫圖片描述

因而,如果是用java的話,我們就可以寫一個(gè)方法,有兩個(gè)參數(shù),一個(gè)是頁(yè)數(shù),一個(gè)每頁(yè)顯示的行數(shù)

    /**
     * @description          簡(jiǎn)單的模擬分頁(yè)雛形
     * @author               zby
     * @param currentPage    當(dāng)前頁(yè)
     * @param lines          每頁(yè)顯示的多少條
     * @return               數(shù)據(jù)的集合
     */
    public List<Object> listObjects(int currentPage, int lines) {
        String sql = "SELECT * from vote_record_memory LIMIT " + (currentPage - 1) * lines + "," + lines;
        return null;
    }

參考https://www.cnblogs.com/tonghun/p/7122801.html

到此這篇關(guān)于mysql的limit用法及邏輯分頁(yè)和物理分頁(yè)的文章就介紹到這了,更多相關(guān)mysql limit邏輯分頁(yè)和物理分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • 解決MySQL批量新增或修改時(shí)出現(xiàn)異常:Lock?wait?timeout?exceeded

    解決MySQL批量新增或修改時(shí)出現(xiàn)異常:Lock?wait?timeout?exceeded

    這篇文章主要給大家介紹了關(guān)于如何解決MySQL批量新增或修改時(shí)出現(xiàn)異常:Lock?wait?timeout?exceeded;try?restarting?transaction的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • mysql入門之1小時(shí)學(xué)會(huì)MySQL基礎(chǔ)

    mysql入門之1小時(shí)學(xué)會(huì)MySQL基礎(chǔ)

    今天剛好看到了SYZ01的這篇mysql入門文章,感覺對(duì)于想學(xué)習(xí)mysql的朋友是個(gè)不錯(cuò)的資料,腳本之家特分享一下,需要的朋友可以參考下
    2018-01-01
  • 5個(gè)保護(hù)MySQL數(shù)據(jù)倉(cāng)庫(kù)的小技巧

    5個(gè)保護(hù)MySQL數(shù)據(jù)倉(cāng)庫(kù)的小技巧

    這篇文章主要為大家詳細(xì)介紹了五個(gè)小技巧,告訴你如何保護(hù)MySQL數(shù)據(jù)倉(cāng)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 淺談MySQL函數(shù)

    淺談MySQL函數(shù)

    這篇文章主要介紹MySQL函數(shù),主要解說數(shù)學(xué)函數(shù)、字符串函數(shù)、 時(shí)間函數(shù)、加密函數(shù),需要的朋友可以參考下面文章具體內(nèi)容
    2021-09-09
  • MySql分表、分庫(kù)、分片和分區(qū)知識(shí)深入詳解

    MySql分表、分庫(kù)、分片和分區(qū)知識(shí)深入詳解

    這篇文章主要介紹了MySql分表、分庫(kù)、分片和分區(qū)知識(shí)深入詳解,如果有并發(fā)場(chǎng)景和數(shù)據(jù)量較大的場(chǎng)景的可以看一下文章,對(duì)你會(huì)有或多或少的幫助
    2021-03-03
  • JDBC鏈接MySQL8的注意事項(xiàng)及說明

    JDBC鏈接MySQL8的注意事項(xiàng)及說明

    這篇文章主要介紹了JDBC鏈接MySQL8的注意事項(xiàng)及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Mysql 5.7.17 winx64在win7上的安裝教程

    Mysql 5.7.17 winx64在win7上的安裝教程

    本文給大家介紹Mysql 5.7.17 winx64在win7上的安裝教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-04-04
  • 簡(jiǎn)單的MySQL備份與還原方法分享

    簡(jiǎn)單的MySQL備份與還原方法分享

    這篇文章主要介紹了簡(jiǎn)單的MySQL備份與還原方法,文中Linux與Windows的兩種情況都有介紹,需要的朋友可以參考下
    2015-08-08
  • MYSQL導(dǎo)入導(dǎo)出sql文件簡(jiǎn)析

    MYSQL導(dǎo)入導(dǎo)出sql文件簡(jiǎn)析

    這篇文章主要介紹了MYSQL導(dǎo)入導(dǎo)出.sql文件的相關(guān)資料,內(nèi)容包括MYSQL的命令行模式的設(shè)置、命令行進(jìn)入MYSQL的方法、數(shù)據(jù)庫(kù)導(dǎo)出數(shù)據(jù)庫(kù)文件、從外部文件導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫(kù),感興趣的小伙伴們可以參考一下
    2016-04-04
  • 最新評(píng)論