版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单表访问方单表访问方标签: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某纺织厂员工劳动保护细则
- 2025年护士执业资格考试综合试题及答案
- 2026年眼视光技术初级(基础知识)试题及答案
- 2025~2026学年山东青岛市平度第一中学上学期高三语文阶段性综合检测
- 2025~2026学年安徽重点高中下学期开学考高一语文试卷
- 智能家居安全演练脚本
- 冬季取暖防火安全技术交底
- 2025年咨询工程师《现代咨询方法与实务》考试题库(含答案解析)
- 电网工作人员绝缘手套佩戴状况检测方法研究
- 2025湖北恩施州宣恩县园投人力资源服务有限公司招聘宣恩县住房和城乡建设局工作人员拟录取人员笔试历年参考题库附带答案详解
- 项目部防汛责任制度
- 湖北省2025年普通高中学业水平选择性考试政治试题(解析版)
- 起重机械作业风险评估与安全措施
- 万邑通在线测评题库及答案
- (正式版)DB44∕T 2734-2025 《液氢储能系统的液氢储存装置技术要求》
- 2026年低压电工证考试试题及答案
- 2026年江苏信息职业技术学院高职单招职业适应性考试模拟试题及答案详解
- GB/T 46828.1-2025塑料透明材料总透光率的测定第1部分:单光束仪器
- 职业健康培训考试题库含答案2025年
- 城市地铁监控系统设计方案
- 特殊健康状态儿童运动前健康风险筛查指南编制说明-(征求意见)
评论
0/150
提交评论