mysql的索引使⽤优先顺序
mysql数据库面试知识点
mysql的索引可以⼤⼤的增加查询的效率,但是有些时候命名我们索引的字段和where条件后⾯的字段是⼀致的,但是使⽤explain查看之后发现并没有使⽤字段对应的索引.
这个时候⾸先想到的字段都对应了,还不对,那应该是顺序有问题了.咨询了⼤佬之后,更加确定了.
javaswing知识点mysql在索引使⽤的时候⼀般都会把数据最⼩的字段放前⾯,也就是最能确定结果的字段,因为索引的第⼀个字段的检索范围是最⼩的,然后根据可以确定的数据范围的⼤⼩依次排序.这个时候不要担⼼sql⾥使⽤字段的顺序是不是和索引⾥⼀样,mysql在查询的时候会⾃动调整顺序优化成和索引⼀样的顺序.
上⾯是我个⼈的粗略理解,下⾯配上demo
实例:现在我们想查出满⾜以下条件的⽤户id:
mysql>SELECT `uid` FROM people WHERE lname`=‘Liu’ AND `fname`=‘Zhiqun’ AND `age`=26
因为我们不想扫描整表,故考虑⽤索引。
单列索引:
ALTER TABLE people ADD INDEX lname (lname);
将lname列建索引,这样就把范围限制在lname='Liu’的结果集1上,之后扫描结果集1,产⽣满⾜fname='Zhiqun’的结果集2,再扫描结果集2,到 age=26的结果集3,即最终结果。
由 于建⽴了lname列的索引,与执⾏表的完全扫描相⽐,效率提⾼了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除lname列上的索引,再创建fname或者age 列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。
2.多列索引:
mysql语句顺序
ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);
为了提⾼搜索效率,我们需要考虑运⽤多列索引,由于索引⽂件以B-Tree格式保存,所以我们不⽤扫描任何记录,即可得到最终结果。
注:在mysql5.0之前中执⾏查询时(⼀个select⾥),只能使⽤⼀个索引,如果我们在lname,fname,age上分别建索引,执⾏查询时,只能使⽤⼀个索引,mysql会选择⼀个最严格(获得结果集记录数最少)的索引。
不过在mysql5.0之后就可以在⼀个select中同时使⽤多个索引了,引出⼀个名词:索引合并
什么是索引合并
下⾯我们看下mysql⽂档中对索引合并的说明:
The Index Merge method is used to retrieve rows with several range scans and to merge their results into one. The merge can produce unions, intersections, or unions-of-intersections of its underlying scans. This access method merges index scans from a single table; it does not merge scans across multiple tables.
mediumint的取值范围比integer根据官⽅⽂档中的说明,我们可以了解到:
1. 索引合并是把⼏个索引的范围扫描合并成⼀个索引。
聚宝盆免费全集在线观看2. 索引合并的时候,会对索引进⾏并集,交集或者先交集再并集操作,以便合并成⼀个索引。
ruby语言能做什么3. 这些需要合并的索引只能是⼀个表的。不能对多表进⾏索引合并。
怎么确定使⽤了索引合并
在使⽤explain对sql语句进⾏操作时,如果使⽤了索引合并,那么在输出内容的type列会显⽰ index_merge,key列会显⽰出所有使⽤的索引。
3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。
注:在创建多列索引时,要根据业务需求,where⼦句中使⽤最频繁的⼀列放在最左边。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。