数据库中排序的对比及使用条件详解


Posted in PHP onFebruary 23, 2012

假定MySQL服务器和PHP服务器都已经按照最适合的方式来配置,那么系统的可伸缩性(Scalability)和用户感知性能(User-perceived Performance)是我们追求的主要目标。在实际运行中,MYSQL 中数据往往以 HASH tables、BTREE 等方式存贮于内存,操作速度很快;同时INDEX 已经进行了一些预排序;很多应用中,MySQL 排序是首选。

PHP与MySQL相比具有如下优势:

1、考虑整个网站的可伸缩性和整体性能,在应用层(PHP)中排序明显会降低数据库的负载,从而提升整个网站的扩展能力。而数据库的排序,实际上成本是非常高的,消耗内存、CPU,如果并发的排序很多,DB 很容易到瓶颈。

2、如果在应用层(PHP)和MYSQL之间还存在数据中间层,合理利用,PHP会有更好的收益。

3、PHP在内存中的数据结构专门针对具体应用来设计,比数据库更为简洁、高效;

4、PHP不用考虑数据灾难恢复问题,可以减少这部分的操作损耗;

5、PHP不存在表的锁定问题;

6、MySQL中排序,请求和结果返回还需要通过网络连接来进行,而PHP中排序之后就可以直接返回了,减少了网络IO。

至于执行速度,差异应该不会很大,除非应用设计有问题,造成大量不必要的网络IO。另外,应用层要注意PHP 的 Cache 设置,如果超出会报告内部错误;此时要根据应用做好评估,或者调整Cache。具体选择,将取决于具体的应用。

列出一些PHP中执行排序更优的情况:

1、数据源不在MySQL 中,存在硬盘、内存或者来自网络的请求等;

2、数据存在 MySQL 中,量不大,而且没有相应的索引,此时把数据取出来用PHP排序更快;

3、数据源来自于多个MySQL 服务器,此时从多个 MySQL 中取出数据,然后在PHP中排序更快;

4、除了MySQL 之外,存在其他数据源,比如硬盘、内存或者来自网络的请求等,此时不适合把这些数据存入MySQL 后再排序;

列出一些必须在MySQL中排序的实例:

1、MySQL中已经存在这个排序的索引;

2、MySQL中数据量较大,而结果集需要其中很小的一个子集;比如 1000000 行数据,取TOP 10;

3、对于一次排序、多次调用的情况,比如统计聚合的情形,可以提供给不同的服务使用,那么在MySQL 中排序是首选的。另外,对于数据深度挖掘,通常做法是在应用层做完排序等复杂操作,把结果存入MySQL即可,便于多次使用。

4、不论数据源来自哪里,当数据量大到一定的规模后,由于占用内存/Cache 的关系,不再适合PHP中排序了;此时把数据复制、导入或者存在MySQL ,并用INDEX 优化,是优于PHP 的。不过,用 Java,甚至 C++ 来处理这类操作会更好。 有些类似大数据集聚合或者汇总的数据,在客户端排序得不偿失。当然,也有用类似搜索引擎的思路来解决类似应用的情况。

从网站整体考虑,就必须加入人力和成本的考虑。假如网站规模和负载较小,而人力有限(人数和能力都可能有限),此时在应用层(PHP)做排序要做不少开发和调试工作,耗费时间,得不偿失;不如在DB 中处理,简单快速。对于大规模的网站,电力、服务器的费用很高,在系统架构上精打细算,可以节约大量的费用,是公司持续发展之必要;此时如果能在应用层(PHP) 进行排序并满足业务需求,尽量在应用层进行。

关于PHP中执行排序与MySQL中执行排序的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

PHP 相关文章推荐
PHP4 与 MySQL 数据库操作函数详解
Oct 09 PHP
php 常用类整理
Dec 23 PHP
了解Joomla 这款来自国外的php网站管理系统
Mar 11 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
php开启安全模式后禁用的函数集合
Jun 26 PHP
php网上商城购物车设计代码分享
Feb 15 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
Jun 22 PHP
php去掉文件前几行的方法
Jul 29 PHP
浅谈PHP中foreach/in_array的使用
Nov 02 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
Oct 25 PHP
laravel实现按时间日期进行分组统计方法示例
Mar 23 PHP
php判断目录存在的简单方法
Sep 26 PHP
PHP中几个常用的魔术常量
Feb 23 #PHP
PHP教程之PHP中shell脚本的使用方法分享
Feb 23 #PHP
php tp验证表单与自动填充函数代码
Feb 22 #PHP
PHP 设计模式之观察者模式介绍
Feb 22 #PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 #PHP
用穿越火线快速入门php面向对象
Feb 22 #PHP
php重定向的三种方法分享
Feb 22 #PHP
You might like
php实现图片缩放功能类
2013/12/18 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
python计算书页码的统计数字问题实例
2014/09/26 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
Pandas数据离散化原理及实例解析
2019/11/16 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
留学自荐信的技巧
2013/10/17 职场文书
模具专业推荐信
2013/10/30 职场文书
简历上的自我评价
2014/02/03 职场文书
检讨书怎么写?
2019/06/21 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS