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


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 相关文章推荐
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
php foreach 使用&(与运算符)引用赋值要注意的问题
Feb 16 PHP
PHP 抓取网页图片并且另存为的实现代码
Mar 24 PHP
php开发环境配置记录
Jan 14 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 PHP
php上传大文件失败的原因及应对策略
Oct 20 PHP
php实现的递归提成方案实例
Nov 14 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
PHP封装的完整分页类示例
Aug 21 PHP
PHP类的自动加载与命名空间用法实例分析
Jun 05 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入门的学习方法
2007/01/02 PHP
给Function做的OOP扩展
2009/05/07 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
Python 功能和特点(新手必学)
2015/12/30 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
双方协议书
2014/04/22 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年药店工作总结
2014/11/20 职场文书
子女赡养老人协议书
2016/03/23 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
Python学习之包与模块详解
2022/03/19 Python
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏