- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MySQL查询优化之 【⼩表驱动⼤表,⼩数据集驱动⼤数据
集】
Mysql 在进⾏关联表查询时,通常先 ⼀张表A进⾏查询,然后将循环使⽤查询出来的每⼀条记录的关联信息,再来查询另⼀张表B中的记
录,这样查询次数为 1 + COUNT(从表A查询的记录)。所以,为了提⾼查询效率,需要尽量将⼩表作为⾸先查询的表,我们可以关联查询时
⾸次使⽤的表A为主表,将其它表如表B成为嵌套表。(EXPLAIN时,第⼀个出现的⼀定是⼩表即驱动表,后边出现的是⼤表即被驱动表)
⼀⼀、、IN和和 EXISTS查查询询
根据中的相应步骤在 tb_dept_bigdata 表中插⼊100条数据,在 tb_emp_bigdata 表中插⼊5000条数据。
注 :100个部门,5000个员⼯。tb_dept_bigdata (⼩表),tb_emp_bigdata (⼤表)。
①当 B 表的数据集⼩于 A 表数据集时,即A⼤B⼩时,⽤ in 优于 exists。
select * from tb_emp_ bigdata A where A.deptno in (select B.deptno from tb_dept_ bigdata B)
B表为tb_dept_bigdata:100条数据,A表tb_emp_bigdata:5000条数据。
⽤in的查询时间为 :
将上⾯sql转换成exists :
select *from tb_emp_ bigdata A where e ists(select 1 from tb_dept_ bigdata B where B.deptno=A.deptno) ;
⽤exists的查询时间:
经 ⽐可看到,在B表数据集⼩于A表的时候,即A⼤B⼩时,⽤ in 要优于 exists,当前的数据集并不⼤,所以查询时间相差并不多。
②当A表的数据集⼩于B表的数据集时,即A⼩B⼤时,⽤ exists 优于 in。
select *from tb_dept_ bigdata A where A.deptno in(select B.deptno from tb_emp_ bigdata B) ;
⽤in的查询时间为 :
将上⾯sql转换成exists :
select *from tb_dept_ bigdata A where e ists(select 1 from tb_emp_ bigdata B where B.deptno=A.deptno) ;
⽤exists的查询时间:
由于数据量并不是很⼤,因此 ⽐并不是难么的强烈。
附上视频的结论截图:
结论 :
in 后⾯跟的是⼩表,exists 后⾯跟的是⼤表。
简记 :in+⼩表,exists+⼤表。
⼆⼆、、JOIN查查询询
A JOIN B,表A是左表,表B⽰右表 ;左表永远是主表,右表永远是嵌套表。
Mysql在版本5.5之前,使⽤了Nest Loop Join算法,在版本5.5之后,采⽤了优化的Block Nested-Loop Join算法。优化的Block
Nested-Loop Join⽅法,⾸先将外层循环数据 (即驱动表查询出来的数据)的⼀部分缓存在 j oin buffer ( 决定这个缓冲区的⼤⼩)中,
然后读取被驱动表数据,逐条和buffer中的数据进⾏ ⽐,从⽽减少了查表次数 (⼀次Block嵌套查询,仅仅 被驱动表读取⼀次),这样
便可以提⾼效率 (被驱动表越⼤,驱动表越⼩,效果越明显)。⽽驱动表的选取,是系统根据既定规则进⾏选择的,理论上是选择⼩表作为
驱动表。⽽ straight_j oin 是留给⽤户进⾏驱动表选择的利器,即使⽤ straight_j oin 时永远选择主表为驱动表,当 where 条件和 order
by 不在⼩表时,可以尝试使⽤ straight_j oin 选择⼤表驱动⼩表。
Block Nested-Loop Join算法 :
建⽴ t 1, t2 两个完全相同的表,t 1 表中写⼊ 100 条数据,t2 表中 写⼊ 1000 条数据。
Index Nested-Loop Join (NLJ) (被驱动表有索引的情况选择)
- 语句
- 为了避免Mysql 选择驱动表 于分析的影响,改⽤ straight_j oin 让 My
您可能关注的文档
最近下载
- 传承与创新——中国近现代美术 课件-2024-2025学年高中美术人教版 (2019) 必修美术鉴赏.pptx VIP
- 【国联证券-2024研报】固态电池系列报告一:硫化物固态电池产业化提速.pdf VIP
- 医学知识一内分泌总论第八版.pptx
- WebOP Designer 程序下载方式.pptx
- 统编版高中语文选择性必修教材单元研习任务研究.pdf
- 内科学泌尿系统肾小球疾病概述课件.pptx VIP
- 守住光明照亮未来(预防近视主题班会)课件.pptx VIP
- 湘教版八年级地理上册练习题(全册,含答案).pdf VIP
- 辽宁机电职业技术学院职测考试题库(考前急训).docx
- 医院内科肾内科医生面试题及参考答案结构化面试题.docx VIP
文档评论(0)