关闭

Mysql第五天 索引

8125人阅读 评论(1) 收藏 举报
分类:

聚簇与非聚簇

首先Mysql中索引是使用了B+Tree的结构,具体数据结构可以看这里

聚簇索引: 其叶子节点就是对应了物理上的行,并且其保证了叶子结点的顺序与物理位置一致。 这个特性决定了其不适合使用在随机字符串类似的字段上,因为有可能会造成大量的数据移动。 还决定了其能够很好的利用数据库预读以及页读的功能很快的查找范围内的数据。

非聚簇索引: 其叶子节点存储了列值及到行的指针。因此其顺序跟物理顺序无关,插入的效率要高很多,因为仅仅是移动节点的指针不会涉及数据移动。

下面的图比较形象:
这里写图片描述

覆盖索引: 当要提取的数据在叶子节点中就能够获取,而不用去查找数据块时就叫做覆盖索引。因为索引中的数据时顺序的,并且空间比较小,因此会带来比较高的性能。

使用取舍:

行为 聚簇索引 非聚簇索引
列常被group by 可以 可以
列经常被between等范围查询 效率高 效率低
频繁更新的列 效率低 效率高
列常被order by 可以 可以
获取大于20%的数据 不可 不可

此外,在插入非常频繁的场景下,聚簇索引因为插入的热点都是在最尾端,因此有可能会有性能问题,可以通过配置innodb_autoinc_lock_mode 来配置这种情况下的处理方式,表锁还是预读预置一些值给语句使用

索引命中规则:

  • 全值匹配
  • 匹配最左前缀, 即多列索引,从最左列开始匹配
  • 匹配列前缀,即 A*这样的匹配方式
  • 匹配范围值, between and是可以的
  • 精确左,范围右。 where firstName=’123’ and middlename like ‘abc%’
  • 覆盖索引
  • order by 子句会用到索引

哈希索引

哈希索引使用了哈希算法。其具有如下的特性:

  • 只存储hash值和行指针,不存储字段值,因此不能用来读取单一行。
  • 不能用于排序
  • 只支持等值查找
  • 一般不会用到,如果想手工使用可以用mysql自带的CRC32方法来进一步的缩小范围

总结一下:

  • 单行访问很慢,因为随机I/O很慢。 最好读取的快中能够包含尽可能多的需要的数据,使用索引可以创建位置引用以提升效率
  • 按顺序访问数据很快。 顺序I/O不需要寻到,不需要而外的排序操作
  • 索引覆盖很快
0
0
查看评论

练习打字第五天!

练习打字第五天
  • forward627
  • forward627
  • 2016-05-07 21:16
  • 141

六天带你玩转Mysql笔记--第五天

六天带你玩转Mysql笔记--第五天 1. 外键 1.1增加外键 1.2 修改外键&删除外键 1.3 外键作用 1.4 外键条件 1.5 外键约束 2 联合查询 2.1基本语法 2.2 意义 2.3 order by使用 3. 子查询 3.1 子查询分类 3.2 标量子查询 3.3 列子查询...
  • zwh847021940
  • zwh847021940
  • 2017-03-30 18:35
  • 466

MySql_添加索引

9.1 索引简介       索引是一个单独的存在磁盘上的数据结构,他们包含着对数据表列的所有记录的引用的指针,使用索引可以快速的查找出某个或多个列中有特定值的行       索引是在存储引擎上实...
  • wbj1992
  • wbj1992
  • 2017-03-19 15:35
  • 570

Mysql关联表查询的索引

问题     昨天,用户反映我们系统的一个功能效率很低,每次点击需耗时很久。     对代码跟踪分析,发现主要问题出在一个关联表的查询,该操作需要执行该语句20次左右,每次约0.2s左右,累积到数秒。   &#...
  • xueqifz
  • xueqifz
  • 2012-09-14 17:25
  • 683

Mysql 索引问题-日期索引使用

这两天发现原来的查询效率慢了,使用explain 查看,居然没有使用索引, 我的索引是日期类型的,首先想到的是mysql对日期类型的索引的处理机制是不是不同,在where条件里试了几种,发现效果都差不多, where dayid >= ‘20161121’ where dayid...
  • spider_zhcl
  • spider_zhcl
  • 2016-11-24 18:02
  • 7760

MYSQL分区及索引

MYSQL分区介绍: http://lehsyh.iteye.com/blog/732719 个人认为主要使用RANGE分区 MYSQL索引介绍:
  • woshichengchaoa
  • woshichengchaoa
  • 2014-04-06 01:06
  • 1279

冬令营第五天

工作日志(冉涛) 日  期 今日工作结果 问题及改善方法 明日计划 1.29                  1.完成...
  • rt12345678910
  • rt12345678910
  • 2015-01-30 09:20
  • 204

mysql添加删除索引

mysql添加删除索引
  • chenhualeguan
  • chenhualeguan
  • 2015-11-06 09:50
  • 4594

mysql 时间索引失效

项目中查询时间断的数据发现查询时间很长。怀疑没有走时间的索引,于是explain一下 EXPLAIN select * from t_order where created_at>'2015-01-01 00:00:00' and created_at 解析: ...
  • kelindame
  • kelindame
  • 2017-02-23 12:45
  • 3998

Mysql-索引-BTree类型【精简】

网络上看了很多关于B-TREE的总结,b树,B-树,B+树,B*树(艾玛怎么还4个呢?都快蒙圈了呢), 有的真的很精彩令人佩服,但是都是篇幅太长啊,一大长段的文字就让人望而生畏啊。干脆做一个简化版的总结,通俗移动点介绍下,说说他们的区别。 一.B树 Binary Tree,就是一个二叉树...
  • ty_hf
  • ty_hf
  • 2016-12-08 23:37
  • 3684
    个人资料
    • 访问:1133591次
    • 积分:7046
    • 等级:
    • 排名:第3881名
    • 原创:129篇
    • 转载:4篇
    • 译文:1篇
    • 评论:47条
    博客专栏
    文章分类
    最新评论