概述
项目场景是给做用户年报,项目属于活动类型,需要维持1个月左右,需要统计用户操作的一些数据,主要是统计方面的,当时注册用户大概280w左右,书单、评论、打赏还可以,之前的数据做过分表,只有阅读记录log大概将近1亿条,是个大难点。
技术方案
1.全量查询,减少链接断开次数,使用PHP处理,性能更高
一次性取出1000条数据,还是一次处理100? 答案是取1000条,如果服务器的内存允许,一次可以取更多条,应该尽量避免mysql进程中连接和断开的消耗,性能提高的非常明显,17w测试数据,从8条/秒 提升到 140条/秒!
【资料图】
把数据量偏小的取出,做map映射,以提高最大的性能,再使用的地方用key拼接使用。
Array( [67] => 还阳 [69] => 做媒 [70] => 共业招感 [71] => 流心彩虹糖 [72] => 雪中燃灯 [73] => 王座 [74] => 不言而喻 [75] => 王以君倾 [76] => 踏雪寻泥 [77] => 有匪君子)
2. 获取Mysql中最小的数据,主要统计用户行为,所以对用户分组
SELECT `user_id` ,`novel_id` ,`chapter_id` ,MIN(DATETIME) AS `datetime`FROM `wm_novel_reward`WHERE `user_id` BETWEEN 1AND 1006GROUP BY user_id`
出于对安全的考虑,当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.避免出现重复数据
1.数据重复有两个方面,一个是PHP数组数据的重复,一个是Insert
语句重复,这样解决的:
PHP数据重复使用array_unique( $array )
,注意键名保留不变,array_unique() 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。
2.mysql层面使用sql语句去重,使用 INSERT IGNORE INTO
去重:
INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE INTO 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
以下实例使用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据,而 REPLACE INTO 如果存在 primary 或 unique相同的记录,则先删除掉。再插入新记录,再性能上会慢一些。
INSERT IGNORE INTO person_tbl (last_name, first_name) VALUES( "Jay", "Thomas");
5.insert批量添加操作
INSERT INTO
可以拼接一次插入数据库,比单条插入的性能要快很多,尤其是多条的时候,也有一个小缺点,当其中一个字段有问题时整条语句一起失败。
INSERT INTO `annual_report_2020`(`user_id` ,`user_regtime` ,)VALUES ( 2 ,1500341346 ) , ( 5 ,1502195321 ) , ( 6 ,1502242604 )
6.系统配置参数上的优化
1.memory_limit设置脚本内存
memory_limit
的值是越大越好么?当然不是,memory_limit
主要是为了防止程序 bug, 或者死循环占用大量的内存,导致系统宕机。在引入大量三方插件,或者代码时,进行内存限制就非常有必要了。
memory_limit
会使每个 PHP process 都占用固定的内存?memory_limit 只是限制了每个 PHP进程的内存占用上限,而不是为每个进程分配了固定的内存。所以,并不会因为 memory_limit 设置越大,导致并发数出现降低。
2.set_time_limit设置脚本执行时间
在php中set_time_limit函数是用来限制页面执行时间的,如我想把一个php页面的执行时间定义为5秒
就可以set_time_limit(5)了,规定从该句运行时起程序必须在指定秒数内行结束,0代表不限制。
set_time_limit(0);ini_set("memory_limit", "1024M");
7.关于内存的说明
很多时候我们都在说内存,其实内存的概念很笼统,内存分为CPU上的缓存(catch)和内存条上的内存(Memory),平时说的服务器8G内存指的是内存条上的内存。Cpu已经从Lmp总线型,升级成NUMP的方式,Nginx就是利用NUMP很好的例子。
其实有一个问题特别迷惑,Mysql数据库里的数据就是以特殊结构存储(B-tree)的文件,Redis中的数据也是用(list、hash)结构存储的数据,存储上没有什么太大的不同,只是有快慢的区别。
而高性能就是尽最大的程度上利用Cpu和内存,提高吞吐量,词很贴切。
至此
后来在正式环境执行的时候,我们还是遇到了别的问题,等我有时间再整理,不要打断这一篇博客主题,我们下一篇见,谢谢您的阅读。
-
Mysql - 多张千万级统计数据实践笔记(PHP Script)|微资讯
项目场景是给做用户年报,项目属于活动类型,需要维持1个月左右,需要统计用户操作的一些数据,主要是统计方面的,当时注册用户大概280w左右,
-
世界最大军用飞机墓地 播资讯
1、美国亚利桑那州图森市美军戴维斯—蒙森空军基地的“退役飞机墓地”占地面积约10 5平方公里。2、相当于1430个足
-
今日视点:我国即时配送年订单量超400亿单!阡陌交通点亮流动中国
不管白天还是黑夜,车灯亮起,车上的人就要开始赶路。赶路的人中,有一位名叫陈佳欣的女孩,刚刚21岁的她,已经是一位三岁女孩的妈妈,丈夫意
-
每日快看:瑞联新材:2022年归母净利润2.47亿元增长3.10%
瑞联新材:2022年归母净利润2 47亿元增长3 10%:瑞联新材公布2022年度业绩快报,报告期内,公司实现营业收入14 8亿元,同比下降2 96%;实现归属
-
周小兵
1、周小兵是1986年的世界少年乒乓球大赛的冠军。2、接下来的30年时间里,他进过乒乓国家队,当过教练,后又经商成为金融
-
梦幻西游符石合成技巧_梦幻西游符石合成技巧攻略
1、梦幻西游符文石合成技能,一起来看看吧。2、想要合成高等级的符文石,首先要获取一些一级符文石,那么一级符文石从哪里获取
-
每日看点!光纤猫_关于光纤猫的介绍
1、路由光猫。2、是泛指将光以太信号转换成其它协议信号的收发设备。本文到此结束,希望对大家有所帮助。
-
中原豪宅STATELYHOME-全球今日报
1、「中原豪宅STATELYHOME」是中原地产旗下的豪宅服务品牌,特别为品味高尚及具投资睿智的人士而设;荟萃了豪宅
-
每日观察!442评选50大足球球队之31-40位
昨日点评了英国杂志442评选的50大球队41-50位,今天再来聊一聊31-40名!第40位:1930-1935年的阿森纳这是阿森纳第2次上榜,看来442对阿森纳
-
一锅双星|世界动态
1、一锅双星是指一个卫星天线装2个高频头。2、同时能接收2个不同卫星的信号。3、但接收机盒必须支持2个或更多高频头接口。
-
天天观焦点:lol地图修改器怎么用_lol地图修改器
1、1是夏天。2、 把Map2是秋天,那其它地图呢、水晶之痕、打开LOL文件夹所在位置,打开后看见有个LEVELS
-
内网Windows时间服务器搭建_局域网时间服务器搭建|天天即时看
1、在工作中,我在内网遇到过几台时间不准确的电脑。因为是内网,所以无法与互联网时间同步。有一台空闲的WindowsSe
-
中国郷村祭祀研究
1、《中国郷村祭祀研究》是東京大学出版会出版的图书。2、作者是田仲一成。文章到此就分享结束,希望对大家有所帮助。
-
只会打拜仁?门兴赢拜仁之后本轮0-4惨负美因茨_世界热文
直播吧2月25日讯在北京时间今日凌晨进行的一场德甲联赛中,门兴格拉德巴赫客场0-4惨败给美因茨。值得注意的是,上一轮他
-
什么是胶版纸_何谓胶版纸
欢迎观看本篇文章,小升来为大家解答以上问题。什么是胶版纸,何谓胶版纸很多人还不知道,现在让我们一起来看看吧!1、胶版纸,
-
局促不安的意思
1、局促不安,汉语成语,拼音是júcùbùān,意思是拘谨不自然,形容举止拘束,心中不安。2、出自《东周列国志》。
-
硕贝德董秘回复:公司可为客户提供智能终端天线、基站天线、汽车智能天线、散热器件组件
硕贝德(300322)02月25日在投资者关系平台上答复了投资者关心的问题。
-
全国计算机等级考试3月1日起报名考试将于3月25日至27日进行
2月24日,记者从陕西省教育考试院了解到,2023年上半年全国计算机等级考试将于3月25日至27日进行,考试报名时间3月1日9时至7日17时;缴费时间为3月1日
-
为年轻打call
1、《为年轻打call》是吕蔷演唱的歌曲。2、由林伟填词、张思齐谱曲。3、于2018年7月10日以数字单曲的形式发行
-
如何解决唇周暗沉的情况? 环球要闻
一招告别黑嘴角??下巴闭口??仙女唇养成2 0????步骤比较简单,使用到的产品也很平价??最重要的是真的很有效哈哈哈??首先:为新来的姐妹日常科普
-
美股异动 | Block涨1% Q4营收增长强劲 2023年EBITDA指引超预期
格隆汇2月24日丨Block涨1 48%,报75,25美元,总市值453亿美元,盘中一度涨近5%。Block第四季度营收增长14%至46 5亿美元,超预期的45
-
衡水市第三中学
1、衡水市第三中学位于市区中心——人民东路340号,始建于1973年。2、历经四十余年的团结拼搏、改革创新,三中已发展成
-
银保监会:房贷提前还款困难正在逐步缓解
记者今天从银保监会了解到,近期银保监会召开专题会议,要求银行加快处理积压的房贷提前还款申请,做好提前还款服务。同时,专门发布风险提示
-
日本留学生活_日本留学生活
1 对很多人客气一点都不奇怪。日本人很多事情都要表达“道歉”,甚至是一些我们不需要道歉的事情。“比如日本人在路上捡到一个
-
关于标志性的大众甲壳虫Herbie的10个有趣事实
Herbie首次出现在1968年的电影TheLoveBug中。但它变得如此受欢迎,以至于随后出现了一系列电影和电视剧,其
-
于元强于元
1、于元强于元(1920年-1947年),男,山西省长治人。2、生前为41团战士。1947年在太谷县牺牲。文章到
-
上一次是没鸡蛋,这一次是蔬菜限购!英国人愤怒刷屏:都是脱欧的错 天天讯息
当地时间周四早上,一则话题 BrexitFoodShortage(脱欧导致食品短缺)的话题登上推特热门。无数英国购物者分享了空荡荡的货架照片,而在欧洲其他国家,
-
乌鲁木齐市文化馆西域男声合唱团招募新成员(附报名方式)
报名要求一、身体健康、热爱艺术、热爱合唱,具有团队奉献精神。二、能自觉遵守合唱团各项规章制度,正常参加合唱团排练、演出及各类活动。三
-
中国移动业务大厅_中国移动业务
1、中国移动业务是一个大概念,中国移动提供的服务特别多,例如手机话费充值,流量业务,短信和彩信业务等等。2、下面以为企业
-
唱响交通文明 全国交通安全大篷车走进万宁
2月23日,伴随着轻盈曼妙、清新灵动的黎族竹竿舞,由中央文明办、中央政法委、公安部交通管理局共同主办的全国交通安全大篷车“童”行美丽...