数据倾斜了怎么办?以应届生 20K Offer 为例
数据倾斜,技术黑话中最成功的的一个词。发明这个词儿的人,一定是天才,它在数据量和复杂度上,一箭双雕。
早期,我在看《Oracle Concepts》及各类 Oracle Performance Tunning 相关的技术书时,书中提到最多的术语是“数据分布”,比如用 statistics 统计每列的散值。这里的散值,又称单值,或“唯一值”,代表每列的基数 (Cardinality).
比如全世界就两种性别,男和女。无论男女数量多么不平衡,就性别来说,只有“男”,“女”两个单值,用数据库行话说,Cardinality 为 2.
那么知道每列的基数,有什么用呢,研究数据倾斜又有啥用?这种凡事先问有啥用的精致利己的心态,从求学时代,就与我纠缠不清。
所以,到底为什么要研究数据倾斜这个话题呢,我先放几张图,做个引子:
第一张图,为艾瑞咨询绘制的中国 IT服务行业,毕业生薪资流向的分布图。这张图的实际薪资曲线,符合正态分布
薪资区间,分别从左往右以 4.5%, 29%, 34.8%,25.6%,6.1% 的占比存在,可见大多数毕业生(29% + 34.8% + 25.6% =89.4%),初次入职时,薪资在 5K - 20K 之间。
假设,有 1000人参与了这次调查,那么你作为老板,要招个有 1 年经验,还能出活的劳动力,而且预算不能超过 5K,只要去 45 个人里面招,就能快速招到你要的人。
如果作为老板的你,愿意开出有竞争力的工资,比如 20K,你可以从 894 个人里面招,但如此巨大的规模,也增加了面试的时间成本。
考虑到社会的毒打,人的潜能被充分发挥,经过一定时间沉淀,社会人的薪酬,就不像应届生排列得那么符合正态分布了
以 20K 为分水岭,DBA 薪资往 20K 以上倾斜,这个范围的占比为 44.4%+ 21.2% = 65.6%.
同样以 1000人为调查基数,意味着以 50K 去招人,面试者可能会超过 656 人,面试时间成本太高。而 6K 去招人,则只需面试 30人,快则 2 天,人就到位。
此时,我们可以得到一个经验:数据发生倾斜是必然,极端的数据非常好找,但落到正态分布的中间位置,找起来就复杂了,所以得同时配备其他属性,才能更好定位到相关数据。
既然 20K-50K 的 DBA 人数那么多,怎样才能更快地招到人呢。有一个办法是,从低价格的地方挖人。
比如:
对比发现,贵阳地区以 8K 为平均数,那么直接以 20K 的价格,则可以很快招到人。
你看,加一维数据量就变小了。这就是处理数据倾斜的一个有效方法,以薪酬水平加地区,极大地减少样本数量,提高了筛选效率。
细看数据倾斜的解决方法,本质是判断怎么建索引更有效。最为关键的一步,是计算列组合的数据量占总数的比例,越低越有效。
那么,怎么计算列组合产生的基数高低呢,总不能每次全表扫描,做一遍排列组合计算吧?
接下来说两个常用的事前策略:
第一,是直觉。作为设计者,对业务数据的分布,一定会有意识。比如做零售,按照日期和门店做索引,肯定订单量分散更低;
第二,是做 Hash 索引。假设你在日期上装了索引,但查询里面,基本不按日期搜索,索引白建。于是,找两个或多个常用判断字段,做 Hash 索引。这样,就碎化了组合查询的密度,提高了效率
以上的策略,主要考量命中率。怎么分析命中率,这属于优化界的秘密武器,每个数据库厂商都有自己的数据字典,需要有好奇心的读者,慢慢摸索。原理都相通!
举个例子, SQL Server 中,有一种叫做 Statistics 的东西。它就是用来统计基数以及命中率的对象。
它通过统计每列或列组合的单值总数,计算在表总数据量上的占比。由此计算出这列的命中率,继而判断是否适合做索引。
使用以下命令即可查询每列或列组合的单值总数:
DBCC SHOW_STATISTICS('Sales.SalesOrderDetail', IX_SalesOrderDetail_ProductID)
这就是索引 IX_SalesOrderDetail_ProductID 的密度(Density). 密度越低,查询的命中率就越高,效率就越高
当然,用密度来预判命中率,也有一定的缺陷,需要注意很多地方,比如和柱状图的连用等等。详细的技术实战参考这篇文章:
【万字详解】SQL 优化引擎内幕
点击上方链接直达,为你详细解释 statistics 的查询,创建和效率优势,包括:
Statistics 分别有哪些查询方法
Statistics 分别有哪些创建方法
Statistics 在查询中的效率优势
好了,分享就到这里。最近魔都发生了些事,大家都知道了。作息,情绪都有些影响,所以更新频率有些慢,各位多担待。
--完--
往期精彩:
本号精华合集(三)
外企一道 SQL 面试题,刷掉 494 名候选人
我在面试数据库工程师候选人时,常问的一些题
零基础 SQL 数据库小白,从入门到精通的学习路线与书单
数据倾斜了怎么办?以应届生 20K Offer 为例相关推荐
- 应届生昆山offer和上海户口offer要如何选择?
这两天还在苏州,没有感受苏州的什么好地方,天气有点微凉,有秋天的味道,同行的何总是一个很闷的人,我总想让他跟我说说故事,每次他都说「我是一个没有故事的男人」,是的,一个从毕业就开始从事测试工作10几年 ...
- 应届生拿到offer之后的流程_应届生签offer前需要参考的注意事项
大学毕业生经过重重考验拿到 offer 之后, 下一步要面临的问题就是签约. 而如果有的同 学之前已经跟其它单位签约,现在又想和新单位签约,那么又涉及到一个问题:违约. 下面 给大家讲讲应届生签约最应 ...
- 就业数据|北上广深不再是首选,应届生奔向新一线
来源:猎聘 本文约4900字,建议阅读10分钟 总体就业形势严峻,压力与机遇并存. 2023年高校毕业生预计达1158万人,创历史新高.大学生作为重点就业人群之一,历来备受社会各界关注. 时值大学生就 ...
- IT业称霸应届生薪酬榜,调查超27万毕业生后,有了这些发现
薪资,一直是求职者在找工作时考虑的重点要素之一. 恰逢当下这个大型毕业.升学季,麦可思研究院近期发布了<2022年中国大学生就业报告>,揭露2021届大学生毕业半年后的就业情况.同时,也为 ...
- 蓬莱小课:零基础应届生如何转行学数据分析师?
任何经验之谈,都是要亲身实践过,才能知道它的价值,希望以下文字,能对你们的职业道路有一丢丢用处. 关于转行 转行不转职,转职不转行.这句话是老生常谈了.现在互联网兴起,新职业层出不穷,碰到不感兴趣的岗 ...
- 应届生应聘大数据开发工程师,有没有机会?
本科应届生想去应聘大数据开发工程师的岗位有没有机会? 我平时用的语言是Java和Python,看过<机器学习实战>(python)和<Hadoop权威指南>,确实很多地方一知半 ...
- 本科应届生应聘大数据开发工程师,有机会吗?
本科应届生想去应聘大数据开发工程师的岗位有没有机会? 我平时用的语言是Java和Python,看过<机器学习实战>(python)和<Hadoop权威指南>,确实很多地方一知半 ...
- 今年嵌入式行业研究生应届生毕业大概薪资多少,大数据告诉你
今年嵌入式行业研究生应届生毕业大概薪资多少,大数据告诉你 一个从本科开始学了四年嵌入式的老师傅,在这里唠嗑两句.目前年薪大约25左右吧. 先谈谈我的母校的毕业生情况吧. 我的母校是一个普通二本,许多本 ...
- 「历时6个月招聘数据收集」致应届生的一份招聘市场报告
很多毕业生都对今年的岗位招聘感到担忧,那么从历史数据找找规律吧 一.前言 很多朋友都对今年对招聘市场感觉不乐观,还有一些想要进入互联网行业的朋友,有没有迷茫过?不知道学什么或者从何学起?哪些是市场上热 ...
最新文章
- 类脑量子叠加脉冲神经网络:从量子大脑假说到更好的人工智能
- getitemdata中参数设置
- boost::parameter::aux::maybe相关的测试程序
- SAP CRM business partner determination原理介绍
- 学习node.js的一些笔记
- Python技术知识清单(数据科学)
- python基础系列教程——Python3.x标准模块库目录
- 快手作者视频如何批量下载
- AutoCAD输出矢量图
- Jeff Dean执笔:一文看尽2018谷歌AI重大突破
- sqlserver transact-sql UPDATE tran 用事务处理更新语句
- 对比Ruby和Python的垃圾回收
- linux中 777,755等用户权限说明
- chrome去广告插件
- 天线远场定义_天线场区划分的定义
- 记笔记非常好用的一款工具 eDiary
- 免费下载国际学术论文SCI期刊文献软件,SCI-HUB EVA
- Android集成微信支付SDK,实现支付功能
- F-35 战斗机的代码量达到 800 万行,C语言竟然占到424万行,看来航电系统还得靠C(纯C)。
- 上班没事做gai这么办