版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单表访问方单表访问方标签:MySQL对于我们这些MySQL的使⽤者来说,MySQL其实就是⼀个软件,平为id列建⽴的聚簇索引为key1列建⽴的idx_key1⼆级索引为key3列建⽴的idx_key3⼆级索引为key_part1、key_part2、key_part3列建⽴idx_key_part⼆级索引,这也是⼀个联合索引CREATETABLEsingle_tableidINTNOTNULLAUTO_INCREMENT,key1VARCHAR(100),key2key3key_part1VARCHAR(100),key_part2VARCHAR(100),key_part3VARCHAR(100),PRIMARYKEY(id),KEYidx_key1UNIQUEKEYidx_key2(key2),KEYidx_key3(key3),KEYidx_key_part(key_part1,key_part2,)Engine=InnoDB然后我们需要为这个表插⼊10000⾏记录,除id然后我们需要为这个表插⼊10000⾏记录,除id访问方法method)如果我们搜⻄安钟楼到⼤雁塔之间的路线的话,地图软件会给出n于单个表的查询来说,设计MySQL的⼤叔把查询的执⾏⽅式⼤致分SELECT*FROMsingle_tableWHEREid=SELECT*FROMsingle_tableWHEREkey2=SELECT*FROMsingle_tableWHEREkey1=SELECT*FROMsingle_tableWHEREkey2IS⼆级索引列值为NULL的情包含NULL值的数量并不限制,所以我们采⽤keyISNULL这是const的访问⽅法SELECT*FROMsingle_demoWHEREkey1='abc'ORkey1ISNULL;SELECT*FROMsingle_tableWHEREkey_part1='godlike'ANDkey_part2>'legendary';SELECT*FROMsingle_tableWHEREkey_part1='godlike';SELECT*FROMsingle_tableWHEREkey_part1='godlike'ANDkey_part2='legendary';SELECT*FROMsingle_tableWHEREkey_part1='godlike'ANDkey_part2='legendary'ANDkey_part3='pentakill';找出找出key1ISNULL和key1='abc'的两个连续的记录范围,然SELECT*FROMsingle_tableWHEREkey2IN(1438,6328)OR(key2>=38ANDkey2<=79);⽤⼆级索引+回表的⽅式执⾏,如果采⽤⼆级索引+回表的⽅式⽤⼆级索引+回表的⽅式执⾏,如果采⽤⼆级索引+回表的⽅式key2的值是key2的值是key2的值在38和79之间范围1:key2=范围2:key2=此处所说的使⽤索引进⾏范围匹配中的`索引`可以是聚簇索引,范围3:key2∈[3879]范围3:key2∈[3879]它的查询列表只有3个列:key_part1,key_part2,idx_key_partkey_part2='abc'key_part1,key_part2,key_part3列的值直计MySQL为:indexSELECTkey_part1,key_part2,key_part3FROMsingle_tableWHEREkey_part2='abc';注注意事重温二级索引回key1=key2>SELECT*FROMsingle_tableWHEREkey1='abc'ANDkey2>1000;记录,再根据条件key2>1000到完整的⽤户记录继续过会⽤到与key1列有关的搜索条件,其余条件,⽐如key21000这IN、ISNULL、ISNOTcond1ANDcond2:只有当cond1和cond2都为TRUE时整cond1ORcond2:只要cond1或者cond2中有⼀个为整个表达式就为TRUESELECT*FROMsingle_tableWHEREkey2IN(1438,SELECT*FROMsingle_tableWHEREkey2=1438ORkey2=6328;key2100和key2200交集当然就是key2200了,也就是说上边这个查询使⽤idx_key2的范围区间就是(200,+∞)。这东OR意味着需要取各个范围区间的并集,所以上边这个查询在我们SELECT*FROMsingle_tableWHEREkey2>100ORkey2>200;SELECT*FROMsingle_tableWHEREkey2>100ANDkey2>200;也就是说上边这个查也就是说上边这个查询使⽤idx_key2的范围区间就是+∞)请注意,这个查询语句中能利⽤的索引只有idx_key2⼀个到common_field'abc'这个条件,这个条件是在回表获取了完的概念,所以在确定范围区间的时候不需要考虑common_field=之所以把⽤不到索引的搜索条件替换为TRUE,是因为我们不打算SELECT*FROMsingle_tableWHEREkey2>100ANDcommon_field='abc';我们把上边的查询中⽤不到idx_key2的搜索条我们把上边的查询中⽤不到idx_key2的搜索条件替换后就是这样也就是说最上边那个查询使⽤idx_key2的范围区间就是+∞)再来看⼀下使⽤OR的情况同理,我们把使⽤不到idx_key2索引的搜索条件替换为的范围区间就是(-∞,+∞),也就是需要将全部⼆级索引的记录进⾏SELECT*FROMsingle_tableWHERESELECT*FROMsingle_tableWHEREkey2>100ORSELECT*FROMsingle_tableWHEREkey2>100ORcommon_field='abc';SELECT*FROMsingle_tableWHEREkey2>SELECT*FROMsingle_tableWHEREkey2>100AND假设我们使⽤idx_key1执⾏查外,key1LIKE'%suf'也使⽤不到索引,所以(key1>'xyz'ANDTRUE)(key1<'abc'ANDkey1>'lmn')OR(TRUEANDkey1>'zzz'AND(TRUEORSELECT*FROMsingle_table(key1>'xyz'ANDkey2=748)OR(key1<'abc'ANDkey1>'lmn')OR(key1LIKE'%suf'ANDkey1>'zzz'AND(key2<8000ORcommon_field='abc'))替换掉永远为TRUE或FALSE的条替换掉永远为TRUE或FALSE的条因为符合key1'abcANDkey1'lmn'永key1>'xyz'和key1>'zzz'之间使⽤OR操果化简的到的区间就是:key1>xyz。也就是idx_key1索引执⾏查询的话,需要把满⾜key1假设我们使⽤idx_key2执⾏查(key1>'xyz')OR(key1>(key1>'xyz')(key1<'abc'ANDkey1>'lmn')OR(key1>'zzz')哎呀呀,key2<8000ORTRUE的结果肯定哎呀呀,key2<8000ORTRUE的结果肯定我们前边说过MySQL在⼀般情况下执⾏⼀个查询时最多只会⽤到单引来完成⼀次查询的执⾏⽅法称之为:indexmerge,具体的索引Intersection合Intersection翻译过来的意思是交集。这⾥是说某个查询可以key2=748OR(TRUEANDkey2=748)OR(TRUEANDTRUE)OR(TRUEANDTRUEAND(key2<8000'a''b'主键构成的,所以我们可以SELECT*FROMsingle_tableWHEREkey1='a'ANDkey3='b';⽽下边这两个查询就不能进⾏Intersection索引合并SELECT*FROMsingle_tableWHEREkey1>'a'ANDkey_part1='a'ANDkey_part2='b'ANDkey_part3='c';SELECT*FROMsingle_tableWHEREkey1='a'ANDkey_part1='a';SELECT*FROMsingle_tableWHEREkey1='a'ANDkey_part1='a'ANDkey_part2='b'ANDkey_part3='c';⽐⽅说下边这个查⽐⽅说下边这个查询可能⽤到主键和idx_key_part⾏Intersection索引合并的操作主键构成的,⼆级索引列的值相同的记录可能会有好多条,这些s对使⽤IntersectionIntersectiones⽤Intersection索引合并的⽅式从idx_key1和idx_key2这两SELECT*FROMsingle_tableWHEREid>100ANDkey1='a';先取出这两个结果集中较⼩的主键值做⽐较,因为12,所先取出这两个结果集中较⼩的主键值做⽐较,因为12,所因为32,所以把idx_key2的结果集的主键值2丢弃,取出因为33,所以把3加⼊到最后的交集结果中,继续两个结另外,不仅是多个⼆级索引之间可以采⽤Intersection索引SELECT*FROMsingle_tableWHEREkey1='a'ANDid>100;以为这个查询会分别按照id100这个条件从聚簇索引中获取⼀些记录,在通过key1以为这个查询会分别按照id100这个条件从聚簇索引中获取⼀些记录,在通过key1'a'这个条件从idx_key1⼆级索引中获取⼀以可以在从idx_key1中获取到的主键值上直接运⽤条件id>100通过Intersection索引合并后需要回表的记录数⼤⼤减Union合SELECT*FROMsingle_tableWHEREkey1='a'ORkey3='b'⽽下边这两个查询就不能进⾏Union索引合并情况三:使⽤Intersection索引合并的搜索条SELECT*FROMsingle_tableWHEREkey1>'a'OR(key_part1='a'ANDkey_part2='b'ANDkey_part3='c');SELECT*FROMsingle_tableWHEREkey1='a'ORkey_part1='a';SELECT*FROMsingle_tableWHEREkey1='a'OR(key_part1='a'ANDkey_part2='b'ANDkey_part3=先按照搜索条件key1='a'ANDkey3='b'从索再按照搜索条件key_part1先按照搜索条件key1='a'ANDkey3='b'从索再按照搜索条件key_part1'aAND'bANDkey_part3'c'从联合索通过Intersection索引合并后需要回表的记录数⼤⼤减Sort-UnionSELECT*FROMsingle_tableWHEREkey1<'a'ORkey3>'z'SELECT*FROMsingle_tableWHEREkey_part1='a'ANDkey_part2='b'ANDkey_part3='c'OR(key1='a'ANDkey3='b');这是因为根据key1'a'从这是因为根据key1'a'从idx_key1索引中获取的⼆级索引记录的主键值不是排好序的,根据key3'z'从idx_key3索引中获取的⼆级索引记录的主键值也不是排好序的,但是key1<'a'和key3>'z'这两个条件⼜特别让我们动⼼,所以我们可以这样:先根据key1'a'条件从idx_ke
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024电竞游戏内容创作及版权许可合同
- 新材料行业的研发与应用推广策略
- 医疗行业患者知情权免责协议
- 融入唯物辩证法的“土木工程测量”课程思政教学探索
- 2024年软件开发合同协议
- 二零二五年学校建设石方平整合同2篇
- 2025年度XX电子商务与XX人力资源公司客服团队派遣及运营支持协议2篇
- 农业科技合作开发合同书
- 袋装机课程设计
- 演艺娱乐行业票务预订系统开发方案
- 人工智能在医疗健康领域的应用探索报告
- 高二上学期数学期末测试卷01-【好题汇编】备战2023-2024学年高二数学上学期期末真题分类汇编(人教A版2019选择性必修第一、二册)(原卷版)
- 环评验收方案
- 小学一年级数学口算题每天20道题
- 设备安全调试维修作业安全培训
- 选煤厂安全规程
- 小升初时态专题复习-一般过去时态(讲义)人教PEP版英语六年级下册
- 市政工程安全教育课件
- 航空物流教育培训课件模板
- 浙江省台州市2023-2024学年八年级上学期期末科学试题
- 部门王者荣耀比赛策划方案
评论
0/150
提交评论