mysql分页性能探索
技术百科
小云云
发布时间:2017-12-08
浏览: 次 分页在我们的编程中经常会用到,本文带领大家一起探讨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分页性能优化指南
php mysql分页类(php新手入门)
php+mysql分页代码详解_PHP教程
# 如果你
# 出现在
# 分页
# 这条
# 两条
# mysql
# 要走
# 条数
# 只提供
# 上一页
# 当前页
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11怎么连接投影仪_Win11多显示器投屏设
- Win11怎么关闭任务栏小图标_Windows11
- Win10如何卸载WindowsDefender_
- Win11怎么设置触控板手势_Windows11三
- 如何使用Golang构建基础消息队列模拟_Gola
- c++如何用AFL++进行模糊测试 c++ Fuz
- Windows10电脑怎么设置虚拟光驱_Win10
- 如何用::实现工具类方法调用_php静态工具类设计
- Python包结构设计_大型项目组织解析【指导】
- Win11怎么更改计算机名_Windows11系统
- PhpStorm怎么调试PHP代码_PhpStor
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Win11 explorer.exe频繁崩溃_修复
- Win11如何设置计划任务 Win11定时执行程序
- LINUX怎么进行文本内容搜索_Linux gre
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- Python邮件系统自动化教程_批量发送解析与模板
- Win11怎么关闭搜索历史_Win11清除设备上的
- C++中的Pimpl idiom是什么,有什么好处
- Win11文件夹预览图不显示怎么办_Win11缩略
- Win11截图快捷键是什么_Win11自带截图工具
- Win11视频默认播放器怎么改_Win11关联第三
- Windows10系统怎么查看防火墙状态_Win1
- Win11怎么设置麦克风权限_允许应用访问Win1
- Win11摄像头无法使用怎么办_Win11相机隐私
- 如何解决同一段404代码在不同主机上表现不一致的问
- 为什么Go需要go mod文件_Go go mod
- mac本地php环境如何开启curl_curl扩展
- Win11怎么查看局域网电脑_Windows 11
- Win11怎么开启游戏模式_Windows11优化
- Win11怎么关闭VBS安全性_Windows11
- php嵌入式日志记录怎么实现_php将硬件数据写入
- PHP中require语句后直接调用返回对象方法的
- c++如何利用doxygen生成开发文档_c++
- php485读数据时阻塞怎么办_php485非阻塞
- Windows电脑如何进入安全模式?(多种按键方法
- c++怎么使用std::unique实现去重_c+
- Win11如何设置开机问候语 Win11修改登录界
- Win11怎么设置闹钟_Windows 11时钟应
- Windows10如何更改日期格式_Win10区域
- Win10怎样卸载TeamViewer_Win10
- Windows10如何查看保存的WiFi密码_Wi
- Win10系统怎么查看显卡温度_Win10任务管理
- Win11文件扩展名怎么显示_Win11查看文件后
- Win11怎样安装剪映专业版_Win11安装剪映教
- php后缀怎么变mp4能播放_让php伪装mp4正
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- Win11怎么关闭OneDrive同步_Win11
- 如何在Golang中指定模块版本_使用go.mod

QQ客服