老李分享:大数据性能调优案例

老李分享:大数据性能调优案例

1、“空间换时间”以及“内存中处理数据”

比如user_id.csv文件中有20万个不同的user_id,根据user_id去查其对应的用户最近发表的一篇帖子,取出post_id,post_title、post_time和user_id(post表中查,post表中有一列是user_id,表示帖子所属者),而帖子数目有大概两百万,那么如何处理呢?
我的解决方案是:
A. 先将post表post_id,post_title、post_time和user_id这四列导出到posts.csv文件中,然后利用一个CSV读取组件将posts.csv文件中的记录读取到csvRecords中
B. 然后利用“空间换时间的思想”,先将user_id.csv中的user_id读取到userIdList的List对象中,然后再将userIdList转为字典:
var userIdDict = userIdList.Distinct().ToDictionary(c => c, c => 1);
C. 最后比对userIdDict和csvRecords得到结果:
var resultRecords = csvRecords.Where(c => postDict.ContainsKey(c.UserId)).ToList(); // 这里ContainsKey的查询时间复杂度为O(1)

2、JOIN优化查询性能
一个页面查询效率非常低(一分多钟都没有结果),查询过程后台执行了3条SQL,其中2条SQL的执行时间都在39秒左右(2条SQL类似),造成数据库连接超时。
后台数据库查询用的是EF框架,而EF框架使用不当的话很容易导致糟糕的查询性能。
简单地模拟下(数据库表名已调整,记录数也有所改动,不影响结果):
用2张表:一张表为账户表比如account,记录数大概为3000条。另外一张表比如为帖子表post,记录数大概为190万。
然后后台处理过程大概是:先根据查询条件取得账户表的account_id的列表accountIds,然后再根据account_id列表去找post记录(post表有一个字段为account_id),大概这样:
var posts= db.Posts.Where(m).Where(c => accountIds.Contains(c.AccountId));
不需要过于关注这行代码,我用工具监测到这行代码对应的SQL为:
SELECT * from post
WHERE
((20 = account_id) OR (21 = account_id)) OR ...
ORDER BY created_at DESC
LIMIT 0, 15;
上面的OR条件大概有2000多个。EXPLAIN结果显示ROWS值达到134万多,也没有使用索引。
因为多了ORDER BY子句造成效率低,但是不能为了优化而省掉它,因为业务要求第一页显示最近的15篇帖子。
用JOIN查询,自己手工拼了一条SQL,发现几乎瞬间出结果,SQL大概如下:
SELECT * FROM 
posts AS A
JOIN
accounts AS B
ON A.account_id = B.id
WHERE A.category = 1 # 帖子的分类
ORDER BY A.created_at DESC
LIMIT 0, 15;
按照这个方法,舍弃EF,改用拼SQL的方法重写代码了。速度改进不少,原来需要近2分钟才能显示查询结果,现在只需要3-4秒。
这个场景用JOIN能提高查询效率,是因为一张表的记录数只有3000条左右,而另外一张有几百万的数据。如果两张表的数据都有几百万,那用JOIN未必能提高查询效率

3、业务逻辑代码层面优化
理解透彻业务逻辑,去除冗余业务逻辑代码

原文链接;http://www.cnblogs.com/laoli0201

时间: 2024-07-29 20:08:07

老李分享:大数据性能调优案例的相关文章

[大数据性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质是什么,以及 Spark 在性能调优部份的要点,这两点让直式进入性能调优都是一个至关重要的问题,它的本质限制了我们调优到底要达到一个什么样的目标或者说我们是从什么本源上进行调优.希望这篇文章能为读者带出以下的启发: 了解大数据性能调优的本质 了解 Spark 性能调优要点分析 了解 Spark 在资

[大数据性能调优] 第二章:彻底解密Spark的HashShuffle

本課主題 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 Shuffle 性能调优思考 Spark HashShuffle 源码鉴赏 引言 Spark HashShuffle 是它以前的版本,现在1.6x 版本默应是Sort-Based Shuffle,那为什么要讲 HashShuffle 呢,因为有分布式就一定会有 Shuffle,而且 HashShu

大数据性能调优之HBase的RowKey设计

Hbase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定位. HBase中rowkey可以唯一标识一行记录,在HBase查询的时候,有以下几种方式: 通过get方式,指定rowkey获取唯一一条记录 通过scan方式,设置startRow和stopRow参数进行范围匹配 全表扫描,即直接扫描整张表中所有行记录 (较新的hbase还可以通过column和v

性能调优案例分享:Mysql的cpu过高

性能调优案例分享:Mysql的cpu过高 问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务器的时候mysql cpu占用率为50%~60% .ps 1: 每个测试端所做事情就是插入记录,不过插入前会先查询一下是否已经有相同的记录,有的话就更新原有记录,没有就直接插入. ps 2: CPU--Pentium Dual E1240 @ 1.60GHZ内存--2GOS--Windows 2003调

老李分享大数据生态圈

老李分享大数据生态圈 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗瓢盆,各有各的用处,互相之间又有重合.你可以用汤锅直接当碗吃饭喝汤,你可以用小刀或者刨子去皮.但是每个工具有自己的特性,虽然奇怪的组合也能工作,但是未必是最佳选择.         大数据,首先你要能存的下大数据. 传统的文件系统是单机的,不能横跨不同的机器.HDFS(Hadoop Distributed FileSy

hbase性能调优案例

hbase性能调优案例 1.人员-角色 人员有多个角色  角色优先级 角色有多个人员 人员 删除添加角色 角色 可以添加删除人员 人员 角色 删除添加 设计思路 person表 rowkey cf1 - 人员基本信息  cf2 - 角色列表 pid cf1:pname=;cf1:age;..  cf2:rid=n数字.优先级;... person表--举例说明 001  cf1:pname=小周;cf1:age=1;    cf2:102=0; 002  cf1:pname=小明;cf2:age

老李分享大数据生态圈 1

老李分享大数据生态圈 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗瓢盆,各有各的用处,互相之间又有重合.你可以用汤锅直接当碗吃饭喝汤,你可以用小刀或者刨子去皮.但是每个工具有自己的特性,虽然奇怪的组合也能工作,但是未必是最佳选择.         大数据,首先你要能存的下大数据. 传统的文件系统是单机的,不能横跨不同的机器.HDFS(Hadoop Distributed FileSy

MySQL插入数据性能调优

插入数据性能调优总结: 1.SQL插入语句调优 2.如果是InnoDB引擎的话,尝试开启事务,批量提交 3.调整MySQl数据库配置 参考: 百度空间 - MySQL插入数据性能调优 CSDN - MySQL插入大量数据调优

老李分享大数据生态圈 2

        那如果我要更高速的处理呢? 如果我是一个类似微博的公司,我希望显示不是24小时热博,我想看一个不断变化的热播榜,更新延迟在一分钟之内,上面的手段都将无法胜任.于是又一种计算模型被开发出来,这就是Streaming(流)计算.                Storm是最流行的流计算平台.流计算的思路是,如果要达到更实时的更新,我何不在数据流进来的时候就处理了?比如还是词频统计的例子,我的数据流是一个一个的词,我就让他们一边流过我就一边开始统计了.流计算很牛逼,基本无延迟,但是它的