千家信息网

mysql常见的几种分页方式及性能

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,本文主要给大家简单讲讲mysql常见的几种分页方式及性能,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql常见的几种分页方式及性能这篇文章可以给
千家信息网最后更新 2024年11月24日mysql常见的几种分页方式及性能

本文主要给大家简单讲讲mysql常见的几种分页方式及性能,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql常见的几种分页方式及性能这篇文章可以给大家带来一些实际帮助。

常见的几种分页方式:

1.扶梯方式

扶梯方式在导航上通常只提供上一页/下一页这两种模式,部分产品甚至不提供上一页功能,只提供一种"更多/more"的方式,也有下拉自动加载更多的方式,在技术上都可以归纳成扶梯方式。
扶梯方式在技术实现上比较简单及高效,根据当前页最后一条的偏移往后获取一页即可。写成SQL可能类似

SELECT*FROMLIST_TABLEWHEREid> offset_id LIMIT n;

1.电梯方式

另外一种数据获取方式在产品上体现成精确的翻页方式,如1,2,3……n,同时在导航上也可以由用户输入直达n页。国内大部分场景采用电梯方式,但电梯方式在技术实现上相对成本较高。

在MySQL中,通常提到的b-tree,在存储引擎实现上,通常都是b+tree。

使用电梯方式时候,当用户指定翻到第n页时候,并没有直接方法寻址到该位置,而是需要从第一楼逐个count,scan到count*page时候,获取数据才真正开始,所以导致效率不高。

传统分页技术(电梯方式)

首先前端需要传给你的分页实体,以及查询条件

//分页实体structFinanceDcPage{1:i32 pageSize,//页容量2:i32 pageIndex,//当前页索引}

然后你需要返回查询总条数给前端;

SELECTCOUNT(*)FROMmy_tableWHEREx= y ORDERBYid;

然后再返回指定页面条数给前端:

SELECT*FROMmy_tableWHEREx= y ORDERBYdate_colLIMIT (pageIndex - 1)* pageSize, pageSize;

由上面两条sql语句查询出来的结果需要返回给前端的分页实体,以及单页结果集

//分页实体structFinanceDcPage{1:i32 pageSize,//页容量2:i32 pageIndex,//当前页索引3:i32 pageTotal,//总页数4:i32 totalRecod,//总条数}

传统查询方法,每次请求变化的只有pageIndex值,也就是limit offset,num的offset

如limit 0,10; limit 10,10; …. limit10000,10;

上面的变化会导致每次查询所执行的时间会有偏差,offset值越大需要的时间越长,如limit10000,10 需要读取10010个数据才能得到想要的10条数据。

优化方法

传统方法中我们了解到,影响效率的关键是程序遍历了许多不需要的数据,找到了关键点那么就从这里着手。

如果没有必须使用电梯方式的时候,我们可以使用扶梯的方式,来提高性能。

但是大多数情况,电梯形式更能满足用户的需求,所以我们就需要另找方法来优化电梯形式。

基于传统方式的优化

上面提到的优化方式,要么难以满足用户的需求,要么实现起来过于复杂,所以如果数据量不是特别大的时候,像百来万条数据,其实根本没有必要使用上面的优化方法。

传统方法已经足够用了,只不过传统方法也可能需要优化的地方。例如:

orderby优化

SELECT*FROMpa_dc_flowORDERBYsubject_codeDESCLIMIT100000,5

这条语句中使用了ORDERBY关键字,那么对什么进行排序又非常重要了,如果你是对自增id进行排序的话,那么这条语句就不需要优化了,如果是索引甚至非索引的话,那就需要优化了。

首先你要保证它是索引,不然真的会很慢。然后如果他是索引,但是本身不像自增id那样有序的话,那么就要改写成下面的语句。

SELECT*FROMpa_dc_flowINNERJOIN(SELECTidFROMpa_dc_flowORDERBYsubject_codeDESCLIMIT100000,5)ASpa_dc_flow_idUSING(id);

下面是对两条sql的 EXPLAIN


由图中我们可以看出,第二个sql可以少扫面很多页面。

其实这涉及到order by的优化问题,第一条sql中并没有利用到subject_code索引。如果你改为select subject_code …则用到了索引。下面是对order by的优化。

order by后的字段,如果要走索引,须与where 条件里的某字段建立复合索引!!或者说orcerby后的字段如果要走索引排序,它要么与where条件里的字段建立复合索引【这里建立复合索引的时候,需要注意复合索引的列顺序为(where字段,order by字段),这样才能满足最左列原则,原因可能是order by字段并能算在where 查询条件中!】,要么它自身要在where条件里被引用到!

表asubject_code为普通字段,上面建有索引,id是自增主键

select*fromaorderbysubject_code//用不上索引selectidfromaorderbysubject_code//能用上索引selectsubject_codefromaorderbysubject_code//能用上索引select*fromawheresubject_code= XX orderbysubject_code//能用上索引

意思是说order by 要避免使用文件系统排序,要么把order by的字段出现在select后,要么使用order by字段出现在where 条件里,要么把order by字段与where条件字段建立复合索引!

第二条sql就是巧妙的利用第二种方式利用上了索引。 select id from a order bysubject_code,这种方式

count优化

当数据量非常大时,其实可以输出总数的大概数据,利用explain语句,他并没有真正去执行sql,而是进行的估算。

mysql常见的几种分页方式及性能就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的行业资讯。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。

方式 索引 字段 数据 方法 电梯 条件 要么 传统 时候 查询 扶梯 语句 常见 性能 前端 实体 技术 用户 排序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海德颐网络技术有 网络技术公司服务费记哪些科目 网络安全应急中心 网信办 已部署项目的服务器如何更换系统 全桥性能实验实验数据库 什么是可以用关系型数据库 网络安全实训日志 杭州壹宝康健网络技术 网络安全属于计算机网络技术吗 必虎共享网络安全吗 三大中文数据库的区别 海南招商网络技术有限公司 沉迷网络安全教育主题班会记录 海洋底质数据库 网络安全风险和挑战 服务器上存在同名的备份文件 数据库技术与应用第三章答案 服务器怎么做网页访问限制 成都银行做软件开发 软件开发报价参考什么标准 计算机二级软件开发周期 服务器linux安全性 网络安全评标专家 邯郸软件开发的公司有哪些 东信和平软件开发 局域网服务器和互联网有什么区别 个人信息基础数据库是哪个设计的 数据库美国大选投票情况 云南参考软件开发价格走势 软件开发报价参考什么标准
0