MySql(二)索引与执行计划

什么是索引:

在关系型数据库种,索引是一种单独的、物理的对数据库表种一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值得集合和相应的指向表中物理标识,这些值的数据页的逻辑指针清单。

(什么意思:索引的作用相当于图书的目录,可以根据目录中页码快速找到所需要的内容)

索引的分类:

1、普通索引:即一个索引只包含单个列,一个表可以有多个单列索引;

2、唯一索引:索引列的值必须唯一,但允许有空值,并且多个空值;

3、主键索引:与唯一索引之间的区别就在于不允许有空值,创建主键时会自动创建此索引;

4、复合索引:即一个索引包含多个列;

5、聚集索引(聚簇索引):并不是一种单独的索引类型,而是一种数据存储方式;具体细节取决于不同的实现,InnoDB的聚集索引其实就是在同一个结构中保存了B-Tree索引(从技术角度讲是B+Tree)和数据行;

追记:③叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
————————————————

版权声明:本文为CSDN博主「java_gp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31129841/article/details/105918823

6、非聚集索引:不是聚集索引,就是非聚集索引。

相关命令语法:

①查看索引:SHOW INDEX FROM 表名

②删除索引

DROP INDEX [索引名] ON 表名;

③查看索引快捷键:

Oracle:用F5

MySql:右键设计表

注意索引的命名规则:

执行计划:

1、什么是执行计划:MySql使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,进一步就知道如何处理Sql的,分析出查询语句或表结构性能瓶颈

2、执行计划的作用:

①表的读取顺序

②数据读取操作的操作类型

③哪些索引可以使用,哪些索引被实际使用

④表之间的引用

⑤每张表有多少行被优化器查询

3、执行计划语法

在SQL查询的前面加 EXPLAIN 

 4、分析执行计划每个列

① id列

描述select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。

(1)根据id的数值结果可以分成三种情况

⚪ id相同:执行顺序由上至下

⚪ id不同:如果是子查询,id的序号会递增,id 值越大优先级越高,越先被执行

⚪ id相同不同:同时存在

② select_type

select_type表示查询的类型,用于区别:普通查询、联合查询、子查询等的复杂查询。

----哈嘿呦盗的图----

⚪simple

例:EXPLAIN select * from   t where t.item = 's'

⚪primary 与 subquery

primary:查询中弱包含任何复杂的子部门,最外层查询会被标记;

subquery:在select或where列表中包含了子查询

⚪derived

在from列表中包含的子查询被标记为 derived (衍生),在MySql中会递归执行这些子查询,把结果放在临时表里。

      ⚪union result 与 union

union:若第二个select出现在union之后,则被标记为union;

union result:从union表获取结果的select

③ table列

显示这一行的数据是关于哪张表的

 ④ type 列

type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL 

需要记忆的
system > const > eq_ref > ref >  range >  index > ALL

一般来说得保证查询至少达到range级别最好能达到ref

⚪system与const

system:表只有一行记录(等同于系统表),这是const类型的特例,平时不会出现,这个可以忽略不计;

const:表示通过索引一次就能找到,const用于比较 primary key 或者 unique 索引。ta只匹配一行数据,所有很快。

如果将主键至于where列表中,MySQL就能将该查询转换为一个常量。

⚪eq_ref 

唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。

⚪ref

非唯一性索引扫描,返回匹配某个单独值得所有行;本质上也是一种索引访问,ta返回所有匹配某个单独值得行,然而,ta可能找到多个符合条件的行,所以ta应该属于查找和扫描的混合体。

⚪ range

只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引.
       一般就是在你的where语句中出现了between、<、>、in等的查询
       这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。

⚪index

 当查询的结果全为索引列的时候,虽然也是全部扫描,但是只查询的索引库,而没有去查询数据。

⚪all

Full Table Scan 将遍历全表以找到匹配的行。

⑤ possible_keys 与 key

possible_keys:可能使用的key;

key:实际使用的索引,如果为null ,则没有使用索引;

注意:查询中若使用了覆盖索引,则该索引和查询的select字段重叠

⑤ key_len

Key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好;

key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

  1. key_len表示索引使用的字节数,
  2. 根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用到。
  3. char和varchar跟字符编码也有密切的联系,
  4. latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)

 ----------------------------

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值