html网易云音乐vip破解版的相对定位怎么做的

2.5K595 条评论分享收藏感谢收起赞同 14320 条评论分享收藏感谢收起2.5K595 条评论分享收藏感谢收起赞同 14320 条评论分享收藏感谢收起一只自学的前端攻城狮
2019届网易云音乐前端实习生电面心得
电面进行了38分钟,虽然总的来说回答的并不是很好,但是也初步了解了一线技术岗对前端岗位的需求和要求,收获很大。
之前学习前端的心一直飘来飘去,没有静下来学习基础知识和深入理解原理,只停留在对工具框架的使用学习上
面试的心得一句话来说就是基础很重要,
比喻说来就是,我去应聘车厂的员工,面试官会比较关心汽车零部件的型号大小和使用和维修方法胜过对驾驶技巧的考核。
这可能是从针对本科生的角度来考核,如果是社会招聘可能除了基础要扎实,可能对于一些框架的使用和理解也要有一定深度吧
第一次面试因为基础不牢,只答对了很少的题目,但是面试官很Nice,说没关系,继续引导和提问下一个方面的问题。虽然最后没有告诉我名字,但还是十分感谢!
知乎程墨老师在live里说过面试的英文是interview,重点是inter,互动是双方的,心态很重要,和面试官的地位也是平等的,会什么就说什么,要不卑不亢。
会我就说,不会我就学,下次再来不是吗?
blabla简要介绍自己的姓名学校专业,项目经历和学习过程,介绍的可以不必太细,但是亮点可以着重介绍,引导面试官接下来提问,
虽然写在了项目的第一个,但是面试官一句话都没问,可能是网易云对小程序方面没有业务需求,或者说实现的原理较为简单,就没有考核
J2EE选课系统
这是你一个人做的吗?
这是你的课程设计吗?
为什么用jsp做前端?
偏向于后台对吗?
可能对后台方面的考核不是重点,项目也没什么亮点,问完这个问题,面试官就过了
js游戏引擎
是使用还是自己开发?
谈一下印象比较深刻的技术吗?
谈到Game Loop面试管还是很感兴趣的,但是可惜自己没有深入研究
Game Loop实现方法
通过函数控制
initialize();
while(game running) {
具体的实现方法
回答的不好..
var _runLoop = function() {
if(mIsLoopRunning) {
// stepA: set up for next call to _runLoop and update input!
requestAnimationFrame( function() {_runLoop.call(mMyGame);});
// stepB:compute elapsed time since last RunLoop was executed
mCurrentTime = Date.now();
mElapsedTime = mCurrentTime - mPreviousT
mPreviousTime = mCurrentT
mLagTime += mElapsedT
// stepC:update the game the appropiate number of times.
// update only every Milliseconds per frame.
// if lag larger then update frames, update until caugth up.
while((mLageTime &= kMPF) && mIsLoopRunning) {
this.update();
mLagTime -= KMPF;
// stepD:now let's draw
this.draw(); // call MyGame.draw()
canvas表现动态效果的原因
getContext()控制canvas
方法应该是只能调用一次的呀,为什么能够实现动态变化呢?
通过update函数进行定时刷新
getContext()参数的取值
“2d”, 导致建立一个 CanvasRenderingContext2D 对象代表一个二维渲染上下文。
“webgl” (或”experimental-webgl”) 这将创建一个 WebGLRenderingContext
代表三维渲染上下文对象。这种情况下只能在浏览器实现WebGL 版本1(OpenGL ES 2.0)。
“webgl2” (或 “experimental-webgl2”) 这将创建一个 WebGL2RenderingContext 代表三维渲染上下文对象。这种情况下只能在浏览器实现 WebGL 版本2 (OpenGL ES 3.0)。
“bitmaprenderer” 这将创建一个 ImageBitmapRenderingContext 只提供功能去替换指定 canvas 的ImageBitmap内容
在你们这个项目中使用的是那种类型的参数呢?
canvas不支持webgl的替代支持的类型是那个?
游戏开始加载过程器的执行逻辑?
资源管理的过程,保证游戏流畅性
盒模型的组成
css中指的是那个部分
chorme 中的宽度属性100px 指的是哪几个部分?
box-sizing 属性
content-box
这是由 CSS2.1 规定的宽度高度行为。
宽度和高度分别应用到元素的内容框。
在宽度和高度之外绘制元素的内边距和边框。
border-box
为元素设定的宽度和高度决定了元素的边框盒。
就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。
通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度。
规定应从父元素继承 box-sizing 属性的值。
清除浮动的方法
父级DIV定义高度
结尾处加空标签 clear:
父级DIV定义伪类:after
父级DIV overflow:
父级DIV overflow:
父级DIV 一起浮动
父级DIV display:table
结尾br定义 clear:
clear:both是不是要在每一个清除浮动的元素上面都设置这个属性呢?能不能通过伪类来做呢?
可以通过一个额外的类加在dom上
IE8 和 非IE浏览器才支持:after,zoom属性可以解决IE6,iE7的浮动问题
css中的动画属性
css了解不多,用过wx小程序的api
动画是使元素从一种样式逐渐变化为另一种样式的效果。
语法:animation: name duration timing-function delay iteration-count direction fill-mode play-
真的不该给自己挖坑的…wx动画的api是封装的,没有理解过原理
是用js做的动画吗
css中的单臂(?)变化,就是对元素进行平移和缩放操作的话
transform: none|transform-
能列举一下它的属性吗
translateX(x)
translateY(y)
能列举几个选择器吗
类,id,标签,后代,子元素选择器…
相邻兄弟选择器:
h1 + p {margin-top:50}
选择紧接在 h1 元素后出现的段落,h1 和 p 元素拥有共同的父元素
面试官:嗯嗯好好行…
知道啥是伪类选择器不
用在a元素上的
那个优先级高呢?
love & hate
Link–visited–hover–active
id 和 类 选择器优先级
有没有办法让类选择高于id选择器?能不能解释下?
当时没想到..
!important 提升样式规则的优先权
伪类和伪元素的概念
CSS 伪类用于向某些选择器添加特殊的效果。
CSS 伪元素用于将特殊的效果添加到某些选择器。
p&i:first-child { color: }
p:first-leter { color: }
& class="first-child"&test&&
伪类的效果可以通过添加一个实际的类来达到,而伪元素的效果则需要通过添加一个实际的元素才能达到,这也是为什么他们一个称为伪类,一个称为伪元素的原因。
document.querySelectorAll()用过吗
返回与指定的选择器组匹配的文档中的元素列表 (使用深度优先的先序遍历文档的节点)。返回的对象是 NodeList
删除数组第一个元素,用数组的原生方法做到
array.splice(index,len,[item]):会改变原有数据
array.shift()
array.slice(start,end):不改变原有数据
咋么用呢?作用是啥呢?
pipeOf方法..?
这个没理解面试官的考点
each()方法怎么用,参数是啥?
each() 方法规定为每个匹配元素规定运行的函数。
$(selector).each(function(index,element))
箭头函数好处都有啥?
相当于匿名函数,简化了函数定义
修复了this指向,简化this绑定
更换方法的this对象
通过bind,call和apply可以重新定义函数的执行环境,即this的指向
如果不支持bind()呢,就是bind函数的兼容性知道吗?
异步请求你用的是jQuery封装好的吗?自己实现过吗?
考察ajax的实现方法
啥时候表示异步请求已经完成了呢?
xhr.readyState == 4 && xhr.status == 200
服务端数据如何转换为json对象
JSON.stringify() (JSON -& 字符串)
JSON.parse() (字符串-& JSON)
当时不知道怎么就说了个toJSON()方法…
那个对象有这个方法呢?
Date.toJSON()方法..
js中有哪些本地存储的方法呢?
比如说cookie呢,类似的还有别的方法吗?
localstorage , sessionStorage
cookie有了解过吗?
怎么样使用localStorage设置一个值呢?
localStorage本身带有方法有
  添加键值对:localStorage.setItem(key,value)
  获取键值:localStorage.getItem(key)
  删除键值对:localStorage.removeItem(key)。
  清除所有键值对:localStorage.clear()。
  获取localStorage的属性名称(键名称):localStorage.key(index)。
如果让你做一个弹窗的遮罩咋做
position:fixed:
height:100
top:0 //!!
&div class="modal"&&/div&
这个div放在哪里
我以为是问div相对文本流的位置,然后面试官是我其实想问的是在html代码里,你把遮罩的html代码放在哪里
我说开头,我感觉这么问可能是有优化空间,我问面试官,他说,我就随便问问哈..幽默..
对于这个div还有别的设置吗?
z-index设置层级
position:fixed相对于那里定位
相对于浏览器的窗口
如果想让它可以上下滚动呢?
position:absolute
position:fixed可以设置相对的对象吗?
就是默认相对浏览器定位,有办法改变这个行为吗?
fixed相对父容器定位,不通过top和left等样式,通过margin定位
Es6你用的比较溜的有哪些
箭头函数,解构赋值, await async
await async 你是怎么使用的呢?
用过promise吗?
用过..(别挖坑了行吗…)
promise有哪些状态呢
等待(pending)、已完成(fulfilled)、已拒绝(rejected)
你能说一下怎么创建一个promise呢
ES6的class新特性用过吗?
可能面试官是想了解class基本语法,但是没能回答出来
你平时是怎么学习前端的呢?
可能是想了解学习路线和遇到问题时和解决问题的方法
平时技术选型是自己来定的,你是怎么决定的呢?
比如说Angular像React等,你在项目立项的时候是如何来确定项目使用的技术呢?
多考虑一些呢?除了对它是否熟悉之外?有没有别的考虑?
面试官可能想了解对框架的理解深度,回答的不是很好..
你有什么想问的吗?
您的笔名或者名字方便透露吗?
不太方便hhh..
JD中类React框架的使用场景?
项目组的技术栈和技术人员比例?
由于云音乐立项早,大部分用的是NEJ,已经有一些不太适合新的项目的开发,逐渐用React来取代原来的NEJ,所以对React有一些要求,最好能够熟悉,如果不了解也没关系
前端 * 1.5 ~ 2.0 = 后台
然后就是标准结局:有消息再通知你吧
基础很重要,由于基础不太好,不太了解面试官想考什么,想让我回答什么,和这个知识引申出的其他知识点有啥…这导致没办法和面试官做进一步的交流,也无法给面试官留下一个好的印象
不要小看大厂的面试官,如果觉得你不了解,会继续问下去,所以最好避免给自己挖坑,当然这只是小事,重点还是需要提升自身的实力
并且对于项目来说一定要有亮点,或者说是对某一个知识点有自己的看法,可以和面试官深入讨论下去,引导面试官对你熟悉的东西进行提问,让他了解你对这个知识的了解深度,避免让面试官问你一些比较官方的内容来评价你的水平
嗯就这么多,第一次参加面试虽然失利但是确实能静下心来学习基础的知识了,明年三月再战。
没有更多推荐了,注册 | 登录
从零开始学运营,10年经验运营总监亲授,2天线下集训+1年在线学习,做个有竞争力的运营人。
2015年开始,网易云音乐开始爆发性增长,甚至有人给它起了个外号叫做“黑洞效应”,意思是无论用户之前用的是什么音乐播放软件,只要是用过网易云音乐,就马上会投向它的阵营。因为我并非云音乐的产品经理,所以无意为其打广告。促使我写下这篇文章的原因是,云音乐的成功案例非常值得每一个产品人思考,为什么在如此晚的时间节点进入早已巨头林立的音乐播放器的红海市场还能站稳脚跟?为什么看似和其它产品没多大区别的产品设计却吸引了一大片死忠?为什么音乐推荐、音乐评论这些人人在做的功能唯独它获得了成功?接下来我会逐条分析云音乐的杀手锏,希望能给大家有所启发。
1、强大的团队和丰富的资源
当我们回溯到2013年,此时互联网音乐播放器早已巨头林立,QQ音乐、酷狗音乐、天天动听这些从PC时代就开始经营的产品,经过7-10年的运营,拥有着广阔的市场基础和产品知名度,同时它们背靠BAT,拥有巨大的流量入口。此外,音乐软件的盈利模式不清晰,资本投入回报速度慢,加上未来也许会遇到的版权大战,怎么看都不像是一门合算的生意。这时候如果有人说他要从零开始做一个音乐播放器,没人会相信他能成功。但是,他的名字叫丁磊。
丁磊应该是所有互联网大佬中最具文青气质的人了,由于游戏的成功让他不用担心公司盈利的问题,因此有更多的精力去做一些“有情怀”的项目,网易云音乐就是其中一个。丁磊喜欢Spotify,中国内有copycat,他还喜欢一些小众音乐例如南斯拉夫的一些歌曲,而国内的音乐软件找不到,他就像做一款更优秀的音乐APP。由于自己的兴趣所在,丁磊可谓对云音乐项目倾注心血,不仅为其组建一个强大且富有经验的产品团队,还动用了整个网易的力量为其推广,这些构成了云音乐扎实又必不可少的基础。每个在大公司待过的人都清楚一个项目如果被老板关照有多大的优势。
2、清晰的产品定位和用户画像
云音乐划定用户画像的过程可谓教科书范例。当他们面对一个已经看似“饱和”的市场,用户的需求也几乎都被满足了,这个时候从哪里切入呢?
几乎每个人都要听歌,因此需要细分人群。利用用户的年龄和对音乐的喜好程度,逐一对当时市面上主要的竞品进行分析,例如QQ音乐音乐背靠QQ,用户群相对年轻;而酷狗音乐因为是从PC时代积累下的用户,因此年龄普遍偏大等。我们发现虾米音乐定位过于高端导致用户群小众,豆瓣音乐绑着文艺青年的标签发展受束缚,多米音乐所涉及的市场相对比较空白。这时,云音乐的产品经理们清楚尽管在线音乐市场是个红海,但是还是有一定的细分市场机会。即一款用户年龄适中,音乐品味较高的产品,它既能照顾好意见领袖们,但又不至于高端到失去大众用户。
此外,13年也是中国移动互联网发展地最如火如荼的一年,在PC时代转向移动化的过程中,由于PC产品有很多功能包袱,因此一款出生就定位移动端的播放器可以做到更好的移动段体验,实现弯道超车。具体的层面,例如诸多音乐产品在在PC时代都是曲库型的产品,用户通过搜索等方式找到音乐,下载下来再听;而移动端时代是懒人时代,用户会在手机上随时随地打开APP就听,所以音乐推荐变得尤为重要。后来有网友赞赏网易云音乐“从到处找歌听,变成找时间听听不完的歌”就是对这一点正确判断的佐证。
3、牢牢抓住核心卖点,用歌单打出差异化
云音乐诞生之初号称主打歌单、音乐社交、音乐指纹和大牌推荐四大核心功能。其实真正的卖点叫做“优质歌单、高清音质”。能让用户放弃已经养成的习惯,转而使用另一个音乐播放软件的成本是很高的,你必须要在某个功能点上超出竞品很多。
为什么选用歌单这种形式而不是标签?这可谓是关乎云音乐成败的最重要的问题了。如果把我放到当初做决策的位置上,我也会毫不犹豫地选择歌单。首先国内围绕人、单曲、专辑做音乐检索的已经很多了,但国外很出彩的 Spotify 模式在国内还没人做,这可能会成为最大的突破点。其次,刚才分析的云音乐的目标用户是对音乐热爱的人群,他们不会满足于单纯搜索标签找歌曲,这个过程中毫无成就感。但是歌单就不一样,看着由自己“创造”的歌单被分享成千上万次的成就感有时不亚于自己发了一张专辑。然后,云音乐从一开始就打着音乐社交的旗号,一个个歌单背后意味着一个个活生生的人,这是冰冷的标签划分没法做到的,歌单和人形成的是经纬相交的关系,通过 UGC 可自然过渡到社交。最后,歌单在社交媒体上的传播力度也远比标签大得多,对于一个急速成长的产品来说这是非常宝贵的资源。
但是,歌单的创建是一件日积月累的事,为了将聚集在虾米音乐里的一堆意见领袖挖过来,云音乐还做了虾米、豆瓣歌单的导入功能,虽然做法不太光彩,但是不得不说这一项功能对后者造成了致命打击,并且奠定了云音乐在歌单领域的领先地位。
4、优异的产品体验
整个云音乐的架构非常清晰,直观来看分为音乐推荐、我的音乐、音乐社交三部分,骨架是歌手和歌单。无论是重度音乐爱好者还是普通听歌用户都能轻松上手使用,满足他们的需求。同时,云音乐非常“良心”地提供免费的高清无损音质,这是靠卖会员为生的QQ音乐无法做到的事。
云音乐的产品设计上也颇为优异,黑胶唱片的音乐播放界面独树一帜,Android客户端关闭后完全退出,类似歌词卡片分享的小功能做的非常贴心,网页端没有弹窗没有广告等等。
5、个性化推荐算法和曲库循环
云音乐的个性化推荐一直饱受赞誉,从官方数据来看,每天使用个性化推荐功能的用户超过60%。其实以我对机器学习和个性化推荐的了解,云音乐的算法从工程角度并没有特别之处,也是协同过滤算法和基于内容的推荐之间的配比。
但是云音乐除了算法推荐以外,还加入了一些“小心机”。例如他们从用户的心理出发,发现从正常的推荐列表中插入“能带给用户惊喜感”的歌曲就会收获很好的口碑。于是云音乐通过搜索音乐下的评论,将一些带有“回忆”“以前”这些词汇的歌曲抽取出来,然后选择一部分老歌插入歌曲推荐中,从而带给用户惊喜感,果然受到了很多好评。
此外,推荐算法会遇到一个越使用、推荐口味越窄的恶性循环,云音乐采用的方法是综合UGC歌单、推荐算法、用户关注等三大块让用户发现更多口味的歌曲,扩大用户喜好范围,从而让用户不断听到新鲜口味的歌曲,反而提高了推荐算法的精确度。这些都是靠纯技术难以实现的效果。
同时云音乐为了充分利用庞大的曲库,创造了一个挖掘冷门歌曲的模型。根据幂律分布理论,音乐曲库中有80%是冷门小众的,平时无人问津的歌曲。如果将这部分歌曲掺入个性化推荐中推给20%的高端音乐爱好者,由于他们的音乐品鉴能力较高,一旦从中听到优秀的歌曲就会收藏到自己的歌单中(相当于人工过滤出优质歌曲),然后随着歌单的流传将这些小众好听的音乐再传播给占80%的普通大众用户,从而完成一项高效的音乐筛选操作,由于充分发挥了大众的力量,云音乐的这套模型远胜一大波专业编辑的推荐。同时推荐出来的高端小众的音乐还能满足用户追求新鲜、逼格、炫耀的心理,分享量也大大增加了。
6、音乐评论和音乐社区
网易云音乐从一开始就没有将自己定位为音乐爱好者社区,而不仅仅是一个音乐播放器。因此,云音乐做了很多“看似和音乐播放无关的内容”,例如好友、附近、个人主页等等。其中最成功的莫过于音乐评论。
音乐评论并不是一个新的功能,很多其它产品都做过,但是最终成功的只有云音乐。如果分析其原因,我认为主要是两点。第一点是用户群体,同一个功能交给不同的用户群使用最终会得到截然不同的结果。举一个例子,Bilibili因弹幕而声名远扬,优酷土豆学了之后却变成东施效颦,这是因为B站用户相对垂直、普遍互相认同,同时二次元用户拥有爱吐槽的特征,这些都是优酷土豆的用户不具备的。回过来看云音乐,由于其一开始定位用户就是热爱音乐的相对成熟的用户,他们对音乐的理解、生活阅历和遣词造句的能力都是QQ音乐、酷狗音乐的用户无法比拟的,这一条构成了成功的基础。
第二条是正确的运营手段和对用户心理的揣摩。首先云音乐的团队会仔细研究用户在微博、贴吧上的看法,以及在云音乐内部的评论,再根据这些观察去分析用户的心理,总结一些共性,他们发现所有的热门评论都具有一些共性,基本集中在少数几个领域,例如初恋的回忆、漂泊的伤感、失恋的痛苦等。等到抓住这些特色后,云音乐有专门的运营团队将这些容易被赞同的评论人工运营起来,它们就会拥护更多的热度,这样进一步给用户造成云音乐的评论很贴心很中意的感觉,使用这个功能的人就越来越多。有人问为什么网易系的产品评论都做的这么出色,因为他们有一支强大的运营团队,知道用户想看什么想发什么。例如网易新闻的评论曝光偏激、对立的观点引导用户辩论,而云音乐的评论则需要优质正面的评论引发用户的共鸣。
7、口碑和气质
这应该是最“玄乎”的一条了,因为一个产品的口碑和气质并非一朝一夕,或者靠着一两个功能就形成的,它是从一开始的定位到后来一直延续的产品和运营策略传达给用户的印象。正所谓功能可以被复制但是气质很难,网易云音乐一开始就吸引了对音乐有所追求的优质用户,因此一直给人传达出一种不俗的格调的印象。但是它从未彰显出自己的“逼格”,没有排斥过小白用户。反观虾米音乐因为做了太多针对重度音乐爱好者的功能,尽管口碑优秀但是小白用户很难上手,这对它后来的推广造成了巨大的困难。
云音乐的产品经理王诗沐说过”创始人或者产品经理在构思一个新产品的时候,如果想做一个高端有B格的产品,请务必要保证这部分高端用户本身就能帮助你完成商业闭环实现盈利。否者当它发现自己不得不发展成大众的时候会遇到绝大的鸿沟,面临新增用户留存率低,老用户口碑差的问题。”因此云音乐从一开始就将自己定位于“高端和大众之间的平衡点”,既没有像QQ音乐、酷狗音乐那么low;也没有像豆瓣、虾米音乐那么高。这样往上就可以吸引一些意见领袖,往下也可以吸引很多大众用户。这种定位在其核心功能上一直得到很好的体现。例如歌单功能,高端用户创建歌单获得成就感,大众用户消费歌单找到想听的歌,两拨用户就能和谐共处。
如果你在知乎上搜索“网易云音乐到底好在哪里”,总共有上千条回答,其中排名靠前的好几个回答都是在讲述云音乐的客服团队有多好,愿意为一个普通用户寻找歌曲、恢复被删除的歌单等等。这里就不得不提一下云音乐的全民客服举措,即无论你是产品经理、运营,还是开发,都需要值班解决客服问题。通过这个措施,不仅让官方团队更贴近用户,了解用户的需求;同时需求得到妥善解决的用户会自愿成为云音乐的推广者,在各类社交网络宣传它的好口碑。
此外,云音乐和Bilibili一直有着深度合作,对于年轻用户的爱好和口味把握的很准,往往今天一个视频在B站爆火,明天它的音源就会出现在云音乐上。谁拥有年轻用户谁就拥有未来,可见云音乐的运营团队也是相当优秀的。
以上总结网易云音乐这款产品的一些优点,以回答“网易云音乐为什么如此受欢迎”“它又是怎么做到的”这些问题。云音乐的成功不可复制,但是它从产品定位、用户研究、功能设计、运营方式等地方可以给互联网从业人士带来很多启发。它的成功告诉我们一款优秀的产品不一定是高端小众的,只要用心做,口碑和市场也可以兼得。
作者:姜风遥 ,网易产品经理。
本文由 @姜风遥原创发布于人人都是产品经理。未经许可,禁止转载。
赞赏是对原创者的最大认可
收藏已收藏 | 233赞已赞 | 76
产品经理群
运营交流群
品牌营销群
文案交流群
Axure交流群
关注微信公众号
大家都在问
7个回答6人关注
5个回答8人关注
4个回答2人关注
15个回答35人关注
7个回答18人关注
133个回答180人关注坚持,自由,信仰
MySQL学习(四)【MySQL应用优化】
4.1-MySQL索引优化与设计
什么是索引
索引的意义 —— 快速定位要查找的数据
数据库索引查找
全表扫描 VS 索引查找
如何根据首字母找到所在行
InnoDB表聚簇索引
索引中只放着排序字段和ID
create index idx_test1 on tb_student (name);
create index idx_test2 on tb_student (name, age);
索引中先根据name排序,name相同的情况下,根据age排序
索引维护由数据库自动完成
插入/修改/删除每一个索引行都会变成一个内部封装的事务
索引越多,事务越长,代价越高
索引越多对表的插入和索引字段修改就越慢
控制表上索引的数量,切忌胡乱添加无用索引
如何使用索引
依据WHERE查询条件建立索引
select a, b from tab_a where c=? ;
select a, b from tab_a where c=? and d=?;
idx_cd (c, d)
排序order by, group by, distinct字段添加索引
select * from tb_a order by
select a, count(*) from tb_a group by
select * from tb_a order by a,
idx_a_b (a, b)
select * from tb_a order where c=? by
idx_c_a (c, a)
索引与字段选择性
某个字段其值的重复程度
选择性很差的字段通常不适合创建单列索引
男女比例相仿的列表中性别不适合创建单列索引
如果男女比例极不平衡,要查询的又是少数方(理工院校查女生)可以考虑使用索引
联合索引中选择性好的字段应该排在前面
select * from tab_a where gender=? and name=?;
idx_a1 (name, gender)
联合索引与前缀查询
联合索引能为前缀单列,复列查询提供帮助
idx_smp (a, b, c)
where a=? ;
where a=? and b=? ;
where a=? and c=? ;(部分ok)
合理创建联合索引,避免冗余
(a) , (a, b) , (a, b, c) X
(a, b, c) ok
长字段上的索引
在非常长的字段上建立索引影响性能
InnoDB索引单字段(utf8)只能取前767 bytes
对长字段处理的方法
Email类,建立前缀索引
Mail_addr varchar(2048)
idx_mailadd (Mail_addr(30)) ok
住址类,拆分字段
Home_address varchar(2048)
idx_mailadd (Mail_addr(30)) ? -- 很可能前半段都是相同的省市区街道名称
Province varchar(1024), City varchar(1024), District varchar(1024), Local_address varchar(1024) ... -- 建立联合索引或单列索引
索引覆盖扫
最核心SQL考虑索引覆盖
select Name from tb_user where UserID=?
Key idx_uid_name(UserID, Name)
不需要回表获取name字段,IO最小,效率最高
无法使用索引的情况
索引列进行数学运算或函数运算
where id+1=10; X
where id = (10-1); ok
year(col) & 2007; X
col & ''; ok
未含符合索引的前缀字段
Idx_abc (a, b, c):
where b=? and c=?; X
前缀通配,’_’和’%’通配符
Like '%xxx%'; X
Like 'xxx%'; ok
where 条件使用NOT, &&, !=
字段类型匹配
并不绝对,但是无法预测地会造成问题,不要使用
a int(11), idx_a (a)
where a = '123'; X
where a = 123 ; ok
利用索引排序
idx_a_b (a, b)
能够使用索引帮助排序的查询:
order by a
a = 3 order by b
order by a, b
order by a desc, b desc
a & 5 order by a
不能使用索引帮助排序的查询:
order by b
a & 5 order by b
a in (1, 3) order by b
order by a asc, b desc
如何确定一个查询走没走索引,走了哪个索引
explain是确定一个查询如何走索引最简便有效的方法
explain select * from tb_
关注的项目
type:查询access的方式
key:本次查询最终选择使用哪个索引,NULL为未使用索引
key_len:选择的索引使用的前缀长度或者整个长度
rows:可以理解为查询逻辑读,需要扫描过的记录行数
extra:额外信息,主要指的fetch data的具体方式
4.2-MySQL数据库设计
什么是Schema设计
设计数据库的表,索引,以及表和表的关系
在数据模型的基础上将关系模型转化为数据库表
满足业务模型需要基础上根据数据库和应用特点优化表结构
为什么Schema需要设计
Schema关系到应用程序功能与性能
满足业务功能需要
同性能密切相关
数据库扩展性
满足周边需求(统计,迁移等)
关系型数据库修改Schema经常是高危操作
Schema设计要体现一定的前瞻性
完全由开发者主导的Schema设计
着眼于实现当前功能
完全基于功能的设计可能存在一些隐患
不合理的表结构或索引设计造成性能问题
没有合理评估到数据量的增长造成空间紧张而且难以维护
需求频繁修改造成表结构经常变更
业务重大调整导致数据经常需要重构订正
基于性能的表设计
根据查询需要设计好索引
根据核心查询需求,适当调整表结构
基于一些特殊业务需求,调整实现方式
正确使用索引
更新尽可能使用主键或唯一索引
主键尽可能使用自增ID字段
核心查询覆盖扫描
用户登录需要根据用户名返回密码用于验证create index idx_uname_passwd on tb_user (username, password);
建立联合索引避免回表取数据
反范式,冗余必要字段
针对核心SQL保留查询结果所必须的冗余字段,避免频繁join
例:消息表中冗余了每次读消息必须返回的nickname字段,避免每次读消息都变成join操作。代价是用户修改nickname成本变高。
拆分大字段
拆分大字段到单独表中,避免范围扫描代价大
例:博文表拆分两份,标题表只保留标题和内容缩略部分,用于快速批量返回标题列表,正文表保存大段博文内容,用于点开文章单个读取
避免过多字段或过长行
根据SQL必要返回设计字段,有必要就拆表,避免过多字段
一次没有必要获取那么多列数据
行过长导致表数据页记录变少,范围扫描性能降低
更新数据也代价增加
16K也最少放2行,可能出现行迁移
避免limit + offset过大
应该使用自增主键ID模拟分页
第一页,直接查
得到第一页的max(id)=123(一般是最后一条记录)
第二页,带上id&123查询:where id&123 limit 100
这样每次只需要扫描100条数据
要求业务上禁止查询XX页之后的数据
热点读数据特殊处理
根据数据获取的频率或数量不同对热点数据做特殊处理
例1:论坛系统中置顶帖、公告贴,可以单独拆分存储,由于每次访问都要全部读出来,单独放在一起,避免每次都到普通表中随机找出来
热点写数据特殊处理
根据数据获取的频率或数量不同对热点数据做特殊处理
例2:微博系统中对于大量关注的热点账号消息从”推”改为”拉”,避免过量insert操作。
准实时统计
对不需要精确结果的计数等统计要求,建立定期更新结果表
例:首页要求展示动态成交总金额,维护一个计数表,每分钟根据原表注册时间获取增量sum值更新计数表,避免每次用户刷新都要扫描交易全记录表
实时统计改进1 - 触发器实时统计
对需要精确统计的计数利用数据库触发器维护计数表
例:用户量冲亿活动要求实时统计,用户表上加触发器,每次有新用户插入就同时在计数表+1
实时统计改进2 - 缓存实时统计
对需要精确统计的计数利用前端缓存实时维护计数
例:用户量冲亿活动要求实时统计,注册数量在缓存中实时维护,每注册一个就+1,完全避免数据库读写操作。缓存万一故障失效,可从数据库整体count重新获取。
实时统计改进2 - 最大自增ID获取总数
很多逻辑可以利用自增ID主键最大值直接作为总数
例:用户量冲亿活动要求实时统计,用户表加上自增ID作为主键,只要取当时max(ID)就可以得到用户总数
课拓展性设计
硬件资源增长有极限的情况下处理尽可能久的线上业务
数据分级,冷数据归档与淘汰
可以不断释放空间供新数据使用
为数据分布式做准备
牺牲一定的关系模型支持
分区表与数据淘汰
适合数据需要定期过期的大表
单个分区扫描迁移数据到历史库避免全表扫描IO开销
删除单个分区非常高效
分区表与垂直分区
适合将来可能要基于地区,类目等方式垂直拆分数据的方式
清理节点上不要的数据非常高效
分区表与水平分区
适合将来需要做水平拆分的表
清理节点上不要的数据非常高效
MySQL分区表的局限
主键或唯一键必须包含在分区字段内
分区字段必须是整数类型,或者加上返回整数的函数
满足周边需求
为周边需求额外增加表设计
为后台统计任务增加特殊索引
为数据迁移或统计需求增加时间戳
统计和后台需求
统计运行SQL往往和线上有很大不同
利用MySQL——主多从,主从可以建不同索引的特性将统计分流到特定从库
包括一些特殊用户批量查询等,所有对线上有IO压力的查询都要读写分离
自动更新时间戳
统计需求经常要求从线上读走增量数据
表的第一个timestamp类型字段再写入时如果不填值,会自动写入系统时间戳
表的第一个timestamp类型字段每次记录发生更新后都会自动更新
在update_time字段上建索引用于定时导出增量数据
Schema设计与前瞻性
基于历史经验教训,预防和解决同类问题
把折腾DBA够呛的所有Schema改造的原因记录并分析总结
业务为例用户信息加密做了大改造
数据库结果大量改动,增加了加密字段,验证策略表,所有表重新订正数据等等
是否所有用到用户信息管理的应用都要去上线就用密文?
程序bug误删数据,线上风险大
改造业务流程,不再删除数据,加入is_deleted标记位,经常给各种表加
今后的类似表是否一上线就都用标记位的方式,并加上修改原因字段?
支付类应用后期做了风控改造
对线上订单大表改造,加了限额,终端类型等字段
遇到支付类应用,是否一上线就提示业务是否需要考虑风控并留好相关字段?
4.3-MySQL容量评估
性能容量评估
分析线上业务场景
评估数据库服务器所需性能指标
预估可能成为瓶颈的服务器资源
帮助数据库性能调优
数据库服务器硬件性能指标
磁盘IO性能
网络吞吐量
数据库业务特点关键词
OLTP/OLAP类型
冷热数据比
数据分级存储
T = Transaction
面向广大用户,高并发,较短事务操作
互联网应用绝大部分属于OLTP
OLTP看重服务器CPU,内存,写事务较多或内存不够则依赖磁盘IO
A = Analytical
通常面向内部人员,大规模复查询
OLAP看重磁盘扫描的IO能力,部分依赖内存排序
并发请求 - 衡量线上业务繁忙程度
业务高峰时数据库的每秒并发访问量是多少
通过应用服务器数量,连接池配置判断
通过产品估算初上线用户规模和用户增长速度判断
通过实际业务业务类型判断
并发量相关资源:CPU
读写比例 - 描述应用程序如何使用数据库
线上业务select只读与update/delete/insert写操作比例
delete/update通常都是先读再写
insert需要区分数据写入时持续insert还是大量导入数据
根据业务实际场景分析
多读场景相关资源:内存
多写场景相关资源:磁盘IO
数据量 - 总量
数据库服务器存储设备可扩容能力的上限
根据估算的业务量,写入模式,分析数据增长量
预估一个硬件升级周期内数据库可存放数据的总量,上线时要留好余量
数据总量相关资源:磁盘容量
冷数据与热数据 - 有用数据的实时集合
热数据,线上最新一定周期内将被反复访问的数据
冷数据,线上保存着的,最近不会被在线用户用到的数据
估算活跃用户量,数据增长量等预估热数据量
内存大小尽可能足够存放线上实时热数据
热数据相关资源:内存
线上数据分层存储 - 缓解线上磁盘空间压力
最新热数据确保放在内存中
还可能访问到的较早数据存放在线上库磁盘中
更早的不会常规访问的数据定期迁移至历史库中
区分哪些数据时效性强可以迁移
服务器资源选型 - 将可选方案列出来
磁盘IO性能
单盘 -& 盘阵; SATA -& SAS; HDD -& SSD
较小内存 -& 较大内存
普通 -& 多核,超线程
网络吞吐量
千兆 -& 万兆; 单网卡 -& 多路;
单盘 -& 盘阵; 单盘 -& LVM
案例一,网易云音乐曲库数据库服务器评估
用于存放线上数千万歌曲信息
确定属于OLTP线上类型数据库
并发请求量
50台应用服务器,每台最大连接数100
可能峰值5000qps,并发请求量较大
访问模式以用户列出歌单和播放歌曲时查询歌曲信息为主,用户只有只读查询
写数据发生在录入新歌或修改歌曲信息时后台操作,写比例小,且为批量导入
读写比100:1
估算每首歌信息8K,总计5000万,总量400G
数据总量增长相对缓慢
5000万歌曲中大约40%可能被访问,10%属于热点歌曲
热数据大约&=40G
数据分级存储需求
由于没有用户产生的数据,歌曲信息无法分级存储
内存需求一般,&=40G
磁盘IO能力需求一般
网络流量要求,8k* ≈ 20MB/S,一般
磁盘IO性能
两块SAS做RAID1
2c8core超线程 相当于32核
网络吞吐量
千兆双网卡bunding
案例二,网易理财销售数据库服务器评估
用于存放理财用户线上订单
确定属于OLTP线上类型数据库
业务场景有明显特征
特定高息产品秒杀销售时间窗有大量并发订单写入
平时只有少量订单查询和请求,和较低的常规产品购买请求
评估应以满足最关键的业务高峰为基准
并发请求量
秒杀期间持续时间短,但是并发量预估30台应用服务器约2000tps
高峰时写订单是主要开销操作
磁盘IO要求很高
根据业务分析,订单属于写入瞬时量大,总量较小,单笔金额较高
总量预估一年成交百万级别,增长较稳定
判断数据存储需求小于200G
峰值写入为主,内存要求存放热点期间产生的脏数据即可
数据分级存储需求
用户订单业务约定页面展示最近半年订单,半年前的需要到历史查询页面专门查询
因此可以做分级存储,迁移所有半年前的订单至历史库
内存需求一般, &= 30G
磁盘空间需求一般, &=200G
磁盘IO能力需求很高
网络要求较高
并发流量较高
响应速度要求高
磁盘IO性能
两块SSD做RAID1
2c8core超线程 相当于32核
网络吞吐量
万兆双网卡bunding
4.4-MySQL性能测试
为什么需要性能测试
对线上产品缺乏心理预估
重现线上异常
规划未来的业务增长
测试不同硬件软件配置
性能测试的分类
设备层的测试
业务层的测试
数据库层的测试
设备层的测试
关注的指标
服务器、磁盘性能
磁盘坏块率
服务器寿命
业务层测试
针对业务进行测试
数据库层测试
什么情况下要做MySQL的测试
测试不同的MySQL分支版本
测试不同的MySQL版本
测试不同的MySQL参数搭配
MySQL测试分类
常用的测试工具
开源的MySQL性能测试工具
tpcc-mysql
针对业务编写性能测试工具
性能测试衡量指标
服务吞吐量(TPS, QPS)
服务响应时间
服务并发性
业界较为出名的性能测试工具
可以测试磁盘、CPU、数据库
支持多种数据库:Oracle, DB2, MySQL
需要自己下载编译安装
建议版本:sysbench0.5
编译安装Sysbench
下载sysbench
git clone https://github.com/akopytov/sysbench.git
./autogen.sh
./configure
make && make install
Sysbench流程
常见的做法
初始化数据 -& 运行测试 -& 清理数据
Prepare语法
sysbench --test=parallel_prepare.lua --oltp_tables_count=1 --rand-init=on --oltp-table-size= --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sys --mysql-password=netease --mysql-db=sbtest --max-requests=0 prepare
–test=parallel_prepare.lua
运行导数据的脚本
–oltp_tables_count
测试需要几张表
–oltp-table-size
每张表的大小
–mysql-host
MySQL Host
–mysql-port
MySQL Port
–mysql-db
–mysql-user
MySQL User
–mysql-password
MySQL Password
–rand-init
是否随机初始化数据
–max-requests
执行多少个请求之后停止
执行导数据
Sysbench表结构
create table 'sbtest1'(
'id' int(10) unsigned not null AUTO_INCREMENT,
'k' int(10) unsigned not null DEFAULT '0',
'c' char(120) not null DEFAULT '',
'pad' char(60) not null DEFAULT '',
PRIMARY KEY ('id'),
KEY 'k_1' ('k')
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 MAX_ROWS=1000000
sysbench --test=oltp.lua --oltp_tables_count=1 --num-threads=100 --oltp-table-size= --oltp-read-only=off --report-interval=10 --rand-type=uniform --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sys --mysql-password=netease --mysql-db=sbtest --max-time=1000 --max-requests=0 run
–test=oltp.lua
需要运行的lua脚本
–oltp_tables_count
测试需要几张表
–oltp-table-size
每张表的大小
–num-threads
测试并发线程数
–oltp-read-only
是否为只读测试
–report-interval
结果输出间隔
–rand-type
数据分布模式,热点数据或者随机数据
–max-time
最大运行时间
–max-requests
执行多少个请求之后停止
写入数据进行测试 -& 清理数据
手动drop掉表和database
使用sysbench提供的cleanup命令
sysbench --test=parallel_prepare.lua --oltp_tables_count=1 --rand-init=on --oltp-table-size= --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sys --mysql-password=netease --mysql-db=sbtest --max-requests=0 cleanup
Tpcc-mysql
TPC-C是专门针对联机交易处理系统(OLTP系统)的规范
Tpcc-mysql由percona根据规范实现
下载Tpcc-mysql
bzr branch lp:~percona-dev/perconatools/tpcc-mysql
使用Tpcc-mysql的步骤
创建表结构和索引 -& 导数据 -& 运行测试 -& 数据清理
创建表结构
create_table.sql
add_fkey_idx.sql
tpcc_load [server] [DB] [user] [pass] [warehouse]
Tpcc-start
tpcc_start -h server_host -P port -d database_name -u mysql_user -p mysql_password -w warehouse -c connections -r warmup_time -I running_time -i report-interval -f report-file
connections
并发线程数
warmup_time
running_time
report_interval
输出时间间隔
report_file
IO Bound测试数据量要远大于内存、CPU Bound测试数据量要小于内存
测试时间建议大于60分钟,减小误差
Sysbench更倾向于测试MySQL性能、TPCC更接近于业务
运行测试程序需要同时监控机器负载,MySQL各项监控指标
没有更多推荐了,

我要回帖

更多关于 网易云音乐破解版 的文章

 

随机推荐