Mysql - 百万级数据查询优化笔记 (PHP Script) ②
Mysql - 百万级数据查询优化笔记 (PHP Script) ②
说明:要处理的是在一个脚本中统计的年度账单,和上一篇的处理思路完全
不同,先把全量取出,再按字典形式拼接,10w条数据只需要668s!
数据:
测试服:17w 正式服:280w
1.全量查询,减少链接断开次数,使用PHP处理,性能更高
一次性取出1000条数据,放在循环处理快,还是一次处理100,用数组处理更快?
提前取出好数据,以字典的形式在数组使用中进行拼接,脚本中的使用应该尽量避免连接和断开的消耗,性能提高的非常明显,17w测试数据,从8条/秒 提升到 140条/秒!
1.1 首先全量取出需要的数据
Array
([0] => Array([novel_id] => 67[novel_name] => 还阳[author_id] => 9[novel_wordnumber] => 144334)[1] => Array([novel_id] => 69[novel_name] => 做媒[author_id] => 19[novel_wordnumber] => 135685)
1.2 取出需要的数据,key是novel_id
,值是对应的novel_name
$novelNameDict = array_column($novelData, 'novel_name', 'novel_id');//执行结果:
<pre>Array
([67] => 还阳[69] => 做媒[70] => 共业招感[71] => 流心彩虹糖[72] => 雪中燃灯[73] => 王座[74] => 不言而喻[75] => 王以君倾[76] => 踏雪寻泥[77] => 有匪君子
)
1.3 获取Mysql中最小的数据,主要统计用户行为,所以对用户分组
SELECT `user_id` , `novel_id` , `chapter_id` , MIN(DATETIME) AS `datetime`
FROM `wm_novel_reward`
WHERE `user_id` BETWEEN 1 AND 1006
GROUP BY `user_id`
2.Mysql字符串需要转义
出于对安全的考虑,当mysql是字符串的时候,需要对字符串进行转义,保证sql语句的正常操作。
#面向对象风格
mysqli::real_escape_string ( string $escapestr ) : string
#过程化风格
mysqli_real_escape_string ( mysqli $link , string $escapestr ) : string
3.UNION ALL 处理分表业务
当数据量的时候,就可能会分表,分表的时候多使用UNION ALL
解决,代码如下:
$commentMostSqlArr = [];
for ($i = 0; $i < 128; $i ++) {$table = 'cp_comment_msg_uid_'.$i;$commentMostSqlArr[] = "SELECT `uid`,`nid` ,`module_name` ,`aid` ,`author_name` ,count(module_id) AS count_comment_number FROM {$table}Where `uid` BETWEEN {$minUid} AND {$maxUid} AND `gift_id` = 0 AND `create_time` > {$total_start_time} AND `create_time` <= {$total_end_time} Group by nid, uid ";}
$commentMostSql = "SELECT * FROM (" . implode(" UNION ALL ", $commentMostSqlArr) . ") t";
4.避免重复数据
4.1 数据重复有两个方面,一个是PHP数组数据的重复,一个是Insert
语句重复,解决办法如下:
PHP数据重复使用array_unique( $array )
,注意键名保留不变,array_unique() 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。
4.2 Mysql Insert 去重
如果我们设置了唯一索引,那么在插入重复数据时,SQL 语句将无法执行成功,并抛出错。
INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE INTO 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
以下实例使用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:
INSERT IGNORE INTO person_tbl (last_name, first_name) VALUES( 'Jay', 'Thomas');
而 REPLACE INTO 如果存在 primary 或 unique相同的记录,则先删除掉。再插入新记录。
5.insert优化
INSERT INTO
可以拼接一次插入数据库,比单条插入的性能要快很多,尤其是多条的时候,也有一个小缺点,当其中一个字段有问题时整条语句一起失败。
INSERT INTO `annual_report_2020`(`user_id` ,`user_regtime` ,
)
VALUES ( 2 ,1500341346 ) ,( 5 ,1502195321 ) ,( 6 ,1502242604 )
5.执行结果
测试服: 173662 1296m 每次读取1000条 133row/s
Mysql - 百万级数据查询优化笔记 (PHP Script) ②相关推荐
- mysql百万级数据查询优化实践-从开始到开除
在某个项目中,订单表每天会产生5-10万条记录. 先前对大数据查询没多少处理经验,碰到难以查动的统计数据通常是建一张表,定时统计一次.或者写存储过程,优化查询过程. 按照以往一贯思路,建表,加索引. ...
- Mysql 百万级数据优化资料
Mysql 百万级数据优化资料 一.我们可以且应该优化什么? 硬件 操作系统/软件库 SQL服务器(设置和查询) 应用编程接口(API) 应用程序 -------------------------- ...
- php mysql百万级数据_php+mysql百万级数据怎么排序_PHP教程
php+mysql百万级数据如何排序? php+mysql百万级数据分页.因涉及多表多条件联合查询.谁能帮忙优化下面的查询语句. if(empty($wheresql)){ $wheresql=&qu ...
- MySQL百万级数据查询
MySQL百万级数据排序分页查询 1. 需求 按照成绩降序排序,查询字段学号(id),姓名(name),分数(score),带排序的分页查询 数据大小:五百万条 2. 初始状态 浅分页: # 浅分页 ...
- MySql 百万级数量查询优化总结
1.前言 最近所在项目接触到了百万级人口数据的功能开发,就这次开发也就准备记录下MySql的百万级别数量查询的设计和优化方案,技术能力受限,分享出来和大家一起讨论讨论. 2.数据准备 网上也有很多快速 ...
- MySQL百万级数据大分页查询优化
前言:在数据库开发过程中我们经常会使用分页,核心技术是使用用limit start, count分页语句进行数据的读取. 一.MySQL分页起点越大查询速度越慢 直接用limit start, cou ...
- php mysql百万级数据_PHP+MySQL百万级数据插入的优化
插入分析 MySQL中插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭 ...
- MySQL百万级数据分页查询及优化
点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:https://www.cnblogs.com/geningchao 关注我,回复口令获取可获取 ...
- MySQL 百万级数据量分页查询方法及其优化
来源:http://sina.lt/gauW 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适 ...
最新文章
- 关于学习Python的一点学习总结(46->属性访问)
- 警告:黑客发动在线钓鱼攻击不再依赖电子邮件
- 笔记-计算机网络基础-综合布线系统
- 今日arXiv精选 | 13 篇 ICCV 2021 最新论文
- 探讨8.0版本下后台service存活机制及保活
- Django视图(一)
- Java字节序,java整型数与网络字节序 byte[] 数组转换关系
- linux远程虚拟桌面,2020-07-23 Linux 远程连接虚拟桌面
- linux查看cpu占用率_Linux 性能查看
- python映射的主要特点_Python入门 4——字典及其映射
- 两种方法求解 正数数组中 两个数相减 的最大值
- 关于Dos窗口的设置
- 做一个完整的Java Web项目需要掌握的技能[转]
- vant-ui 有赞ui官网打不开?
- Git LFS(Large File Storage)使用简介
- SQL语句模糊查询 JavaWeb 项目 dao层 【常用来做搜索框】
- centos8 内核升级
- PM必读|如何成为卓有成效的产品经理
- 放弃使用禁用驱动强制签名了,建议申请驱动签名证书
- 优思学院|六西格玛对于企业的作用,你了解多少?
热门文章
- Open3D-GUI系列教程(三)界面布局
- 分享127个ASP源码,总有一款适合您
- 告别Anaconda: Pycharm最简单的通过pip下载python包的方法(没有之一)
- bp神经网络预测模型例题,bp神经网络模型是什么
- 硕士开题报告模板、博士专家推荐信、科研课题申报模板大全
- ENVI5.6保姆式安装教程,超详细;附PoJie版安装包
- 字节跳动、今日头条、阿里爸爸都在使用Flutter,你还有拒绝的理由?
- 力扣春季编程大赛(LCCUP‘21)
- t6登录显示连接不到服务器,t6客户端登陆不到服务器
- 452页13万字现代智慧乡镇雪亮工程整体解决方案2022版