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) ②相关推荐

  1. mysql百万级数据查询优化实践-从开始到开除

    在某个项目中,订单表每天会产生5-10万条记录. 先前对大数据查询没多少处理经验,碰到难以查动的统计数据通常是建一张表,定时统计一次.或者写存储过程,优化查询过程. 按照以往一贯思路,建表,加索引. ...

  2. Mysql 百万级数据优化资料

    Mysql 百万级数据优化资料 一.我们可以且应该优化什么? 硬件 操作系统/软件库 SQL服务器(设置和查询) 应用编程接口(API) 应用程序 -------------------------- ...

  3. php mysql百万级数据_php+mysql百万级数据怎么排序_PHP教程

    php+mysql百万级数据如何排序? php+mysql百万级数据分页.因涉及多表多条件联合查询.谁能帮忙优化下面的查询语句. if(empty($wheresql)){ $wheresql=&qu ...

  4. MySQL百万级数据查询

    MySQL百万级数据排序分页查询 1. 需求 按照成绩降序排序,查询字段学号(id),姓名(name),分数(score),带排序的分页查询 数据大小:五百万条 2. 初始状态 浅分页: # 浅分页 ...

  5. MySql 百万级数量查询优化总结

    1.前言 最近所在项目接触到了百万级人口数据的功能开发,就这次开发也就准备记录下MySql的百万级别数量查询的设计和优化方案,技术能力受限,分享出来和大家一起讨论讨论. 2.数据准备 网上也有很多快速 ...

  6. MySQL百万级数据大分页查询优化

    前言:在数据库开发过程中我们经常会使用分页,核心技术是使用用limit start, count分页语句进行数据的读取. 一.MySQL分页起点越大查询速度越慢 直接用limit start, cou ...

  7. php mysql百万级数据_PHP+MySQL百万级数据插入的优化

    插入分析 MySQL中插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭 ...

  8. MySQL百万级数据分页查询及优化

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:https://www.cnblogs.com/geningchao 关注我,回复口令获取可获取 ...

  9. MySQL 百万级数据量分页查询方法及其优化

    来源:http://sina.lt/gauW 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适 ...

最新文章

  1. 关于学习Python的一点学习总结(46->属性访问)
  2. 警告:黑客发动在线钓鱼攻击不再依赖电子邮件
  3. 笔记-计算机网络基础-综合布线系统
  4. 今日arXiv精选 | 13 篇 ICCV 2021 最新论文
  5. 探讨8.0版本下后台service存活机制及保活
  6. Django视图(一)
  7. Java字节序,java整型数与网络字节序 byte[] 数组转换关系
  8. linux远程虚拟桌面,2020-07-23 Linux 远程连接虚拟桌面
  9. linux查看cpu占用率_Linux 性能查看
  10. python映射的主要特点_Python入门 4——字典及其映射
  11. 两种方法求解 正数数组中 两个数相减 的最大值
  12. 关于Dos窗口的设置
  13. 做一个完整的Java Web项目需要掌握的技能[转]
  14. vant-ui 有赞ui官网打不开?
  15. Git LFS(Large File Storage)使用简介
  16. SQL语句模糊查询 JavaWeb 项目 dao层 【常用来做搜索框】
  17. centos8 内核升级
  18. PM必读|如何成为卓有成效的产品经理
  19. 放弃使用禁用驱动强制签名了,建议申请驱动签名证书
  20. 优思学院|六西格玛对于企业的作用,你了解多少?

热门文章

  1. Open3D-GUI系列教程(三)界面布局
  2. 分享127个ASP源码,总有一款适合您
  3. 告别Anaconda: Pycharm最简单的通过pip下载python包的方法(没有之一)
  4. bp神经网络预测模型例题,bp神经网络模型是什么
  5. 硕士开题报告模板、博士专家推荐信、科研课题申报模板大全
  6. ENVI5.6保姆式安装教程,超详细;附PoJie版安装包
  7. 字节跳动、今日头条、阿里爸爸都在使用Flutter,你还有拒绝的理由?
  8. 力扣春季编程大赛(LCCUP‘21)
  9. t6登录显示连接不到服务器,t6客户端登陆不到服务器
  10. 452页13万字现代智慧乡镇雪亮工程整体解决方案2022版