哈希表只支持精准查询,可是范围查询无能为力,相对来讲,SQL语句有可能会出现大量的范围查询,这种状况下,哈希索引就会失效,变成全表扫描。
MySQL建立索引
问题:
1)多列索引在底层会生成几颗索引树? - 1颗(全部列都在一颗B+Tree上)
2)多列索引列的顺序有没有关系?- 列的顺序很重要,不一样的顺序会致使索引的做用不一样
注意:惟一索引会保证当前字段数据不会重复,可是又可能为null,并且有可能有多个null
模拟一个底层索引结构的建立过程(重要):
复合索引的底层B+Tree结构,会按照最左边的字段进行排序,当第一个字段相同的时候,再根据第二个字段排序,以此类推...
select * from student where name = "xxx" : 可以用上上述的索引(由于索引树是根据name排列)
select * from student where age = xxx:不能用上上述的索引(由于索引树不能根据age排列)
select * from student where name = "xxx" and age = xxx:完美用上上述的索引
select * from student where name like "%明%":不能用上上述索引的
select * from student where name like "8%":能用上索引的
select * from student where name > "2百五" and age = 8:name能用上索引,age不能用上索引
select * from student where name = "2百五" and age > 8: name和age都完美的用上了索引
聚簇索引:
什么是聚簇索引?
InnoDB类型的表,主键索引就是聚簇索引。MyISAM类型的表,主键是非聚簇索引。
二级索引的查询方式:
注意:根据InnoDB聚簇索引的特色,在InnoDB类型的表中,MySQL推荐咱们必定要提供一个和业务无关而且自动增加的字段做为表的主键。
若是InnoDB中的表没有主键怎么办?
若是一张表没有主键,则MySQL会选择一列惟一性索引的列做为聚簇索引。若是表中没有一列上面有惟一性索引,则MySQL会自动的建立一个隐性的列,做为聚簇索引。
覆盖索引:
什么是覆盖索引?
就是查询的字段,在索引中就有保存,这种方式,就避免了查询完索引后,返回表中获取数据,性能会获得必定的提高。
6、
执行计划
什么是执行计划?
一个Sql语句在通过优化器以后,会生成一个执行计划,这个执行计划就决定了MySQL最终如何执行这条SQL语句。因此分析一条SQL语句的执行计划,一般是优化这个SQL语句的第一步。
如何查询一个SQL的执行计划?
explain (查询)sql语句
字段的含义:
id:标识当前执行的sql语句的顺序
· id值相同的状况:若是id值相同,说明执行计划的顺序是从上到下
· id值不一样的状况:若是id值不一样,id值比较大的执行计划优先级更高
· id值相同不一样同时存在:先看id大的,id相同的从上到下
· id为null:若是id为null则表示这部分最后执行
注意:MySQL中的关联原则,小表驱动大表
select_type:查询类型
· simple:说明当前的查询是一个简单查询
· primary:若是一个sql语句中间包含了子查询,则外层查询就会变成primary,primary标记的部分也能够理解成为最后执行的部分
· subquery:select或者where后面出现的子查询会被标记为subquery
· derived(衍生):标记出如今from后面的子查询
· union:union关键字后面的sql语句会被标记为该类型
mysql对查询的分类:
· 简单查询:没有子查询和union的查询语句
· 复杂查询:包含了子查询和union的查询语句
type(重要):表示当前SQL是根据什么方式访问数据行的
·
all:说明当前查询数据的方式采用的是
全表扫描
·
index:说明当前查询是一个
全索引扫描,效果和全表扫描差很少,只是说根据索引树的结构进行了所有的扫描,性能比all稍微好一些(不是绝对的)
·
range:说明当前的查询是一个
索引的范围查询,说明当前没有走完整个索引,只走了索引的一部分
·
ref:说明当前的查询时一个精准的非惟一性的查询,查询了索引的一小部分,一般出如今对非惟一性的索引的查询上
·
eq_ref:说明当前的查询是一个精准的惟一性查询,一般出如今惟一性索引、主键索引以及链接查询上
·
const:说明当前的查询将条件转换成一个常量执行,一般出如今惟一性索引和主键索引的精准查询上
·
system:是const的一种特殊状况,表示进准查询了惟一性索引或者主键索引而且mysql保证数据集只有一条记录
·
null:这种状况说明当前的sql语句都不用进行查询,在解析的时候就可以得到结果
rows(重要):表示MySQL预估的当前SQL须要读取到的数据行数,这个值越小越好
possible_keys:表示可能运用在这个查询上的索引
keys(重要):表示当前真正用上的索引
注意:有可能发生这种状况,possible_keys里面有索引,可是keys为null;possible_keys为null,可是keys不为null;
Extra(重要):表示一些额外的信息,展现的地方
· Using Index:说明发生了覆盖索引
· Using temporary:说明查询语句用上了临时表,尽可能避免(并非看到了就必定要避免)
· Using filesort:说明当前发生了文件外排序(有可能在内存中排序,有可能用上了磁盘排序)