SQL的索引学习部分总结

5 篇文章 0 订阅
3 篇文章 0 订阅

索引
索引是数据结构,可以帮助mysql高效获取数据。是排好序的快速查找数据结构。
索引一般是以BTREE实现的,每个节点保存着索引键值,指向表中的物理数据。而且索引本身也很大,一般不会放在内存中。

*- 优点:1.提高了数据检索的效率,降低数据库的IO成本;2.通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

  • 缺点:1.索引实际上也是一张表,保存了主键和索引字段,并指向实体表的记录,所以索引列占用空间较大;2.降低了更新表的速度,因为每个修改表都会更新索引表;3.优化耗时*

索引的分类

  • 单值索引:一个索引只包含单个列,一个表可以有多个单值索引
  • 唯一索引:索引列的值必须唯一,但允许控制
  • 复合索引:一个索引包含多个列

创建索引:
单值:
在这里插入图片描述
唯一:
在这里插入图片描述
复合:
在这里插入图片描述
删除索引:
在这里插入图片描述
查看索引:
在这里插入图片描述

建立索引的抉择:

需要建立索引的情况:

  • 主键自动建立的唯一索引
  • 频繁作为查询条件的字段应该创建
  • 查询中与其他表关联的字段,外键关系建立索引
  • 分组用到的字段

不需要建立索引的情况:

  • 频繁更新的字段
  • where条件中用不到的字段
  • 表记录太少
  • 数据重复分布均匀的字段

性能分析

mysql Query Optimizer:
mysql中专门负责优化select语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求query提供他认为最优的执行计划。

常见瓶颈:
CPU、io、硬件

explain
在这里插入图片描述
在这里插入图片描述
字段解释:

  • id:select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。有三种情况:1.id相同,执行顺序从上到下;2.id不同,id值越大,优先级越高,越先被查询;3.相同又不同,仍然是越大优先级越高,相同的按顺序

  • select_type:给出mysql认为的查询类型,有6种

    • SIMPLE:简单select查询,查询中不包含子查询或者UNION
    • PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为此
    • SUBQUERY:在select或者where列表中包含了子查询
    • DERIVED:在from列表中包含的子查询被标记为此,mysql会递归执行 这些子查询,把结果放在临时表中
    • UNION:若第二个select出现在UNION之后,则被标记为UNION;若UNION包含子from子句的子查询中,外层select将被标记为:DERIVED
    • UNION RESULT:从UNION结果中使用select
  • table:显示这一行数据是属于哪张表的

  • type:显示查询使用了何种类型,评价语句好坏。最好到最坏:system>const>eq_ref>ref>range>index>ALL
    - system:表中只有一行记录,等于系统表
    - const:表示索引一次就找到
    - eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配
    - ref:非唯一索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问
    - range:只检索给定范围的行,使用一个索引来选择行
    - index:只遍历索引树
    - ALL:全表扫描

  • possible_keys:显示可能用在这张表中的索引,一个或多个。

  • key:实际用到的索引。如果为NULL,则没有使用索引

  • key_len:表示索引中使用的字节数,显示索引字段的最大可能长度,并非实际使用长度。

  • ref:显示索引的哪一列被使用

  • rows:根据表统计信息及索引选用情况,大致估算出找到所需记录所需要读取的行数

  • Extra:额外信息。
    - Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。mysql中无法利用索引完成的排序操作称为“文件排序”
    - Using temporary:使用临时表保存中间结果,mysql在对查询结果排序时使用临时表
    - USING index:表示相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率不错

注意:拿左连接来说,索引应该加在右表上,因为由左连接的特性决定,结果集左边的表内容都是全有的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值