第五章:创建高性能索引(上)

索引是存储引擎用于快速找到记录的一种数据结构,这也是索引的基本功能.在MySQL中也叫"键key".良好的性能少不了索引.换句话说,索引优化能够将查询性能轻松提高几个数量级.

1. 索引基础

select first_name from actor where actor_id = 5;

运行上面的查询:如果在actor_id列上有索引,MySQL将使用该索引去查找actor_id为5的列,也就是说:MySQL先在索引上按值查找,然后返回包含该值的数据行.

  • 索引可以包含一个或多个列,列的顺序很重要,MySQL只能高效的使用索引的最左前缀列

1.1 索引的类型

MySQL的索引由存储层实现,不同的存储引擎实现方式不同

MySQL支持的索引:

  • B-Tree索引

    • B-Tree索引使用B-Tree数据结构来存储数据
    • InnoDB使用的B+Tree实现的索引
    • 存储引擎通过从索引的根节点开始搜索而不再是全表扫描以此提高了数据访问的速度
    • B-Tree对索引列是顺序组织存储的,所以适合查找范围数据
    • 可以使用B-Tree索引的查询类型:
      • 全值匹配:和索引中所有的列进行匹配
      • 匹配最左前缀:匹配索引的第一列
      • 匹配列前缀:匹配某一列值的开头部分
      • 匹配范围值
      • 精确匹配某一列并且范围匹配某一列:第一列全匹配,第二列范围匹配
      • 只访问索引列
    • B-Tree可以用于order by操作
    • InnoDB有个自适应哈希索引,可以在B-Tree的基础上建立一个哈希索引
    • B-Tree的限制:
      • 只能适用于从索引的最左列开始的查找
      • 不能跳过索引的列,比如索引是三列,只使用第一三列是无法查找的
      • 如果查询中有某个列的范围查询,则其右边所有的列都无法使用索引优化查找
  • 哈希索引:基于哈希表实现,只有精确匹配所有索引列的查询才有效.
    • 在某些比较适合的场景下哈希索引性能提升较为明显
    • 哈希索引将所有哈希码存储在索引中,同时哈希表中保存指向数据行的指针.
    • 如果多个列的哈希值相同,索引会以链表的方式保存多个记录到同一个哈希条目中去
    • 只需保存对应的哈希值,节省空间,查找快
    • 哈希限制
      • 不能使用索引的值来避免读取行(对性能影响较小)
      • 不按照值的顺序索引,无法使用排序
      • 不支持部分索引列匹配
      • 只支持等值比较,无法范围查找
      • 哈希冲突过多造成索引维护成本增加
    • 自定义哈希索引:在B-Tree基础上建立伪哈希,查找时使用键的哈希值索引查找,仅需在where子句后使用自定义哈希函数
  • 空间数据索引
  • 全文索引
  • 其他

2. 索引的优点

  • 减少了服务器需要扫描的数据量
  • 避免排序和临时表
  • 将随机I/O变为顺序I/O

只有索引帮助存储引擎快速查找到记录的好处大于维护索引付出的成本时,索引才是有价值的

3. 高性能索引策略

3.1 独立的列

"独立的列":索引的列不能时表达式的一部分,也不能是函数的参数.

3.2 前缀索引和索引选择性

  • 索引太长时可以只索引开始的部分字符,这样可以节省空间,提高效率. 但会降低索引的选择性.
  • 索引选择性:不重复的索引值和数据表的总记录数T的比值:从1/T到1之间
    • 索引选择性越高,查询效率越高,选择性越高MySQL九年过滤掉更多的行.
    • 一般来说某个列的前缀选择性也是足够高的

3.3 多列索引

在多个列上建立独立的单列索引大部分情况下不能提升MySQL的查询性能.

索引合并策略有时候是一种优化的结果,当更多时候说明了表上的索引建的和糟糕:

  • 当服务器出现多个索引做相交操作时(多个and条件), 这意味着需要一个包含所有相关列的多列索引
  • 当服务器出现多个索引做联合操作时(多个or条件),通常需要耗费大量的CPU和内存在算法的缓存还需合并上.

如果在explain中看到有索引合并,应该检查一下查询和表结构,确定的hi否已经是最优的,或者在某些时候可以关闭或者忽略索引.

3.4 选择合适的索引列顺序

  • 正确的顺序依赖于使用该索引的查询,并同时需要考虑如何满足排序和分组的需要,索引列的顺序总是从左到右一次查找.
  • 在不考虑排序和分组时将选择性最高的放在最前列通常时比较好的做法,不过仅局限在where查询.
  • 但性能不只是依赖于索引列的选择性,也和查询条件的具体值有关,也就是值的分布.

原文地址:https://www.cnblogs.com/mydailycoding/p/12393104.html

时间: 2024-10-13 15:23:10

第五章:创建高性能索引(上)的相关文章

高性能MySql阅读笔记第五章--创建高性能的索引1

创建高性能的索引1 索引是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能. 索引对于良好的性能非常重要. 索引优化应该是对查询性能优化最有效的手段了,索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能好两个数量级,创建一个真正“最优”的索引经常需要重写查询. 一.索引的类型 1.B树索引 当人们谈论索引的时候,如果没有特别指明类型,那么多半说的是B树索引,他使用B树数据结构存储数据. 可以使用B树索引的查询类型:全值匹配.匹配最左前缀.匹配列前缀.匹配范围

高性能MySQL-第五章创建高性能的索引(2)

高性能的索引策略 一.独立的列 如果查询中的列不是独立的,则MySQL就不会使用索引.“独立的列”是指索引列不能是表达式的一部分,也不能是函数的函数. 二.前缀索引和索引选择性 索引部分字符会降低索引的选择性,索引的选择性是指,不重复的索引值(也称为基数,cardinality)和数据表的记录总数(#T)的比值,范围从1/#T到1之间.索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行.唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的. 一般情况下

高性能MySQL-第五章创建高性能的索引(1)

在MySQL中,存储引擎使用索引,其先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行. 索引可以包含一个或多个列的值. 一.索引的类型 在MySQL中,索引是在存储引擎层而不是服务器层实现的. MySQL支持的索引类型 B-Tree索引 InnoDB使用的是B+Tree. B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同.B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索.根节

[MySQL-笔记]创建高性能索引

索引,MySQL中也叫"键",是存储引擎中用于快速找到记录的一种数据结构,具体的工作方式就像书本中的索引一样,但是具体的实现方式会有差别. 一.索引分类 B-Tree索引: 优点: MyISAM中,索引根据数据的物理位置引用被索引的行,InnoDB中根据主键引用被索引的行. B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点开始进行搜索. B-Tree对索引列是顺序组织存储的,所以很适合查找范围数据. 一般来说,B-Tree可以

第十五章 文本样式(上)

第 15章 CSS文本样式[上]学习要点:1.字体总汇2.字体设置3.Web字体 本章主要探讨 HTML5中 CSS文本样式,通过文本样式的设置,更改字体的大小.样式以及文本的方位.一.字体总汇本节课,我们重点了解一下 CSS文本样式中字体的一些设置方法,样式表如下:属性名 说明font-size 设置字体的大小font-variant 设置英文字体是否转换为小型大写font-style 设置字体是否倾斜font-weight 设置字体是否加粗font-family 设置 font字体font

Node入门教程(6)第五章:node 模块化(上)模块化演进

node 模块化 JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理.所以并没有模块化的规范设计. 项目小的时候,我们可以通过命名空间.局部作用域.自执行函数等手段实现变量不冲突.但是到了大一点的项目,各种组件,各种第三方插件和各种 js 脚步融合的时候,就会发现这些技巧远远不够. 模块化的演变 为什么要有 JS 模块化呢?在浏览器中,顶层作用域的变量是全局的,所以项目稍微复杂点,如果引用的 js 非常多的时候,很容易造成命名冲突,然后造成很大意想不到的结果. 为了避免

Mysql优化之创建高性能索引(一)

1.索引基础 索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.但是不恰当的索引随着数据量的增加,也会使整个数据库的性能下降. 举个例子: select a from b where id = 5; 如果在id上建立索引,则Mysql会使用该索引找到id为5的行,也就是说,Mysql现在索引按值进行查找,然后返回所有包含该值的数据行.索引也可以包含一列或者多列,列的顺序也十分重要,因为Mysql只能高效地使用索引的最左前缀列. 索引优化应该是查询性能优化最有效

Java 编程思想 第五章 初始化与清理 上

休整几天,闲了蛋疼也没写文章,这开学了坚持每天写// 必须的天天写.不敢再松懈了.羡慕一好朋友能坚持的静下心来学习. 5.1 用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.  创建对象时,如果其类具有构造器,Java就会在用户有能力操作兑现之前自动调用相应的构造器,从而保证了初始化的进行.  当然了 接下来的我们需要的问题是: 1.所取的任何名字都可能与类的某个成员名称相冲突: 2.调用股早期是编译器的责任,所以必须让编译器知道应该调用哪个方法: 采取

MySQL 创建高性能索引-->空间索引(R—Tree)

全文索引 全文索引是一种特殊类类型索引,它查找的是文本中的关键词,而不是直接比较索引中的值. 全文索引 更类似于搜索引擎做的事情,而不是简单的WHERE条件匹配. 全文搜索和其他几类索引 的匹配方式完全不一样.它有许多需要注意的细节,如停用词,词干,复数.布尔搜索等. 全文索引 适用于MATCH AGAINST操作,而不是普通的WHERE条件操作.