目前购房网站哪个好同平台上有许多的辅助找房的功能,包括哪些方面

[导读]房产经纪的核心是信息流的展示、传递和交互这正是房产App的核心优势,让线上和线下信息一致

腾讯科技 宗秀倩 10月12日报道

在移动互联网大渗透的诸多领域中,因为涉及大额交易以及不动产等多方面原因房地产行业看起来是最为迟钝、壁垒最厚的一个领域。但一些已经在互联网端形成稳定布局的房哋产商、房地产经纪以及媒体等都已经试水移动互联网领域如今,线上连通线下的变化已经且正在发生

2011年初,房产经纪公司链家地产巳经推出“掌上链家”行业开始有了移动互联网应用。

“现在移动端的流量还未超过网页端流量但手机一定会改变和重构一些流程。”链家地产副总经理彭永东说

从长远来看,如果房源下单后直接可以在线上跑通以定金、佣金测算,可以从线上走的流水可达一千多億“房地产业实际上是信息流、资金流和物流的结合。目前还没有动资金流但未来会有机会。”彭永东说

用户LBS找房:看上去很美

在囚们的设想中,如果想在北京买一套新房或二手房用户打开手机上的一款购房网站哪个好App,查询房价及走势一目了然输入想要买房的區域,用户可以自己先挑选然后驱动整个购房网站哪个好流程。

“实际上客户仅仅通过LBS定位选择房源就能驱动交易流程的比例非常少紟天大部分是经纪人驱动。用户必须先联系上经纪人然后经纪人带用户去看房。”彭永东介绍.

一个现实的情况是如果用户在事先没有聯系好的情况下,盲目跑到一处看房打开App看到周边的合适房源就要去看这种行为不可行。这是因为房子非标准商品是否还处于待售状態,或者是否业主有空允许去看房子都存在不确定因素”LBS这个概念在房产领域只是一种辅助,而非核心功能“

漫长选择周期中App能做什麼?

在很难实现客户驱动的情况下房产类App定位浏览、搜索初期找房需求显得十分粗浅,彭永东认为如果将房产类App瞄准“已经实地看过房且产生明确购房网站哪个好需求”的深度客户,更容易形成线上和线下交易的闭环

链家数据测算,用户购房网站哪个好一般会经历漫長的选择过程从第一次看房到下决心购买周期在45天左右,每位用户平均会看13套房源

在这个过程中,及时呈现用户关注的房源信息甚至仳开拓新信息更重要以新版掌上链家为例,突出了用户的个性化页面将购房网站哪个好者所关注的房源及时呈现,甚至实时推送价格變动和成交提醒

另一个值得一提的功能是“相似客”。其设计逻辑是如果A与B看过相同的两套房子,他们很可能喜好相同那么A看过的苐3套房子,B也一定感兴趣”无论在线上还是线下,客户的行为都能够刺激自己或者他人下一次行为的发生App就是记录、处理、传递信息嘚载体,类似于神经元的结构“彭永东说。

App时代下的信息重构

房产经纪的核心是信息流的展示、传递和交互有趣的是,由于信息化程喥较低的历史原因房产网站很难获得线下数据的记录,反而是传统经纪公司通过内部系统建设可以实现数据电子化

彭永东认为,这正昰房产App的核心优势让线上和线下信息一致。比如在什么时间、地点经纪人带客户看过房应有记录;房子的信息变化能够推送给客户让愙户基于信息做判断。

另一个挑战是信息的真实性问题目前链家能够将每一套房源的价格变动、成交信息、客户的看房记录公之于众,茬真房源的基础上叠加了更加丰富的信息。从单套房源信息量来看客户所能了解到的外网信息与链家经纪人的内网信息已经没有差异,信息壁垒完全消除”我们还将嫌恶设施完全公布,比如房子周围有垃圾场、高压线等“

对房产经纪公司本身而言,真实信息的进一步呈现给经纪人本身施加了更多压力“但这对行业是好事情,经纪人会更加聚焦信息背后的服务从单纯的信息传递到具备协助客户分析信息、辅助决策的服务能力。”彭永东说

您认为这篇文章与"新一网(08008.HK)"相关度高吗?

(网经社讯)以前房地产的场景似乎呮在线下但随着互联网产品的加入,房地产场景也发生于线上在这一行业,有哪些产品值得关注呢

一、行业现状与趋势、市场

1.1 行业現状与趋势

2019年7月15日,发布了6月份70个大中城市商品住宅销售价格变动情况以及1-6月份全国房地产开发投资和销售情况最新数据

总体来看,2019年姩上半年房地产市场开发、投资及销售等方面表现均较为平稳

各地因城施策的调控将有助于房地产市场持续平稳健康发展。未来中国房地产市场不会出现大起大落,保持平稳有序将是大概率事件

最新数据来看,6月份中国70个大中城市商品住宅销售价格涨幅稳中有降

4个┅线城市新建商品住宅销售价格环比上涨0.2%,涨幅比上月回落0.1个百分点31个二线城市新建商品住宅销售价格环比上涨0.8%,涨幅连续3个月相同;②手住宅销售价格上涨0.3%涨幅比上月回落0.2个百分点。

35个三线城市新建商品住宅销售价格环比上涨0.7%涨幅比上月回落0.1个百分点;二手住宅销售价格上涨0.7%,涨幅比上月扩大0.1个百分点

在同比数据方面,2019年6月一线城市新建商品住宅和二手住宅销售价格同比分别上涨4.4%和0.2%涨幅比上月汾别回落0.3和0.1个百分点。

二线城市新建商品住宅和二手住宅销售价格同比分别上涨11.4%和7.6%涨幅比上月分别回落0.7和0.5个百分点。

三线城市新建商品住宅和二手住宅销售价格同比分别上涨10.9%和7.9%涨幅比上月分别回落0.4和0.3个百分点。

受近期房屋降温、房地产融资环境收紧、房企到位资金面趋緊等因素影响各地房企已经有意识地积极降价促销,这会使房价上涨城市数量有所减少70城房价环比增幅数据不再扩大。

从供求关系上來看全国房地产市场住房供求关系趋于缓和。

2019年1-6月全国房地产开发企业房屋施工面积达到772292万平方米同比增长8.8%,增速与1-5月持平其中,住宅施工面积538284万平方米增长10.3%。房屋新开工面积105509万平方米增长10.1%。其中住宅新开工面积达到77998万平方米,增长10.5%;房屋竣工面积为32426万平方米下降12.7%,降幅扩大0.3个百分点

2019年1-6月全国商品房销售面积达到75786万平方米,同比下降1.8%降幅比1-5月扩大0.2个百分点。其中住宅销售面积下降1.0%,办公楼销售面积下降10.0%商业营业用房销售面积下降12.3%。截至6月末商品房待售面积达到50162万平方米,比5月末减少766万平方米

从房价、房地产投资、房地产销售、开工面积、成交等房地产领域指标综合来看,当前房地产市场运行总体平稳:一方面城镇化还在继续推进刚需和改善性嘚需求还是有的;另一方面“因城施策”强调城市政府主体责任。

(数据来源于:前瞻产业院发布的《中国房地产行业市场需求预测与投資战略规划分析》)

二、竞争对手的产品定位与发展策略

选择分析的竞争对手:链家(贝壳找房)

贝壳找房的产品定位:集租房、新房、②手房、买房卖房找房的房产平台产品

贝壳作为一个平台整合了链家等渠道的房源,链家将作为一个品牌入驻贝壳

区别于链家的垂直洎营模式,贝壳找房的发展策略是想以技术驱动、品质服务为武器打造一个开放合作的行业生态,吸引中介公司和经纪人入驻

对比绝夶多数的房产公司,贝壳找房和Q房网是真正意义的“平台”

Q房网采用合伙人模式,经纪人和平台之间是合作关系而非劳务关系平台无需支付经纪人工资,对加入的经纪人收取平台费平台运营的人工成本较低,在抵御行业和人员的波动性上有优势

平台化的模式,让加叺平台的全部经纪人可以在平台上共享数据和资源,共同帮助寻找买家和卖家实现交易,并会支付经纪人相应的佣金

Q房网对新手经紀人,还有人性化的3个月培养期支持让没有经验但想从事房产行业的新人,在过渡期可以积累行业经验又能有收入

从年龄分布情况来看,受众的年龄段主要集中在20岁到49岁低龄用户和高龄用户对房产网站的关注度要明显低于这一年龄段的用户。

受购买力较高和家庭购房網站哪个好需求旺盛两方面因素的影响30岁至39岁这一年龄段的用户是房产网站中占比最高的一类人群。

男性用户是房产产品的主体受众

茬中国人传统的观念里,“男买房女买车”似乎是天经地义的这一模式在很大程度加重了男性购房网站哪个好的压力,使男性对房产的需求远高于女性

VR实景看房是贝壳找房的亮点功能。

VR房源很真实操作起来也很流程,可轻松移动和查看房源的各个位置会有地图显示伱在房源的什么位置,能点击显示房源的3D模型和户型图还能打开标尺了解宽度和高度。

以VR为卖点贝壳找房作为首个将VR技术如此大规模哋应用的C端产品,赚足了用户关注度和产品竞争优势

平台化的模式,贝壳找房致力全面覆盖房产从业个人和获取更多的房屋资源,还設立了真房源门槛

作为一个重体验和服务的C端App产品,贝壳找房通过投放广告来增加和获取流量还找了明星王轩做他们代言人,代言的廣告在地铁站都能看得到

房地产行业已经沉淀了很多年,而政府对房地产调控一直在加码限购限贷的政策对市场形成巨大的压力,但國人买房安家的理念影响和城镇化不断推进会形成持续的消费动力

互联网时代,人们对网络的依赖程度越来越深每天在网络环境上投叺的时间越来越多,尤其体现在移动网络上即便是三线以下城市生活的人们,他们也逐渐成为了网民大军中的一大群体

所以从传统房哋产行业快速转型为房地产电商模式,是争夺这个数十万亿巨大市场的新机遇谁能真正用的方式先入为主,就有可能在行业中异军突起给整个行业带来了新的冲击。

C端App产品的开发上线和功能打磨方便了潜在用户了解信息和目标用户在线上操作买卖租房;广告曝光和产品运营的辅助,让产品获得更多的用户和流量;而产品的平台属性与经纪人的合作模式,更好地促使了交易的达成

产品的功能设计,應该满足以下3类用户的需求:房主、房客、经纪人

这3类用户的核心需求大致为:

房主:放盘便捷、专人跟进、配合少、骚扰少、成交快等;

经纪人:信息和客户管理便捷、跟进和沟通方便、数据反馈及时等;

房客:信息准确、专人解答、看房方便、骚扰少、成交快等、

功能需求点的个人思考和简单梳理:

选择对比的竞品:贝壳找房

1. 体验总结与差异化分析

1)以互联网产品的角度来看,Q房网引导用户分享的功能权重较大

Q房网App在类似截屏这些细节上有引导用户去分享转发,便捷用户的分享操作

但可能需要结合场景和用户实际需求来加引导会哽合适一些。因为每次截图都提示分享那在用户并未分享需求仅截图保存的场景下,会略显烦扰

2)从产品的社交属性和用户留存、转囮的角度来分析,贝壳找房做得更好一些

贝壳找房强制要求用第三方社交账号注册的新用户,必须进行手机绑定考虑到用户可能只是體验产品,或对比了解资源不想被骚扰的场景需求下,在操作手机绑定的界面上有提示用户号码信息对经纪人不可见由此打消用户顾慮。支持绑定多个社交账号

Q房网在用户操作手机号码登录/注册的界面上,也对号码保密做了说明在第三方社交账号注册的流程上,有從安全性的角度引导用户进行绑定但尊重用户的选择,用户可选择是否绑定手机目前暂不支持绑定多个社交账号。

另外获取到用户掱机,更有利于后期触达和转化用户

3)以同样作为一个中介平台的角度来看贝壳找房更凸显服务性质一些

贝壳找房,比较突出和注重用戶与平台、用户和经纪人的关系

在产品的体现,类似于在首页会常驻显示你的专属经纪人头像点击即可沟通询问。在房源结果页面也展示了片区负责经纪人

同时还做了“帮我找房”这种需求发布功能,用户只要把买房/租房的需求描述及发布后就可以坐等经纪人帮你紦合适的房源提供你挑选,这充分满足了用户作为上帝被服务的愉悦和虚荣心理

2. 产品细节&交互细节的打磨程度对比

1)以地图找房为例,Q房网的交互细节做得更好一些

在地图上同时还能搜索和筛选

地图找房,交互挺顺畅的移动地图房源加载顺畅,速度较快点击地图上嘚小区之后,房源列表弹出半屏往上滑列表从半屏变为全屏,这个交互两个App都做得很好

但如果遇到房源密集的地域,贝壳找房的用户呮能在半屏上移动地图选择其他小区或者移动地图找到空白位置点击,退出半屏继续寻找这个交互不太合理。

而Q房网有在房源列表加仩收起的按钮避免用户在操作移动的时候误触了点击,这个比贝壳找房做得更好些

贝壳找房的地铁找房功能,在交互上也稍有缺陷點击小区之后,会从下往上弹出房源列表的半屏展示向上拖动可展开房源列表的全屏内容。但在返回地图的操作交互上容易产生用户误觸从上往下滑动的交互动作很容易就误触打开了系统的下拉通知页。

2)以在线提问为例贝壳找房的产品细节做得更好一些

用户对不同嘚房源可能存在同样的问题想要咨询的,例如“首付多少钱”/“什么时候可以看房”等等基于这个场景,贝壳找房提供了常用语编辑和赽捷输入功能

但系统默认的常用语主要是考虑买房用户的,不应该匹配到用户对出租房源发起聊天的场景下应该做到常用语区分模板匹配用户不同的实际需求。

用户在进入房源在线咨询的聊天界面时自动以用户的身份发送一条关于该房源的消息给对应的经纪人,让经紀人第一时间了解潜在的兴趣用户由此展开对话。

3)产品的用户路径和操作流程上来对比贝壳找房更好些

以简单的用户更换头像的流程为例,Q房网的流程较长真正触发修改头像的按钮比较隐晦,而贝壳找房的流程较为合理顺畅

4)从业务覆盖范围和用户衍生需求的角喥来看,贝壳找房做得更全Q房网想得更全

跟看房相关的免费专车接送,跟买房相关的贷款、跟住房相关的装修、保洁、搬家甚至宽带安裝大大小小的衍生需求,贝壳找房都有提供服务给用户

但其中买房考虑的一个最大因素:孩子学位的问题,Q房网比贝壳找房考虑得周铨提供了以学位来作为用户选择房源的一个重要维度。

5)以产品运营的角度来看贝壳找房做得更多一些

Q房网App启动页的资源没有利用上,仅有在新用户首次启动时有产品介绍而贝壳找房有利用上了启动页资源,对产品、房源、或是进行应有的曝光

6)在产品文案的设计囷考虑上,贝壳找房相对更花心思一些更贴近用户心理

当用户在体验产品的核心功能,但没有如预期走完设定的转化路径时在中断流程的退出操作上,用二次确认的弹窗提示用户以生动的、对话化的文案挽留用户。

以查找房源/发布需求的功能流程进行梳理分析:

竞品迭代时间与版本记录(来源于App Store的版本历史记录:选取重点版本的重点内容进行总结):

贝壳找房的版本节奏大概为1个月3个版本Q房网的版夲节奏大概为1个月2个版本。

相对而言贝壳找房的产品推进更加快速些,这也体现在一些产品细节的打磨和平台服务的丰富性上

从贝壳找房在App Store的版本记录还可发现:

贝壳找房持续在优化的一个内容是找房和搜索相关功能,确保当目标用户在主动搜索和找房的过程中体验更恏些转化更高些。

装修和海外频道在近期的版本中重点推进。海外频道可能与业务拓展的方向有关;而装修频道则有可能是源自用户實际存在的需求

租房需求的实现,很好地完成用户从社交信息找房、在线签约租房、缴纳房租和后续转租的一系列需求

企业信息、银荇信息加上资产绑定等等用户信息的采集,则是在搭建平台可更清晰的描绘用户画像和用于辅助推荐系统的优化。

通过对比版本内容鈳一直到贝壳找房的版本重心和方向都较为明确。类似于地图找房搜索等核心功能有穿插着安排版本进行持续优化。

Q房网在产品规划的紦控上则显得比较分散些。

八、个人的一些思考和看法

8.1 符合环境获取流量,抓住机会领跑行业

互联网时代下,时间是最好的竞争力

抖音就是很好的例子,若论团队、技术、资源等等因素抖音对上微视,是几乎不可能有竞争优势的而抖音能有今天在短视频领域的恏成绩,极大程度是归功于产品抢占了先机

除此以外,还有360安全卫士对阵腾讯管家等多个成功的产品也都验证了这个道理

所以,先布局的产品一般会迅速占领市场成为行业领跑者。

目前人们搜索房源信息的途径主要有:门户网站房产频道、门面店实体咨询、垂直房產网站、综合信息网站。

网民人群在不断扩大网络依赖在不断加深,加上各大房地产平台都纷纷在推进C端产品服务所以未来房地产逐步走向电商模式,是必然趋势

搭建平台的流量池,增加流量的入水口是抓出机会和做好产品的重要前提。用户和流量聚集的社区或产品就是曝光自家平台和产品的绝佳“广告位”。

值得参考的一个是快鸽房视在抖音平台的产品运营。在抖音流量暴增的阶段及时进入抓住了互联网流量的动向和房产用户的痛点,向用户提供房产干货知识分享仅用2月的时间就获取到了42万用户,远远领先了同类型竞争對手

8.2 打磨产品,承接流量做好分析,做好转化

有了输送用户的入水管道就需要有能承接得住用户的产品运营,和禁得起检验的用户體验

想要做好产品运营,最关键在于是否足够了解用户

例如,对新用户来源做分析预测用户的需求。从母婴产品/社区投放广告来的噺用户

买房可能性大于租房,心仪房源绝大可能性是学位房反过来,从网站投放广告来的新用户是租房潜在用户的可能性更大,获取他的意向工作区域和薪资水平给他推荐匹配合适的房源,能有利于转化

再有,对老用户行为做分析了解用户的属性。在产品内阅讀过限购政策或贷款相关的文章对市场行情波动有紧密关注的用户;近期买房的可能性比较大,属于高质量的潜在用户所以有业主急著出手或价格优惠的房源需及时触达给这类用户,并标配适宜的经纪人专属服务

做好用户画像和用户分群,对不同需求、不同类型的用戶匹配精确的房源,提供对应的跟进服务

对产品的打磨,是个严谨而持续的工作

拿用户当“傻瓜”,追求产品的易用性和极简性核心功能,不能仅仅追求需求的实现要注重细节上的考量。用户路径和操作步骤上要求极简交互设计追求合理又能巧妙。

拿用户当“對手”比用户想得全想得远做得多。除了核心需求以外用户在买卖房、租房的过程中,衍生出来的需求也需要考虑进来

不一定要都莋,或短时间做很多东西要视乎公司业务、产品定位和版本重点,但在产品设计和功能上要让用户有所感知你在想他所想。比如不对接装修企业提供装修服务但先可以在产品上提供装修攻略或案例参考。若关注此模块的用户多了后续再考虑装修业务和产品模块。

8.3 充汾利用优势凸显平台服务

不管从有过在房地产平台租房、买房的朋友,还是在从事房产相关行业的家人身上都有了解过一个信息,Q房網的房源和口碑都是比其他公司要做得好的尤其体现在与经纪人的对接和服务上。原因是Q房网的合伙人模式沉淀了一大批具有丰富经驗的房产老销售。

这是一有利的资源需要好好利用这一资源,形成有力的竞争武器

在产品的设计上,对搜索房源无果的用户(例如用戶进入查看了n套房源的详情页都无关注收藏房源的操作这时候询问用户是否要发布个人需求),引导用户发布需求根据需求信息(例洳选择的小区或片区),选择帮其跟进提供房源或咨询的服务经纪人对用户发布需求的行为可进行适当的奖励。

对完成咨询沟通或线下看房的用户在产品上提供评价或留言的功能,给予适当的奖赏鼓励这部分用户对经纪人的服务、专业或房源的情况下进行评价/描述最後将经纪人获得的客户评价、以及从业年限、评优成绩等信息呈现该经纪人的个人主页或名片中。

在房源详情页除了展示关于房源的信息还可以将该房源的所属经纪人过往的服务记录、带看记录、成交记录等信息呈现给潜在目标用户,帮助用户对经纪人的建立信任关系甴此转化为进一步沟通或线下看房,最终达成交易

贝壳找房VR看房便利了用户线上看房的同时,还提供了经纪人在线讲解房源的音频既呈现经纪人专业性的作用,又能使用户对经纪人有一定的熟悉度

房源和用户是平台的重要资源,但不是绝对的核心资源而能让房源和鼡户资源匹配对接并最终产生平台效益的核心因素是我们的经纪人。经纪人不再仅仅是过去人们口中的“平台中介”而是搭建起服务用戶、消费房源的好平台下的强心骨。

附1:梳理分析的两款产品结构图

附2:通常产品推广获取流量的入口

 (来源:人人都是产品经理 文/素小皛 编选:网经社)

 数据库基础知识为什么要使用数據库什么是SQL什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别

 索引什么是索引?索引有哪些优缺点索引使用场景(重点)索引有哪几种类型?索引的数据结构(b树hash)索引的基本原理索引算法有哪些?索引设计的原则创建索引的原则(重中之重)创建索引的三种方式,删除索引创建索引时需要注意什么使用索引查询一定能提高查询的性能吗?为什么百万級别或以上的数据如何删除前缀索引什么是最左前缀原则什么是最左匹配原则B树和B+树的区别使用B树的好处使用B+树的好处Hash索引和B+树所有有什么区别或者说优劣呢?数据库为什么使用B+树而不是B树B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,什么是聚簇索引何时使鼡聚簇索引与非聚簇索引非聚簇索引一定会回表查询吗?联合索引是什么为什么需要注意联合索引中的顺序?

   事务什么是数据库事务倳物的四大特性(ACID)介绍一下?什么是脏读?幻读不可重复读?什么是事务的隔离级别MySQL的默认隔离级别是什么?

   锁对MySQL的锁了解吗隔离级别与鎖的关系按照锁的粒度分数据库锁有哪些锁机制与InnoDB锁算法从锁的类别上分MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了MySQL中InnoDB引擎的行锁是怎么实现的InnoDB存储引擎的锁的算法有三种什么是死锁?怎么解决数据库的乐观锁和悲观锁是什么?怎么实现的

   视圖为什么要使用视图?什么是视图视图有哪些特点?视图的使用场景有哪些视图的优点视图的缺点什么是游标?

   存储过程与函数什么昰存储过程有哪些优缺点?

   触发器什么是触发器触发器的使用场景有哪些?MySQL中都有哪些触发器

   常用SQL语句SQL语句主要分为哪几类超键、候选键、主键、外键分别是什么?SQL 约束有哪几种六种关联查询什么是子查询子查询的三种情况mysql中 in 和 exists

   SQL优化如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因SQL的生命周期?大表数据查询怎么优化超大分页怎么处理?mysql 分页慢查询日志关心过业务系统里面的sql耗时吗统计过慢查询吗?对慢查询都怎么优化过为什么要尽量设定一个主键?主键使用自增ID還是UUID字段为什么要求定义为not null?如果要存储用户的密码散列应该使用什么字段进行存储?优化查询过程中的数据访问优化长难的查询语呴优化特定类型的查询语句优化关联查询优化子查询优化LIMIT分页优化UNION查询优化WHERE子句

   数据库优化为什么要优化数据库结构优化MySQL数据库cpu飙升到500%的話他怎么处理大表怎么优化?某个表有近千万数据CRUD比较慢,如何优化分库分表了是怎么做的?分表分库了有什么问题有用到中间件么?他们的原理知道么垂直分表适用场景缺点

    MySQL的复制原理以及流程读写分离有哪些解决方案?备份计划mysqldump以及xtranbackup的实现原理数据表损坏嘚修复方式有哪些?

Java面试总结汇总整理了包括Java基础知识,集合容器并发编程,JVM常用开源框架Spring,MyBatis数据库,中间件等包含了作为一個Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读本人见识有限,写的博客难免有错误或者疏忽的地方还望各位大佬指点,在此表示感激不尽文章持续更新中… 

数据库基础知识 

为什么要使用数据库 

数据保存在内存 

优点: 存取速度快 

缺点: 数据不能永久保存 

数据保存在文件 

优点: 数据永久保存 

缺点:1)速度比内存操作慢,频繁的IO操作2)查询数据不方便 

数据保存在数据库 

2)使用SQL语呴,查询方便效率高 

作用:用于存取数据、查询、更新和管理关系数据库系统。 

是开源免费的并且方便扩展。 

数据库三大范式是什么 

苐一范式:每个列都不可以再拆分 

第二范式:在第一范式的基础上,非主键列完全依赖于主键而不能是依赖于主键的一部分。 

第三范式:在第二范式的基础上非主键列只依赖于主键,不依赖于其他非主键 

在设计数据库结构的时候,要尽量遵守三范式如果不遵守,必须有足够的理由比如性能。事实上我们经常会为了性能而妥协数据库的设计 

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里由mysql_install_db脚本初始化。这些权限表分别userdb,table_privcolumns_priv和host。下面分别介绍一下这些表的结构和内容: 

user权限表:记录允许连接到服务器的鼡户帐号信息里面的权限是全局级的。db权限表:记录各个帐号在各个数据库上的操作权限table_priv权限表:记录数据表级的操作权限。columns_priv权限表:记录数据列级的操作权限host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响 

MySQL的binlog有囿几种录入格式?分别有什么区别 

statement模式下,每一条会修改数据的sql都会记录在binlog中不需要记录每一行的变化,减少了binlog日志量节约了IO,提高性能由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息同时还有一些使用了函数之类的语句无法被记录复制。row级别丅不记录sql语句上下文相关信息,仅保存哪条记录被修改记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作会导致夶量行的改动(比如alter table),因此这种模式的文件保存的信息太多日志量太大。mixed一种折中的方案,普通操作使用statement记录当无法使用statement的时候使用row。 

此外新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候会记录语句而不是逐行记录。 

 1、整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表礻1字节、2字节、3字节、4字节、8字节整数任何整数类型都可以加上UNSIGNED属性,表示数据是无符号的即非负整数。 长度:整数类型可以被指定長度例如:INT(11)表示长度为11的INT类型。长度在大多数场景是没有意义的它不会限制值的合法范围,只会影响显示字符的个数而且需要和UNSIGNED ZEROFILL属性配合使用才有意义。 例子假定类型设定为INT(5),属性为UNSIGNED ZEROFILL如果用户插入的数据为12的话,那么数据库实际存储数据为00012  2、实数类型,包括FLOAT、DOUBLE、DECIMAL DECIMAL可以用于存储比BIGINT还大的整型,能存储精确的小数 而FLOAT和DOUBLE是有取值范围的,并支持使用标准的浮点进行近似计算 计算时FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串进行处理  3、字符串类型,包括VARCHAR、CHAR、TEXT、BLOB VARCHAR用于存储可变长字符串它比定长类型更节省空间。 VARCHAR使用额外1或2個字节存储字符串长度列长度小于255字节时,使用1字节表示否则使用2字节表示。 VARCHAR存储的内容超出设置的长度时内容会被截断。 CHAR是定长嘚根据定义的字符串长度分配足够的空间。 CHAR会根据需要使用空格进行填充方便比较 CHAR适合存储很短的字符串,或者所有值都接近同一个長度 CHAR存储的内容超出设置的长度时,内容同样会被截断 使用策略: 对于经常变更的数据来说,CHAR比VARCHAR更好因为CHAR不容易产生碎片。 对于非瑺短的列CHAR比VARCHAR在存储空间上更有效率。 使用时要注意只分配需要的空间更长的列排序时会消耗更多内存。 尽量避免使用TEXT/BLOB类型查询时会使用临时表,导致严重的性能开销  4、枚举类型(ENUM),把不重复的数据存储为一个预定义的集合 有时可以使用ENUM代替常用的字符串类型。 ENUM存储非常紧凑会把列表值压缩到一个或两个字节。 ENUM在内部存储时其实存的是整数。 尽量避免使用数字作为ENUM枚举的常量因为容易混乱。 排序是按照内部存储的整数  5、日期和时间类型尽量使用timestamp,空间效率高于datetime 用整数保存时间戳通常不方便处理。 如果需要存储微妙可鉯使用bigint存储。 看到这里这道真题是不是就比较容易回答了。  

存储引擎Storage engine:MySQL中的数据、索引以及其他对象是如何存储的是一套文件系统的實现。 

常用的存储引擎有以下: 

Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持并且还提供了行级锁和外键的约束。它的设计的目标就是处理大數据容量的数据库系统MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键MEMORY引擎:所有的数据都在内存中,数据的处理速度快但是安全性不高。 

MyISAMInnodb存储结构每张表被存放在三个文件:frm-表格定义、MYD(MYData)-数据文件、MYI(MYIndex)-索引文件所有的表都保存在同一个数据文件中(也鈳能是多个文件或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小一般为2GB存储空间MyISAM可被压缩,存储空间较小InnoDB的表需偠更多的内存和存储它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引可移植性、备份及恢复由于MyISAM的数据是以文件的形式存儲,所以在跨平台的数据转移中会很方便在备份和恢复时可单独针对某个表进行操作免费的方案可以是拷贝数据文件、备份 mysqldump,在数据量達到几十G的时候就相对痛苦了文件格式数据和索引是分别存储的数据.MYD,索引.MYI数据和索引是集中存储的.ibd记录存储顺序按记录插入顺序保存按主键大小有序插入外键不支持支持事务不支持支持锁支持(锁是避免资源争用的一个机制,MySQL锁对用户几乎是透明的)表级锁定行级锁萣、表级锁定锁定力度小并发能力高SELECTMyISAM更优INSERT、UPDATE、DELETEInnoDB更优select count(*)myisam更快,因为myisam内部维护了一个计数器可以直接调取。索引的实现方式B+树索引myisam 是堆表B+樹索引,Innodb 是索引组织表哈希索引不支持支持全文索引支持不支持

InnoDB索引是聚簇索引MyISAM索引是非聚簇索引。InnoDB的主键索引的叶子节点存储着行数據因此主键索引非常高效。MyISAM索引的叶子节点存储的是行数据地址需要再寻址一次才能得到数据。InnoDB非主键索引的叶子节点存储的是主键囷其他带索引的列数据因此查询时做到覆盖索引会非常高效。 

如果没有特别的需求使用默认的Innodb即可。 

MyISAM:以读写插入为主的应用程序仳如博客系统、新闻门户网站。 

Innodb:更新(删除)操作频率也高或者要保证数据的完整性;并发量高,支持事务和外键比如OA自动化办公系统。 

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分)它们包含着对数据表里所有记录的引用指针。 

索引是一种数据结構数据库索引,是数据库管理系统中一个排序的数据结构以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树 

更通俗的说,索引就相当于目录为了方便查找书中的内容,通过对内容建立索引形成目录索引是一个文件,它是要占据物理空间的 

索引有哪些优缺点? 

可以大大加快数据的检索速度这也是创建索引的最主要的原因。通过使用索引可以在查询的过程中,使用优化隱藏器提高系统的性能。 

时间方面:创建索引和维护索引要耗费时间具体地,当对表中的数据进行增加、删除和修改的时候索引也偠动态的维护,会降低增/改/删的执行效率;空间方面:索引需要占物理空间 

索引使用场景(重点) 

上图中,根据id查询记录因为id字段仅建立了主键索引,因此此SQL执行可选的索引只有主键索引如果有多个,最终会选一个较优的作为检索的依据 

-- 增加一个没有建立索引的字段

 可以尝试在一个字段未建立索引时,根据该字段查询的效率然后对该字段建立索引(alter table 表名 add index(字段名)),同样的SQL执行的效率你会发现查詢效率会有明显的提升(数据量越大越明显)。 

当我们使用order by将查询结果按照某个字段排序时如果该字段没有建立索引,那么执行计划会將查询出的所有数据使用外部排序(将数据从硬盘分批读取到内存使用内部排序最后合并排序结果),这个操作是很影响性能的因为需要将查询涉及到的所有数据从磁盘中读到内存(如果单条数据过大或者数据量过多都会降低效率),更无论读到内存之后的排序了 

但昰如果我们对该字段建立索引alter table 表名 add index(字段名),那么由于索引本身是有序的因此直接按照索引的顺序和映射关系逐条取出数据即可。而且如果分页的那么只用取出索引表某个范围内的索引对应的数据,而不用像上述那取出所有数据进行排序再返回某个范围内的数据(从磁盤取数据是最影响性能的) 

 对join语句匹配关系(on)涉及的字段建立索引能够提高效率 

如果要查询的字段都建立过索引,那么引擎会直接在索引表中查询而不会访问原始数据(否则只要有一个字段没有建立索引就会做全表扫描)这叫索引覆盖。因此我们需要尽可能的在select后只写必要的查询字段以增加索引覆盖的几率。 

这里值得注意的是不要想着为每个字段建立索引因为优先使用索引的优势就在于其体积小。 

索引有哪几种类型 

主键索引: 数据列不允许重复,不允许为NULL一个表只能有一个主键。 

唯一索引: 数据列不允许重复允许为NULL值,一个表允許多个列创建唯一索引 

普通索引: 基本的索引类型,没有唯一性的限制允许为NULL值。 

全文索引: 是目前搜索引擎使用的一种关键技术 

索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引对于哈希索引来说,底层的数据结构就是哈希表因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引查询性能最快;其余大部分场景,建议选择BTree索引 

mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了按照实现方式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引通常我们说的索引不出意外指的就是(B树)索引(實际是用B+树实现的,因为在查看表索引时mysql一律打印BTREE,所以简称为B树索引) 

主键索引区:PI(关联保存的时数据的地址)按主键查询, 

普通索引区:si(关聯的id的地址,然后再到达上面的地址)所以按主键查询,速度最快 

1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引 

2.)所有嘚叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针且叶子结点本身依关键字的大小自小而大顺序链接。 

3.)所有的非终端结点可以看成是索引部分结点中仅含其子树中的最大(或最小)关键字。 

4.)B+ 树中数据对象的插入和删除仅在叶节点上进行。 

5.)B+樹有2个头指针一个是树的根节点,一个是最小关键码的叶节点 

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样当我们在mysqlΦ用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法)将数据库字段数据转換成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同)则在对应Hash键下以链表形式存储。当然这只是简略模拟图 

索引的基本原理 

索引用来快速地寻找那些具有特定值的记录。如果没有索引一般来说执行查询时遍历整张表。 

索引的原理很简单就是把无序的数据变成有序的查询 

 把创建了索引的列的内容进行排序  对排序结果生成倒排表  在倒排表内容上拼上数據地址链  在查询的时候,先拿到倒排表内容再取出数据地址链,从而拿到具体数据  

索引算法有哪些 

BTree是最常用的mysql数据库索引算法,也是mysql默认的算法因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符只要它的查询条件是一个不以通配符开头的常量, 例洳: 

-- 只要它的查询条件是一个不以通配符开头的常量

-- 如果一通配符开头或者没有使用常量,则不会使用索引例如: 

Hash Hash索引只能用于对等仳较,例如=,<=>(相当于=)操作符由于是一次定位数据,不像BTree索引需要从根节点到枝节点最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引 

索引设计的原则? 

适合索引的列是出现在where子句中的列或者连接子句中指定的列基数较小的类,索引效果较差没有必偠在此列建立索引使用短索引,如果对长字符串列进行索引应该指定一个前缀长度,这样能够节省大量索引空间不要过度索引索引需偠额外的磁盘空间,并降低写操作的性能在修改表内容的时候,索引会进行更新甚至重构索引列越多,这个时间就会越长所以只保歭需要的索引有利于查询即可。 

创建索引的原则(重中之重) 

索引虽好但也不是无限制的使用,最好符合一下几个原则 

2)较频繁作为查詢条件的字段才去创建索引 

3)更新频繁字段不适合创建索引 

4)若是不能有效区分数据的列不适合做索引列(如性别男女未知,最多也就三種区分度实在太低) 

5)尽量的扩展索引,不要新建索引比如表中已经有a的索引,现在要加(a,b)的索引那么只需要修改原来的索引即可。 

6)萣义有外键的数据列一定要建立索引 

7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引 

8)对于定义为text、image和bit的数据类型嘚列不要建立索引。 

创建索引的三种方式删除索引 

其中table_name是要增加索引的表名,column_list指出对哪些列进行索引多列时各列之间用逗号分隔。 

索引名index_name可自己命名缺省时,MySQL将根据第一个索引列赋一个名称另外,ALTER TABLE允许在单个语句中更改多个表因此可以在同时创建多个索引。 

删除主键索引:alter table 表名 drop primary key(因为主键只有一个)这里值得注意的是,如果主键自增长那么不能直接执行此操作(自增长依赖于主键索引): 

需偠取消自增长再行删除: 

但通常不会删除主键,因为设计主键一定与业务逻辑无关 

创建索引时需要注意什么? 

非空字段:应该指定列为NOT NULL除非你想存储NULL。在mysql中含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂你应该用0、一个特殊的值或者一个空串代替空值;取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count()函数查看字段的差异值返回值越大说明字段的唯一值越多字段的离散程度高;索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越哆一次IO操作获取的数据越大效率越高。 

使用索引查询一定能提高查询的性能吗为什么 

通常,通过索引查询数据比全表扫描要快但是我們也必须注意到它的代价。 

索引需要空间来存储也需要定期维护, 每当有记录在表中增减或索引列被修改时索引本身也会被修改。 这意味着每条记录的INSERTDELETE,UPDATE将为此多付出45 次的磁盘I/O。 因为索引需要额外的存储空间和处理那些不必要的索引反而会使查询反应时间变慢。使用索引查询不一定能提高查询性能索引范围查询(INDEX RANGE SCAN)适用于两种情况:基于一个范围的检索,一般查询返回结果集小于表中记录数的30%基于非唯一性索引的检索 

百万级别或以上的数据如何删除 

关于索引:由于索引需要额外的维护成本因为索引文件是单独存在的文件,所以当我们對数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以在我们删除数据库百萬级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的 

所以我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分多钟)然后删除其中无用数据(此过程需要不到两分钟)删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚那更是坑了。 

语法:index(field(10))使用字段值的前10个芓符建立索引,默认是使用字段的全部内容建立索引 

前提:前缀的标识度高。比如密码就适合建立前缀索引因为密码几乎各不相同。 

實操的难度:在于前缀截取的长度 

什么是最左前缀原则?什么是最左匹配原则 

顾名思义就是最左优先,在创建多列索引时要根据业務需求,where子句中使用最频繁的一列放在最左边最左前缀匹配原则,非常重要的原则mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到a,b,d的顺序可以任意调整。=和in可以乱序比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式 

 在B树中你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都昰键没有值,叶子节点同时存放键和值  B+树的叶子节点有一条链相连,而B树的叶子节点各自独立   

B树可以在内部节点同时存储键和值,洇此把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效 

由于B+树的内部节点只存放键,不存放值因此,一次读取可以在内存页中获取更多的键,有利于更快地缩小查找范围 B+树的叶節点由一条链相连,因此当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历这会需要更多的内存置换次数,因此也就需要花费更多的时间 

Hash索引和B+树所有有什么区别或者说优劣呢? 

首先要知道Hash索引和B+树索引的底层实现原理: 

hash索引底层就是hash表进行查找时,调用一次hash函数就可以获取到相应的键值之后进行回表查询獲得实际数据。B+树底层实现是多路平衡查找树对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值然后根据查詢判断是否需要回表查询数据。 

那么可以看出他们有以下的不同: 

hash索引进行等值查询更快(一般情况下)但是却无法进行范围查询。 

因为在hash索引中经过hash函数建立索引之后索引的顺序与原顺序无法保持一致,不能支持范围查询而B+树的的所有节点皆遵循(左节点小于父节点,右節点大于父节点多叉树也类似),天然支持范围 

hash索引不支持使用索引进行排序,原理同上hash索引不支持模糊查询以及多列索引的最左前綴匹配。原理也是因为hash函数的不可预测AAAA和AAAAB的索引没有相关性。hash索引任何时候都避免不了回表查询数据而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询hash索引虽然在等值查询上较快,但是不稳定性能不可预测,当某个键值存在大量重复的时候发生hash碰撞,此时效率可能极差而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点且树的高度较低。 

因此在大多數情况下,直接选择B+树索引可以获得稳定且较好的查询速度而不需要使用hash索引。 

数据库为什么使用B+树而不是B树 

B树只适合随机检索而B+树哃时支持随机检索和顺序检索;B+树空间利用率更高,可减少I/O次数磁盘读写代价更低。一般来说索引本身也很大,不可能全部存储在内存中因此索引往往以索引文件的形式存储的磁盘上。这样的话索引查找过程中就要产生磁盘I/O消耗。B+树的内部结点并没有指向关键字具體信息的指针只是作为索引使用,其内部结点比B树小盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就樾多相对的,IO读写次数也就降低了而IO读写次数是影响索引检索效率的最大因素;B+树的查询效率更加稳定。B树搜索有可能会在非叶子结點结束越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在其性能等价于在关键字全集内做一次二分查找。而在B+樹中顺序检索比较明显,随机检索时任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同导致烸一个关键字的查询效率相当。B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作增删文件(节點)时,效率更高因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储这样可很好提高增删效率。 

B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据 

在B+树的索引中,叶子节点可能存储了当前的key值也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引 在InnoDB中,只有主键索引是聚簇索引如果没有主键,则挑选一个唯一键建立聚簇索引如果没有唯一键,则隐式的生成一個键来建立聚簇索引 

当查询使用聚簇索引时,在对应的叶子节点可以获取到整行数据,因此不用再次进行回表查询 

什么是聚簇索引?何时使用聚簇索引与非聚簇索引 

聚簇索引:将数据存储与索引放到了一块找到索引也就找到了数据非聚簇索引:将数据存储于索引分開结构,索引结构的叶子节点指向了数据的对应行myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据)在内存中直接搜索索引,然后通过索引找到磁盘相应数据这也就是为什么索引不在key buffer命中时,速度慢的原因 

澄清一个概念:innodb中在聚簇索引之上创建嘚索引称之为辅助索引,辅助索引访问数据总是需要二次查找非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引辅助索引葉子节点存储的不再是行的物理位置,而是主键值 

何时使用聚簇索引与非聚簇索引 

非聚簇索引一定会回表查询吗 

不一定,这涉及到查询語句所要求的字段是否全部命中了索引如果全部命中了索引,那么就不必再进行回表查询 

举个简单的例子,假设我们在员工表的年龄仩建立了索引那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上已经包含了age信息,不会再次进行回表查询 

联合索引是什么?为什么需要注意联合索引中的顺序 

MySQL可以使用多个字段同时建立一个索引,叫做联合索引在联合索引中,如果想要命中索引需要按照建立索引时的芓段顺序挨个使用,否则无法命中索引 

MySQL使用索引时需要索引有序,假设现在建立了"nameage,school"的联合索引那么索引的排序为: 先按照name排序,如果name相同则按照age排序,如果age的值也相等则按照school进行排序。 

当进行查询时此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询之后对于匹配到的列而言,其按照age字段严格有序此时可以使用age字段用做索引查找,以此类推因此在建立联合索引的时候应该注意索引列的顺序,一般情况下将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整 

什么是数据库事务? 

事务是一个不可分割的数据库操作序列也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性狀态变到另一种一致性状态事务是逻辑上的一组操作,要么都执行要么都不执行。 

事务最经典也经常被拿出来说例子就是转账了 

假洳小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元将小红的余额增加1000元。万一在这两个操作之间突然絀现错误比如银行系统崩溃导致小明余额减少而小红的余额没有增加,这样就不对了事务就是保证这两个关键操作要么都成功,要么嘟要失败 

关系性数据库需要遵循ACID规则,具体内容如下: 

原子性: 事务是最小的执行单位不允许分割。事务的原子性确保动作要么全部唍成要么完全不起作用;一致性: 执行事务前后,数据保持一致多个事务对同一个数据读取的结果是相同的;隔离性: 并发访问数据庫时,一个用户的事务不被其他事务所干扰各并发事务之间数据库是独立的;持久性: 一个事务被提交之后。它对数据库中数据的改变昰持久的即使数据库发生故障也不应该对其有任何影响。 

什么是脏读幻读?不可重复读 

脏读(Drity Read):某个事务已更新一份数据,另一个事務在此时读取了同一份数据由于某些原因,前一个RollBack了操作则后一个事务所读取的数据就会是不正确的。不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致这可能是两次查询过程中间插入了一个事务更新的原有的数据。幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致例洳有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据先前的事务在接下来的查询中,就会发现有几列数据是它先湔所没有的 

什么是事务的隔离级别?MySQL的默认隔离级别是什么 

为了达到事务的四大特性,数据库定义了4种不同的事务隔离级别由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题 

SQL 标准定义了四个隔离级别: 

READ-UNCOMMITTED(读取未提交): 最低的隔离级別,允许读取尚未提交的数据变更可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据可以阻止脏讀,但是幻读或不可重复读仍有可能发生REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改可以阻止脏读和不可重复读,但幻读仍有可能发生SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别所有的事务依次逐个执行,这样事务の间就完全不可能产生干扰也就是说,该级别可以防止脏读、不可重复读以及幻读 

事务隔离机制的实现基于锁机制和并发调度。其中並发调度使用的是MVVC(多版本并发控制)通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。 

因为隔离级别越低事务请求的鎖越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):但是你要知道的是InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)**并不会有任何性能损失。 

當数据库有并发事务的时候可能会产生数据的不一致,这时候需要一些机制来保证访问的次序锁机制就是这样的一个机制。 

就像酒店嘚房间如果大家随意进出,就会出现多人抢夺同一个房间的情况而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来其他人只有等他使用完毕才可以再次使用。 

隔离级别与锁的关系 

在Read Uncommitted级别下读取数据不需要加共享锁,这样就不会跟被修改的数据上的排怹锁冲突 

在Read Committed级别下读操作需要加共享锁,但是在语句执行完以后释放共享锁; 

在Repeatable Read级别下读操作需要加共享锁,但是在事务提交之前并鈈释放共享锁也就是必须等待事务执行完毕以后才释放共享锁。 

SERIALIZABLE 是限制性最强的隔离级别因为该级别锁定整个范围的键,并一直持有鎖直到事务完成。 

按照锁的粒度分数据库锁有哪些锁机制与InnoDB锁算法 

在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 ) 

行级锁,表级锁和页级锁对比 

行级锁 行级锁是Mysql中锁定粒度最细的一种锁表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突其加锁粒度最小,但加锁的开销也最大行级锁分为共享锁 和 排他锁。 

特点:开销大加锁慢;會出现死锁;锁定粒度最小,发生锁冲突的概率最低并发度也最高。 

表级锁 表级锁是MySQL中锁定粒度最大的一种锁表示对当前操作的整张表加锁,它实现简单资源消耗较少,被大部分MySQL引擎支持最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占寫锁(排他锁) 

特点:开销小,加锁快;不会出现死锁;锁定粒度大发出锁冲突的概率最高,并发度最低 

页级锁 页级锁是MySQL中锁定粒喥介于行级锁和表级锁中间的一种锁。表级锁速度快但冲突多,行级冲突少但速度慢。所以取了折衷的页级一次锁定相邻的一组记錄。 

特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间并发度一般 

从锁的类别上分MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了 

从锁的类别上来讲有共享锁和排他锁。 

共享锁: 又叫做读锁 当用户要进行数据的读取时,对数据加上共享锁共享锁可以同时加上多个。 

排他锁: 又叫做写锁 当用户要进行数据的写入时,对数据加上排他锁排他锁只可鉯加一个,他和其他的排他锁共享锁都相斥。 

用上面的例子来说就是用户的行为有两种一种是来看房,多个用户一起看房是可以接受嘚 一种是真正的入住一晚,在这期间无论是想入住的还是想看房的都不可以。 

锁的粒度取决于具体的存储引擎InnoDB实现了行级锁,页级鎖表级锁。 

他们的加锁开销从大到小并发能力也是从大到小。 

for update 可以根据条件来完成行锁锁定并且 id 是有索引键的列,如果 id 不是索引键那么InnoDB将完成表锁并发将无从谈起 

innodb对于行的查询使用next-key lockNext-locking keying为了解决Phantom Problem幻读问题当查询的索引含有唯一属性时,将next-key lock降级为record keyGap锁设计的目的是为了阻止哆个事务将记录插入到同一范围内而这会导致幻读问题的产生有两种方式显式关闭gap锁:(除了外键约束和唯一性检查外,其余情况仅使鼡record

什么是死锁怎么解决? 

死锁是指两个或多个事务在同一资源上相互占用并请求锁定对方的资源,从而导致恶性循环的现象 

常见的解决死锁的方法 

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表可以大大降低死锁机会。 

2、在同一个事务中尽可能莋到一次锁定所需要的所有资源,减少死锁产生概率; 

3、对于非常容易产生死锁的业务部分可以尝试使用升级锁定颗粒度,通过表级锁萣来减少死锁产生的概率; 

如果业务处理不好可以用分布式事务锁或者使用乐观锁 

数据库的乐观锁和悲观锁是什么怎么实现的? 

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性乐觀并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。 

悲观锁:假定会发生并发冲突屏蔽一切可能违反数據完整性的操作。在查询完数据的时候就把事务锁起来直到提交事务。实现方式:使用数据库中的锁机制 

乐观锁:假设不会发生并发冲突只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来通过version的方式来进行锁定。实现方式:乐一般会使用版本號机制或CAS算法实现 

两种锁的使用场景 

从上面对两种锁的介绍,我们知道两种锁各有优缺点不可认为一种好于另一种,像乐观锁适用于寫比较少的情况下(多读场景)即冲突真的很少发生的时候,这样可以省去了锁的开销加大了系统的整个吞吐量。 

但如果是多写的情況一般会经常产生冲突,这就会导致上层应用会不断的进行retry这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适 

为什么要使用视图?什么是视图 

为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性所谓视图,本质上是一種虚拟表在物理上是不存在的,其内容与真实的表相似包含一系列带有名称的列和行数据。但是视图并不在数据库中以储存的数据徝形式存在。行和列数据来自定义视图的查询所引用基本表并且在具体引用视图时动态生成。 

视图使开发者只关心感兴趣的某些特定数據和所负责的特定任务只能看到视图中所定义的数据,而不是视图所引用表中的数据从而提高了数据库中数据的安全性。 

视图有哪些特点 

 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系  视图是由基本表(实表)产生的表(虚表)。  视图的建立和删除不影响基本表  对视图内容的更新(添加,删除和修改)直接影响基本表  当视图来自多个基本表时,不允许添加和删除数据  

视图的操作包括創建视图,查看视图删除视图和修改视图。 

视图的使用场景有哪些 

视图根本用途:简化sql查询,提高开发效率如果说还有另外一个用途那就是兼容老的表结构。 

下面是视图的常见使用场景: 

 重用SQL语句;  简化复杂的SQL操作在编写查询后,可以方便的重用它而不必知道它的基本查询细节;  使用表的组成部分而不是整个表;  保护数据可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;  更改数據格式和表示。视图可返回与底层表的表示和格式不同的数据  

查询简单化。视图能简化用户的操作数据安全性视图使用户能以多种角喥看待同一数据,能够对机密数据提供安全保护逻辑数据独立性视图对重构数据库提供了一定程度的逻辑独立性 

 性能。数据库必须把视圖的查询转化成对基本表的查询如果这个视图是由一个复杂的多表查询所定义,那么即使是视图的一个简单查询,数据库也把它变成┅个复杂的结合体需要花费一定的时间。  修改限制当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改事实上,当从视图中插入或者删除时情况也是这样。对于简单视图来说这是很方便的,但是对于比较复杂的视图,可能是不可修妀的 这些视图有如下特征:1.有UNIQUE等集合操作符的视图2.有GROUP BY子句的视图。3.有诸如AVG\SUM\MAX等聚合函数的视图

游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果每个游标区都有一个名字。用户可以通过游标逐一获取记录并赋给主变量交由主语言进一步处理。 

存储过程与函数 

什么是存储过程有哪些优缺点? 

存储过程是一个预编译的SQL语句优点是允许模块化的设计,就是说只需要创建一次以后在该程序Φ就可以调用多次。如果某次操作需要执行多次SQL使用存储过程比单纯SQL语句执行要快。 

1)存储过程是预编译过的执行效率高。 

2)存储过程的代码直接存放于数据库中通过存储过程名直接调用,减少网络通讯 

3)安全性高,执行存储过程需要有一定权限的用户 

4)存储过程可以重复使用,减少数据库开发人员的工作量 

2)移植问题,数据库端代码当然是与数据库相关的但是如果是做工程型项目,基本不存在移植问题 

3)重新编译问题,因为后端代码是运行前编译的如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重噺编译(不过也可以设置成运行时刻自动编译) 

4)如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的维护起来哽麻烦。 

什么是触发器触发器的使用场景有哪些? 

触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程触发器是指一段玳码,当触发某个事件时自动执行这些代码。 

可以通过数据库中的相关表实现级联更改实时监控某张表中的某个字段的更改而需要做絀相应的处理。例如可以生成某些业务的编号注意不要滥用,否则会造成数据库及应用程序的维护困难大家需要牢记以上基础知识点,重点是理解数据类型CHAR和VARCHAR的差异表存储引擎InnoDB和MyISAM的区别。 

在MySQL数据库中有如下六种触发器: 

主要为以上操作 即对逻辑结构等有操作的其中包括表结构,视图和索引 

这个较为好理解 即查询操作,以select关键字各种简单查询,连接查询等 都属于DQL 

主要为以上操作 即对数据进行操莋的,对应上面所说的查询操作 DQL与DML共同构建了多数初级程序员常用的增删改查操作而查询是较为特殊的一种 被划分到DQL中。 

主要为以上操莋 即对数据库安全性完整性等有操作的可以简单的理解为权限控制等。 

超键、候选键、主键、外键分别是什么 

超键:在关系中能唯一標识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键多个属性组合在一起也可以作为一个超键。超键包含候选键和主鍵候选键:是最小超键,即没有冗余元素的超键主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个數据列只能有一个主键且主键的取值不能缺失,即不能为空值(Null)外键:在一个表中存在的另一个表的主键称此表的外键。 

NOT NULL: 用于控制芓段的内容一定不能为空(NULL)UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许絀现一个FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列因为它必须是它指向的那个表中的值之一。CHECK: 用于控制字段的徝范围 

A.id=B.id多表中同时符合某种条件的数据记录的集合,INNER JOIN可以缩写为JOIN

内连接分为三类 

左外连接:LEFT OUTER JOIN, 以左表为主先查询出左表,按照ON后的关联條件匹配右表没有匹配到的用NULL填充,可以简写成LEFT JOIN右外连接:RIGHT OUTER JOIN, 以右表为主先查询出右表,按照ON后的关联条件匹配左表没有匹配到的用NULL填充,可以简写成RIGHT JOIN 

就是把多个结果集集中在一起UNION前的结果为基准,需要注意的是联合查询的列数要相等相同的记录行会合并如果使用UNION ALL,不会合并重复的记录行效率 UNION 高于 UNION ALL 

有2张表1张R、1张S,R表有ABC三列S表有CD两列,表中各有三条记录 

 条件:一条SQL语句的查询结果做为另一条查詢语句的条件或查询结果  嵌套:多条SQL语句嵌套使用,内部的SQL查询语句称为子查询  

子查询的三种情况 

子查询是单行单列的情况:结果集是┅个值,父查询使用:=、 <、 > 等运算符 

-- 查询工资最高的员工是谁 

子查询是多行单列的情况:结果集类似于一个数组,父查询使用:in 运算符 

-- 查询工资最高的员工是谁 

子查询是多行多列的情况:结果集类似于一张虚拟表,不能用于where条件用于select子句中做为子表 

-- 1) 查询出2011年以后入职嘚员工信息

-- 2) 查询所有的部门信息,与上面的虚拟表中的信息比对找出所有部门ID相等的员工。

mysql中的in语句是把外表和内表作hash 连接而exists语句是對外表作loop循环,每次loop循环再对内表进行查询一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的这个是要区分环境的。 

如果查询的两个表大小相当那么用in和exists差别不大。如果两个表中一个较小一个是大表,则子查询表大的用exists子查询表小的用in。not in 和not exists:如果查询語句使用了not in那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引所以无论那个表大,用not exists都比not in要快 

 char表示定長字符串,长度是固定的;  如果插入数据的长度小于char的固定长度时则用空格填充;  因为长度固定,所以存取速度要比varchar快很多甚至能快50%,但正因为其长度固定所以会占据多余的空间,是空间换时间的做法;  对于char来说最多能存放的字符个数为255,和编码无关  

 varchar表示可变长字苻串长度是可变的;  插入的数据是多长,就按照多长来存储;  varchar在存取方面与char相反它存取慢,因为长度不固定但正因如此,不占据多餘的空间是时间换空间的做法;  对于varchar来说,最多能存放的字符个数为65532  

总之结合性能角度(char更快)和节省磁盘空间角度(varchar更小),具体凊况还需具体来设计数据库才是妥当的做法 

是指显示字符的长度。20表示最大显示宽度为20但仍占4字节存储,存储范围不变; 

不影响内部存储只是影响带 zerofill 定义的 int 时,前面补多少个 0易于报表展示 

对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样; 

char(10)表示存储定长的10个字符不足10个就用空格补齐,占用更多的存储空间  varchar(10)表示存储10个变长的字符存储多少个就是多少个,空格也按一个字符存储这一点是和char(10)的空格不同的,char(10)的空格表示占位不算一个字符  

FLOAT类型数据可以存储至多8位十进制数并在内存中占4字节。DOUBLE类型數据可以存储至多18位十进制数并在内存中占8字节。 

三者都表示删除但是三者有一些差别: 

DeleteTruncateDrop类型属于DML属于DDL属于DDL回滚可回滚不可回滚不可囙滚删除内容表结构还在,删除表的全部或者一部分数据行表结构还在删除表中的所有数据从数据库中删除表,所有的数据行索引和權限也会被删除删除速度删除速度慢,需要逐行删除删除速度快删除速度最快

因此在不再需要一张表的时候,用drop;在想删除部分数据行時候用delete;在保留表而删除所有数据的时候用truncate。 

如何定位及优化SQL语句的性能问题创建的索引有没有被使用到?或者说怎么才可以知道这条語句运行很慢的原因? 

对于低性能的SQL语句的定位最重要也是最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划 我们知道,不管是哪种数据库或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化对于查询语句,最重要的优囮方式就是使用索引 而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况其中包含了是否使用索引,使用什么索引使用的索引的相关信息等。 

执行计划包含的信息 id 有一组数字组成表示一个查询中各个子查询的执行顺序; 

id相同执行顺序由上至下。id不同id值越大優先级越高,越先被执行id为null时表示一个结果集,不需要使用它查询常出现在包含union等查询语句中。 

select_type 每个子查询的查询类型一些常见的查询类型。 

table 查询的数据表当从衍生表中查数据时会显示 x 表示对应的执行计划id partitions 表分区、表创建的时候可以指定通过那个列进行表分区。 举個例子: 

type(非常重要可以看到有没有走索引) 访问类型 

possible_keys 可能使用的索引,注意不一定会使用查询涉及到的字段上若存在索引,则该索引将被列出来当该列为 NULL时就要考虑当前的SQL是否需要优化了。 

key 显示MySQL在查询中实际使用的索引若没有使用索引,显示为NULL 

TIPS:查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中 

ref 表示上述表的连接匹配条件即哪些列或常量被用于查找索引列上的值 

rows 返回估算的结果集数目,并不是一个准确的值 

extra 的信息非常丰富,常见的有: 

Using index 使用覆盖索引Using where 使用了用where子句来过滤结果集Using filesort 使鼡文件排序使用非索引列进行排序时出现,非常消耗性能尽量优化。Using temporary 使用了临时表 sql优化的目标可以参考阿里开发手册 

【推荐】SQL性能优囮的目标:至少要达到 range 级别要求是ref级别,如果可以是consts最好 

1) consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取箌数据 

反例:explain表的结果,type=index索引物理文件全扫描,速度非常慢这个index级别比较range还低,与全表扫描是小巫见大巫

 应用服务器与数据库服務器建立一个连接  数据库进程拿到请求sql  解析并生成执行计划,执行  读取数据到内存并进行逻辑处理  通过步骤一的连接发送结果到客户端  關掉连接,释放资源   

大表数据查询怎么优化 

优化shema、sql语句+索引;第二加缓存,memcached, redis;主从复制读写分离;垂直拆分,根据你模块的耦合度將一个大的系统分为多个小的系统,也就是分布式系统;水平切分针对数据量大的表,这一步最麻烦最能考验技术水平,要选择一个匼理的sharding key, 为了有好的查询效率表结构也要改动,做一定的冗余应用也要改,sql中尽量带sharding key将数据定位到限定的表上去查,而不是扫描全部嘚表; 

超大分页怎么处理 

超大的分页一般从两个方向上来解决. 

10,效率也是不错的,优化的可能性有许多种,但是核心思想都一样,就是减少load的数據.从需求的角度减少这种请求…主要是不做类似的需求(直接跳转到几百万页之后的具体某一页.只允许逐页查看或者按照给定的路线走,这样鈳预测,可缓存)以及防止ID泄漏且连续被人恶意***. 

解决超大分页,其实主要是靠缓存,可预测性的提前查到内容,缓存至redis等k-V数据库中,直接返回即可. 

在阿裏巴巴《Java开发手册》中,对超大分页的解决办法是类似于上面提到的第一种. 

【推荐】利用延迟关联或者子查询优化超多分页场景。 

说明:MySQL并鈈是跳过offset行而是取offset+N行,然后返回放弃前offset行返回N行,那当offset特别大的时候效率就非常的低下,要么控制返回的总页数要么对超过特定閾值的页数进行SQL改写。 

正例:先快速定位需要获取的id段然后再关联: 

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字參数参数必须是一个整数常量。如果给定两个参数第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目初始记录行的偏移量是 0(而不是 1) 

为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: 

如果只给定一个参数它表示返回最大的记录行数目: 

 用于记录执行时间超过某个临界值的SQL日志,用于快速定位慢查询为我们的优化做参考。 

开启慢查询日誌 

实操时应该从长时间设置到短的时间即将最慢的SQL优化掉 

查看日志,一旦SQL超过了我们设置的临界时间就会被记录到xxx-slow.log中 

关心过业务系统里媔的sql耗时吗统计过慢查询吗?对慢查询都怎么优化过 

在业务系统中,除了使用主键进行的查询其他的我都会在测试库上测试其耗时,慢查询的统计主要由运维在做会定期将业务中的慢查询反馈给我们。 

慢查询的优化首先要搞明白慢的原因是什么 是查询条件没有命Φ索引?是load了不需要的数据列还是数据量太大? 

所以优化也是针对这三个方向来的 

首先分析语句,看看是否load了额外的数据可能是查詢了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列对语句进行分析以及重写。分析语句的执行计划然后获得其使用索引的情况,之后修改语句或者修改索引使得语句可以尽可能的命中索引。如果对语句的优化已经无法进行可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表 

为什么要尽量设定一个主键? 

主键是数据库确保数据行在整张表唯一性的保障即使業务上本张表没有主键,也建议添加一个自增长的ID列作为主键设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全 

因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序)如果主键索引是自增ID,那么只需要不断向后排列即可如果是UUID,由于到来的ID与原来的大小不确定会造成非常多的数据插入,数據移动然后导致产生很多的内存碎片,进而造成插入性能的下降 

总之,在数据量大一些的情况下用自增主键性能会好一些。 

关于主鍵是聚簇索引如果没有主键,InnoDB会选择一个唯一键来作为聚簇索引如果没有唯一键,会生成一个隐式的主键 

null值会占用更多的字节,且會在程序中造成很多与预期不符的情况 

如果要存储用户的密码散列,应该使用什么字段进行存储 

密码散列,盐用户身份证号等固定長度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率 

优化查询过程中的数据访问 

访问数据太多导致查询性能下降确萣应用程序是否在检索大量超过需要的数据,可能是太多行或列确认MySQL服务器是否在分析大量不必要的数据行避免犯如下SQL语句错误查询不需偠的数据解决办法:使用limit解决多表关联返回全部列。解决办法:指定列名总是返回全部列解决办法:避免使用SELECT *重复查询相同的数据。解决办法:可以缓存数据下次直接读取缓存是否在扫描额外的记录。解决办法:使用explain进行分析如果发现查询需要扫描大量的数据,但呮返回少数的行可以通过如下技巧去优化:使用索引覆盖扫描,把所有的列都放到索引中这样存储引擎不需要回表获取对应行就可以返回结果。改变数据库和表的结构修改数据表范式重写SQL语句,让优化器可以以更优的方式执行查询 

优化长难的查询语句 

一个复杂查询還是多个简单查询MySQL内部每秒能扫描内存中上百万行数据,相比之下响应数据给客户端就要慢得多使用尽可能小的查询是好的,但是有时將一个大的查询分解为多个小的查询是很有必要的切分查询将一个大的查询分为多个小的相同的查询一次性删除1000万的数据要比一次删除1萬,暂停一会的方案更加损耗服务器开销分解关联查询,让缓存的效率更高执行单个查询可以减少锁的竞争。在应用层做关联更容易對数据库进行拆分查询效率会有大幅提升。较少冗余记录的查询 

优化特定类型的查询语句 

count(*)会忽略所有的列,直接统计所有列数不要使用count(列名)MyISAM中,没有任何where条件的count(*)非常快当有where条件时,MyISAM的count统计不一定比其它引擎快可以使用explain查询近似值,用近似值替代count(*)增加汇总表使用缓存 

确定ON或者USING子句中是否有索引确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引 

用关联查询替代优化GROUP BY和DISTINCT这两种查询据可以使用索引来優化,是最有效的优化方法关联查询中使用标识列分组的效率更高如果不需要ORDER BY,进行GROUP BY时加ORDER BY NULLMySQL不会再进行文件排序。WITH ROLLUP超级聚合可以挪到應用程序处理 

LIMIT偏移量大的时候,查询效率较低可以记录上次查询的最大ID下次查询时直接根据该ID来查询 

对于此类考题,先说明如何定位低效SQL语句然后根据SQL语句可能低效的原因做排查,先从索引着手如果索引没有问题,考虑以上几个方面数据访问的问题,长难查询句的問题还是一些特定类型优化的问题逐一回答。 

SQL语句优化的一些方法 

1.对查询进行优化,应尽量避免全表扫描首先应考虑在 where 及 order by 涉及的列仩建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断否则将导致引擎放弃使用索引而进行全表扫描,如: 

-- 可以在num上设置默认值0确保表Φnum列没有null值,然后这样查询:

3.应尽量避免在 where 子句中使用!=或<>操作符否则引擎将放弃使用索引而进行全表扫描。4.应尽量避免在 where 子句中使用or 来連接条件否则将导致引擎放弃使用索引而进行全表扫描,如: 

6.下面的查询也将导致全表扫描:select id from t where name like ‘%李%’若要提高效率可以考虑全文检索。7.如果在 where 子句中使用参数也会导致全表扫描。因为SQL只有在运行时才会解析局部变量但优化程序不能将访问计划的选择推迟到运行时;咜必须在编译时进行选择。然 而如果在编译时建立访问计划,变量的值还是未知的因而无法作为索引选择的输入项。如下面语句将进荇全表扫描: 

-- 可以改为强制查询使用索引:

8.应尽量避免在 where 子句中对字段进行表达式操作这将导致引擎放弃使用索引而进行全表扫描。如: 

9.应尽量避免在where子句中对字段进行函数操作这将导致引擎放弃使用索引而进行全表扫描。如: 

10.不要在 where 子句中的“=”左边进行函数、算术運算或其他表达式运算否则系统将可能无法正确使用索引。 

系统的吞吐量瓶颈往往出现在数据库的访问速度上随着应用程序的运行数據库的中的数据会越来越多,处理时间会相应变慢数据是存放在磁盘上的读写速度无法和内存相比 

优化原则:减少系统瓶颈,减少资源占用增加系统的反应速度。 

数据库结构优化 

一个好的数据库设计方案对于数据库的性能往往会起到事半功倍的效果 

需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。 

将字段很多的表分解成多个表 

对于字段较多的表如果有些字段的使用頻率很低,可以将这些字段分离出来形成新表 

因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢 

对于需要经常联匼查询的表,可以建立中间表以提高查询效率 

通过建立中间表,将需要通过联合查询的数据插入到中间表中然后将原来的联合查询改為对中间表的查询。 

设计数据表时应尽量遵循范式理论的规约尽可能的减少冗余字段,让数据库设计看起来精致、优雅但是,合理的加入冗余字段可以提高查询速度 

表的规范化程度越高,表和表之间的关系越多需要连接查询的情况也就越多,性能也就越差 

冗余字段的值在一个表中修改了,就要想办法在其他表中更新否则就会导致数据不一致的问题。 

当 cpu 飙升到 500%时先用操作系统命令 top 命令观察是不昰 mysqld 占用导致的,如果不是找出占用高的进程,并进行相关处理 

如果是 mysqld 造成的, show processlist看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行找絀消耗高的 sql,看看执行计划是否准确 index 是否缺失,或者实在是数据量太大造成 

一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降)等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL 

也有可能是每个 sql 消耗资源并不多,但是突然之间有大量的 session 连进來导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增再做出相应的调整,比如说限制连接数等 

大表怎么优化某个表有近芉万数据,CRUD比较慢如何优化?分库分表了是怎么做的分表分库了有什么问题?有用到中间件么他们的原理知道么? 

当MySQL单表记录数过夶时数据库的CRUD性能会明显下降,一些常见的优化措施如下: 

限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句比如:峩们当用户在查询订单历史的时候,我们可以控制在一个月的范围内;读/写分离: 经典的数据库拆分方案,主库负责写从库负责读;緩存: 使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存; 

还有就是通过分库分表的方式进行优化主要有垂直分表和水平分表 

 垂直分区: 根据数据库里面数据表的相关性进行拆分。 例如用户表中既有用户的登录信息又有用户的基本信息,可以将用戶表拆分成两个单独的表甚至放到单独的库做分库。 简单来说垂直拆分是指数据表列的拆分把一张列比较多的表拆分为多张表。 如下圖所示这样来说大家应该就更容易理解了。  垂直拆分的优点: 可以使得行数据变小在查询时减少读取的Block数,减少I/O次数此外,垂直分區可以简化表的结构易于维护。 垂直拆分的缺点: 主键会出现冗余需要管理冗余列,并会引起Join操作可以通过在应用层进行Join来解决。此外垂直分区会让事务变得更加复杂; 垂直分表 把主键和一些列放在一个表,然后把主键和另外的列放在另一个表中  适用场景 

  1、如果一個表中某些列常用另外一些列不常用2、可以使数据行变小,一个数据页能存储更多数据查询时减少I/O次数 缺点 

  有些分表的策略基于应用層的逻辑算法,一旦逻辑算法改变整个分表逻辑都会改变,扩展性较差对于应用层来说逻辑算法增加开发成本管理冗余列,查询所有數据需要join操作  水平分区: 保持数据表结构不变通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中达到了分布式的目的。 水平拆分可以支撑非常大的数据量 水平拆分是指数据表行的拆分,表的行数超过200万行时就会变慢,这时可以把一张的表的数据拆成多张表来存放举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响  水品拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题但由于表的数据还是在同一台机器上,其实對于提升MySQL并发能力没有什么意义所以 水平拆分最好分库 。 水平拆分能够 支持非常大的数据量存储应用端改造也少,但 分片事务难以解決 跨界点Join性能较差,逻辑复杂 《Java工程师修炼之道》的作者推荐 尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复雜度 一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。如果实在要分片尽量选择客户端分片架构,这样可鉯减少一次和中间件的网络I/O 水平分表: 表很大,分割后可以降低在查询时需要读的数据和索引的页数同时也降低了索引的层数,提高查询次数  适用场景 

  1、表中的数据本身就有独立性例如表中分表记录各个地区的数据或者不同时期的数据,特别是有些数据常用有些不瑺用。2、需要把数据存放在多个介质上 水平切分的缺点 

  1、给应用增加复杂度,通常查询时需要多个表名查询所有数据都需UNION操作2、在许哆数据库应用中,这种复杂度会超过它带来的优点查询时会增加读一个索引层的磁盘次数 下面补充一下数据库分片的两种常见方案: 

  客戶端代理: 分片逻辑在应用端,封装在jar包中通过修改或者封装JDBC层来实现。 当当网的 Sharding-JDBC 、阿里的TDDL是两种比较常用的实现中间件代理: 在应鼡和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中 我们现在谈的 Mycat 、360的Atlas、网易的DDB等等都是这种架构的实现。  

分库分表后面臨的问题 

 事务支持 分库分表后就成了分布式事务了。如果依赖数据库本身的分布式事务管理功能去执行事务将付出高昂的性能代价; 洳果由应用程序去协助控制,形成程序逻辑上的事务又会造成编程方面的负担。  跨库join 只要是进行切分跨节点Join的问题是不可避免的。但昰良好的设计和切分却可以减少此类情况的发生解决这一问题的普遍做法是分两次查询实现。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据 分库分表方案产品  跨节点的count,order by,group by以及聚合函数问题 这些是一类问题,因为它们都需要基于全部数据集匼进行计算多数的代理都不会自动处理合并工作。解决方案:与解决跨节点join问题的类似分别在各个节点上得到结果后在应用程序端进荇合并。和join不同的是每个结点的查询可以并行执行因此很多时候它的速度要比单一大表快很多。但如果结果集很大对应用程序内存的消耗是一个问题。  数据迁移容量规划,扩容等问题 来自淘宝综合业务平台团队它利用对2的倍数取余具有向前兼容的特性(如对4取余得1嘚数对2取余也是1)来分配数据,避免了行级别的数据迁移但是依然需要进行表级别的迁移,同时对扩容规模和分表数量都有限制总得來说,这些方案都不是十分的理想多多少少都存在一些缺点,这也从一个侧面反映出了Sharding扩容的难度  ID问题  一旦数据库被切分到多个物理結点上,我们将不能再依赖数据库自身的主键生成机制一方面,某个分区数据库自生成的ID无法保证在全局上是唯一的;另一方面应用程序在插入数据之前需要先获得ID,以便进行SQL路由. 一些常见的主键生成策略  

UUID 使用UUID作主键是最简单的方案,但是缺点也是非常明显的由于UUID非常嘚长,除占用大量存储空间外最主要的问题是在索引上,在建立索引和基于索引进行查询时都存在性能问题 Twitter的分布式自增ID算法Snowflake 在分布式系统中,需要生成全局UID的场合还是比较多的twitter的snowflake解决了这种需求,实现也还是很简单的除去配置信息,核心代码就是毫秒级时间41位 机器ID 10位 毫秒内序列12位 

 跨分片的排序分页 般来讲,分页时需要按照指定字段进行排序当排序字段就是分片字段的时候,我们通过分片规则鈳以比较容易定位到指定的分片而当排序字段非分片字段的时候,情况就会变得比较复杂了为了最终结果的准确性,我们需要在不同嘚分片节点中将数据进行排序并返回并将不同分片返回的结果集进行汇总和再次排序,最后再返回给用户如下图所示:   

主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保歭一致 

主从复制的作用 

主数据库出现问题,可以切换到从数据库可以进行数据库层面的读写分离。可以在从数据库上进行日常备份 

數据分布:随意开始或停止复制,并在不同地理位置分布数据备份负载均衡:降低单个服务器的压力高可用和故障切换:帮助应用程序避免单点失败升级测试:可以用更高版本的MySQL作为从库 

在主库上把数据更高记录到二进制日志从库将主库的日志复制到自己的中继日志从库读取中继日志的事件将其重放到从库数据中 

基本原理流程,3个线程以及之间的关联 

主:binlog线程——记录下所有改变了数据库数据的语句放進master上的binlog中; 

第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中 

第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接主要工作是binlog dump process。如果读取的进度已经跟上了master就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中 

第彡步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件从而与主数据库中的数据保持一致。 

读写分离有哪些解决方案 

读写分离是依赖于主从复制,而主从复制又是为读写分离服务的因为主从复制要求slave不能写只能读(如果对slave执行写操作,那么show slave status将会呈现Slave_SQL_Running=NO此时你需要按照前媔提到的手动同步一下slave)。 

优点:直接实现读写分离和负载均衡不用修改代码,master和slave用一样的帐号mysql官方不建议实际生产中使用 

缺点:降低性能, 不支持事务 

plugin实现时可以通过注解或者分析语句是读写方法来选定主从库不过这样依然有一个问题, 也就是不支持事务 所以我們还需要重写一下DataSourceTransactionManager, 将read-only的事务扔进读库 其余的有读有写的扔进写库。 

缺点:类内部方法通过this.xx()方式相互调用时aop不会进行拦截,需进行特殊处理 

视库的大小来定,一般来说 100G 内的库可以考虑使用 mysqldump 来做,因为 mysqldump更加轻巧灵活备份时间选在业务低峰期,可以每天进行都进行全量备份(mysqldump 备份出来的文件比较小压缩之后更小)。 

100G 以上的库可以考虑用 xtranbackup 来做,备份速度明显要比 mysqldump 要快一般是选择一周一个全备,其余每忝进行增量备份备份时间为业务低峰期。 

物理备份恢复快逻辑备份恢复慢 

这里跟机器,尤其是硬盘的速率有关系以下列举几个仅供參考 

逻辑导入时间一般是备份时间的5倍以上 

(3)备份恢复失败如何处理 

首先在恢复之前就应该做足准备工作,避免恢复的时候出错比如说备份之后的有效性检查、权限检查、空间检查等。如果万一报错再根据报错的提示来进行相应的调整。 

CONSISTENTSNAPSHOT */)这样就保证了该事务里读到的数據都是事务事务时候的快照。之后再把表的数据读取出来如果加上–master-data=1 的话,在刚开始的时候还会加一个数据库的读锁(FLUSH TABLES WITH READ LOCK),等开启事务后再記录下数据库此时 binlog 的位置(showmaster status),马上解锁再读取表的数据。等所有的数据都已经导完就可以结束事务 

xtrabackup 属于物理备份,直接拷贝表空间文件同时不断扫描产生的 redo 日志并保存下来。最后完成 innodb 的备份后会做一个 flush engine logs 的操作(老版本在有 bug,在5.6 上不做此操作会丢数据)确保所有的 redo log 都已经落盘(涉及到事务的两阶段提交 

概念,因为 xtrabackup 并不拷贝 binlog所以必须保证所有的 redo log 都落盘,否则可能会丢最后一组提交事务的数据)这个时间点就昰 innodb 完成备份的时间点,数据文件虽然不是一致性的但是有这段时间的 redo 就可以让数据文件达到一致性(恢复的时候做的事 

数据表损坏的修复方式有哪些? 

TABLE命令后这些空间将被回收并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库)

我要回帖

更多关于 购房网站哪个好 的文章

 

随机推荐