最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何解決mysql深度分頁問題

 更新時間:2023年01月09日 09:19:37   作者:蒼穹之躍  
這篇文章主要介紹了如何解決mysql深度分頁問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

mysql深度分頁問題

數(shù)據(jù):單表數(shù)據(jù)25萬條。

1.基本分頁:耗時0.019秒

select * from cf_qb_info limit 0,20

2.深度分頁:耗時10.236秒

select * from cf_qb_info limit 200000,20

3.深度ID分頁:耗時0.052秒

提示:如果這一步很慢,count(1) 查詢總數(shù)應(yīng)該也會很慢-解決方式:請為主鍵加上unique索引。 

-- 主鍵ID字段:NUMID
select NUMID from cf_qb_info limit 200000,20

4.兩步走深度分頁:耗時0.049秒+0.017秒

基于第三步的缺陷(只能查出ID信息),我們可以先查出分頁數(shù)據(jù)的ID,在根據(jù)ID查詢數(shù)據(jù)。

select NUMID from cf_qb_info LIMIT 200000,20
select * from cf_qb_info where NUMID in (
'330681650000202108180227345510',
'330681650000202108171031534500',
'330681650000202108190251532141',
'330681650000202108200246376830',
'330681650000202108210229398665',
'330681650000202108220236113895',
'330681650000202108230230034133',
'330681650000202108231017279739',
'330681650000202108231043456276',
'330681650000202108231051404340',
'330681650000202108240237397251',
'330681650000202108250221489228',
'330681650000202108250241536726',
'330681650000202108260253039326',
'330681650000202108270216016138',
'330681650000202108280234013754',
'330681650000202108290230029720',
'330681650000202108300255579204',
'330681650000202108310234184991',
'330681650000202109010237315937'
);

兩步合成一步SQL耗時:11.9秒;這一步著實出乎了我的意料。

select * from cf_qb_info where NUMID in (
 
	select NUMID from (select NUMID from cf_qb_info LIMIT 200000,20) as t
 
);

鑒于這個結(jié)果:我們可以在程序里分成兩步進行分頁查詢。

5.一步走深度分頁:耗時0.05秒

這一步是對第四步的優(yōu)化,畢竟兩條SQL還需要碼代碼。利用join 兩條SQL合成一條。

SELECT
	* 
FROM
	cf_qb_info a
	JOIN ( SELECT NUMID FROM cf_qb_info LIMIT 200000, 20 ) b ON a.NUMID = b.NUMID

6.集成BeanSearcher框架

原理是使用了BeanSearcher的sql攔截器對SQL進行攔截改造。

①改造Bean

②注入Sql攔截器

package com.ciih.qbbs.config;
 
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.TableId;
import com.ejlchina.searcher.SearchSql;
import com.ejlchina.searcher.SqlInterceptor;
import com.ejlchina.searcher.SqlSnippet;
import com.ejlchina.searcher.param.FetchType;
import org.springframework.stereotype.Component;
 
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
 
/**
 * BeanSearcher的Sql攔截器:優(yōu)化深度分頁
 *
 * @author sunziwen
 */
@Component
public class SqlInterceptorImpl implements SqlInterceptor {
    @Override
    public <T> SearchSql<T> intercept(SearchSql<T> searchSql, Map<String, Object> paraMap, FetchType fetchType) {
        /**
         * 改造思路
         *
         * <>
         *     前:SELECT * FROM table1 t1 LIMIT 200000,20;
         *     后:SELECT * FROM table1 t1 JOIN ( SELECT id FROM table1 LIMIT 200000, 20 ) t99 ON t1.id = t99.id;
         * </>
         */
 
        Field[] fields = searchSql.getBeanMeta().getBeanClass().getDeclaredFields();
        String primaryColumnName = null;
        for (Field field : fields) {
            //這里使用了mybatis_plus的注解作為主鍵標識
            TableId tableId = field.getAnnotation(TableId.class);
            if (tableId != null) {
                if (!"".equals(tableId.value())) {
                    primaryColumnName = tableId.value();
                } else {
                    //駝峰轉(zhuǎn)下劃線
                    primaryColumnName = StrUtil.toUnderlineCase(field.getName());
                }
            }
        }
        //如果沒有主鍵標識,則不能進行SQL優(yōu)化。
        if (primaryColumnName == null) {
            return searchSql;
        }
 
        //正則表達式獲取where之后語句
        List<String> limits = ReUtil.findAll("where[\\s\\S]*limit[ ]+[?]{1}[ ]*,[ ]+[?]{1}", searchSql.getListSqlString(), 0);
 
        //如果不分頁,則不進行SQL優(yōu)化,即語句中沒有l(wèi)imit關(guān)鍵字不優(yōu)化。
        if (limits.size() == 0) {
            return searchSql;
        }
 
        //表名小片段
        SqlSnippet tableSnippet = searchSql.getBeanMeta().getTableSnippet();
        //合成子查詢SQL
        String inSql = "JOIN ( SELECT " + primaryColumnName + " FROM " + tableSnippet.getSql() + " " + limits.get(0) + " ) t99 ON t1." + primaryColumnName + " = t99." + primaryColumnName + ";";
        //合成整條SQL
        String replace = searchSql.getListSqlString().replace(limits.get(0), inSql);
        //替換
        searchSql.setListSqlString(replace);
        return searchSql;
    }
}

7.萬能優(yōu)化技巧:索引

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql密碼忘記后如何修改密碼(2022年最新版詳細教程保姆級)

    mysql密碼忘記后如何修改密碼(2022年最新版詳細教程保姆級)

    因為長時間不操作mysql而忘記root密碼的朋友估計不在少數(shù),下面這篇文章主要給大家介紹了關(guān)于mysql密碼忘記后如何修改密碼的相關(guān)資料,本教程是2022年最新版詳細教程保姆級,需要的朋友可以參考下
    2022-04-04
  • MySQL三大日志之redo?log、undo?log、binlog示例詳解

    MySQL三大日志之redo?log、undo?log、binlog示例詳解

    在MySQL數(shù)據(jù)庫的運行機制中,Redo Log、Undo Log和Binlog起著至關(guān)重要的作用,它們各司其職,共同保障數(shù)據(jù)庫的數(shù)據(jù)安全、事務(wù)一致性以及高效的復制與恢復功能,這篇文章主要介紹了MySQL三大日志之redo?log、undo?log、binlog的相關(guān)資料,需要的朋友可以參考下
    2025-09-09
  • MySQL找出未提交事務(wù)的SQL實例淺析

    MySQL找出未提交事務(wù)的SQL實例淺析

    這篇文章主要給大家介紹了關(guān)于MySQL找出未提交事務(wù)SQL的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Mysql+Keepalived實現(xiàn)雙主熱備方式

    Mysql+Keepalived實現(xiàn)雙主熱備方式

    這篇文章主要介紹了Mysql+Keepalived實現(xiàn)雙主熱備方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • MySQL insert into select 主鍵沖突解決方案

    MySQL insert into select 主鍵沖突解決方案

    本文主要介紹了MySQL insert into select主鍵沖突解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • vs如何讀取mysql中的數(shù)據(jù)并解決中文亂碼問題

    vs如何讀取mysql中的數(shù)據(jù)并解決中文亂碼問題

    這篇文章主要介紹了vs如何讀取mysql中的數(shù)據(jù)并解決中文亂碼問題,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Mysql樹形結(jié)構(gòu)的數(shù)據(jù)庫表設(shè)計方案

    Mysql樹形結(jié)構(gòu)的數(shù)據(jù)庫表設(shè)計方案

    樹形結(jié)構(gòu)對大家來說應(yīng)該都不陌生,在日常開發(fā)中經(jīng)常會遇到,下面這篇文章主要給大家介紹了關(guān)于Mysql樹形結(jié)構(gòu)的數(shù)據(jù)庫表設(shè)計的相關(guān)資料,文中通過示例代碼的非常詳細,需要的朋友可以參考下
    2021-09-09
  • CentOS7下mysql 8.0.16 安裝配置方法圖文教程

    CentOS7下mysql 8.0.16 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了CentOS7下mysql 8.0.16 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Mybatis特殊字符處理的詳解

    Mybatis特殊字符處理的詳解

    這篇文章主要介紹了Mybatis特殊字符處理的詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • MySQL用命令行運行sql文件的詳細圖文教程

    MySQL用命令行運行sql文件的詳細圖文教程

    最近重新踩了一下mysql 這邊的坑,記錄一下自己忽略的地方,下面這篇文章主要給大家介紹了關(guān)于MySQL用命令行運行sql文件的詳細圖文教程,文中通過實例代碼的非常詳細,需要的朋友可以參考下
    2023-01-01

最新評論

湖北省| 昌邑市| 宝山区| 金溪县| 安西县| 离岛区| 莆田市| 平遥县| 宁安市| 石景山区| 安化县| 大安市| 永清县| 图木舒克市| 巍山| 嘉黎县| 京山县| 恭城| 赣州市| 大余县| 策勒县| 芦溪县| 子洲县| 册亨县| 敦化市| 谢通门县| 嘉善县| 贺州市| 辽阳县| 绥江县| 夏邑县| 靖江市| 云林县| 盱眙县| 兴文县| 昌吉市| 葫芦岛市| 钦州市| 衢州市| 德保县| 乐都县|