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

  索引,MySQL中也叫“键”,是存储引擎中用于快速找到记录的一种数据结构,具体的工作方式就像书本中的索引一样,但是具体的实现方式会有差别。

一.索引分类

B-Tree索引:

  优点:

  • MyISAM中,索引根据数据的物理位置引用被索引的行,InnoDB中根据主键引用被索引的行。
  • B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点开始进行搜索。
  • B-Tree对索引列是顺序组织存储的,所以很适合查找范围数据。
  • 一般来说,B-Tree可以按照某种方式查找到值,那么也可以用这种方式排序

  限制:

  • 如果不是按照索引的最左列开始查到,则无法使用索引
  • 不能跳过索引中的列
  • 如果查询中有某个列的范围查询,则其右边所有的列都无法使用索引优化查找。

哈希索引:

  哈希索引基于哈希表实现,只有精确匹配的索引所有列的查询才有效

  优点:

  • 非常快

  限制:

  • 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行
  • 哈希索引不是按照索引值顺序存储的,所以不能用于排序
  • 哈希索引不支持部分索引列匹配查找。
  • 哈希索引只支持等值比较查询。
  • 哈希冲突很多的话,一些索引维护操作的代价会很高。

二.索引的优点

最常见的是B-Tree索引,按照顺序存储数据,所以可以用来做ORDER BY和GROUP BY操作。因为数据是有次序的,所以B-Tree也就会将相关的列值存储在一块。由于索引中存储了实际的列值,所以某些查询只使用索引就可以完成全部查询。

1.索引大大减少了服务器需要扫描的数据量

2.索引可以帮助服务器避免排序和临时表

3.索引可以将随机I/O变为顺序I/O.

三.高性能索引策略

1) 独立的列

独立的列是指索引列不能是表达式的一部分,也不能是函数的一部分

2)前缀索引和索引选择性

诀窍在于要选择足够长的索引以保证高的索引选择性,但是又不能太长(节约空间)。

3)多列索引

首先“把where条件里面的列都建上索引”是错误的。

如果在一个查询用使用两个单列索引,在老版本的MySQL中会导致全表扫描,在新版本中,查询可以使用多个单列索引,并将结果合并

这种算法有三个变种:

  •    OR条件的联合(union)
  •    AND条件的相交(intersection)
  •    以前OR和AND的组合

索引合并策略更多的说明了索引建的很糟糕:

  • 当出现服务器对多个索引做相交操作时,通常意味着需要一个包含所有相关列的多列索引,而不是多个独立的单列索引
  • 当服务器需要对多个索引做联合操作时,通常需要耗费大量的CPU和内存资源在算法的缓存/排序/合并操作上。

4)选择合适的索引列顺序

  多列索引的顺序至关重要

  有一个经验法则:当不需要考虑排序和分组时候,将选择性高的列放在前面通常是很好的。

5) 聚簇索引

  聚簇索引不是一种单独的索引类型,而是一种数据存储方式,实际上,InnoDB聚簇索引在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时候,它的数据行实际上放在索引的叶子页中。“聚簇”,表示数据行键值紧凑的存储再一起。

  优点:

  • 可以把相关数据保存在一起,减少磁盘I/O
  • 数据访问更快,因为索引和数据保存在同一个B-Tree中
  • 使用覆盖索引扫描查询可以直接使用页节点的主键值。

  缺点:

  • 聚簇索引最大限度的提高了I/O密集型应用的性能,但是如果数据都在内存中,聚簇索引就没有优势了
  • 插入速度严重依赖插入顺序
  • 更新聚簇索引代价很高
  • 在插入新行,或者主键更新需要移动行时候,可能导致页分裂。
  • 导致全表扫描变慢,尤其是行稀疏的时候,或者由于页分裂导致数据存储不连续时候
  • 二级所以可能比想象中更大,因为二级索引的叶子节点包含了主键值
  • 二级索引访问需要两次索引查找,而不是一次。

6)覆盖索引

如果一个索引包含(覆盖)了所有需要查询的字段的值,那么就是覆盖索引

覆盖索引必须要存储索引列的值,而哈希索引,空间索引,全文索引都不存储索引列的值,只有B-Tree可以

MySQL不能再索引中执行LIKE操作,这是底层API的限制,MySQL只能提取数据行的值而不是索引的值来比较。

为了利用覆盖索引,我们可以利用一种叫延迟关联的技巧

7) 使用索引扫描来做排序

参考资料:高性能MySQL第五章

时间: 2024-08-28 02:00:51

[MySQL-笔记]创建高性能索引的相关文章

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

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

sql server与mysql 中创建唯一索引

/*筛选索引 SQL SERVER 2008 测试*//* 应用:用户表,通过ID可以登录, 如果有电话号码也可以登录,但此时必须保证电话号码唯一.*/--1,创建测试表CREATE TABLE T( ID VARCHAR(20) NOT NULL PRIMARY KEY, MOBILE VARCHAR(20)NULL) --2,创建索引 唯一,非聚集索引(并添加筛选条件)CREATE UNIQUE NONCLUSTERED INDEX [IDX_MOBILE] ON [dbo].[T] ( [

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

索引是存储引擎用于快速找到记录的一种数据结构,这也是索引的基本功能.在MySQL中也叫"键key".良好的性能少不了索引.换句话说,索引优化能够将查询性能轻松提高几个数量级. 1. 索引基础 select first_name from actor where actor_id = 5; 运行上面的查询:如果在actor_id列上有索引,MySQL将使用该索引去查找actor_id为5的列,也就是说:MySQL先在索引上按值查找,然后返回包含该值的数据行. 索引可以包含一个或多个列,列

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

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

MySQL 创建高性能索引

一.索引类型 B-Tree索引: B-Tree通常间意味着以后有的值都是按顺序存储的,并且每一个叶子页到根的距离相同. B-Tree索引 列是顺序组织存储的,所以很适合查找 范围数据. B-Tree索引对如下类型的查询有效: 全值匹配.匹配最左前缀.匹配列前缀.匹配范围值.精确匹配某一列并范围匹配别外一列.只访问索引的查询 B-Tree索引的限制: 如果不是按照索引的最左列开始查找,刚无法使用索引. 不能跳过索引中的列. 如果查询中某个列的范围查询,刚其右边所有列都无法使用索引优化查询. HAS

高性能索引该如何设计?(上)

欢迎来到第 4 课时“高性能索引”,这一课时的内容包含索引设计和工作原理.索引类型.索引使用技巧.如何创建高性能索引.索引创建规范等 5 个方面. 索引设计和工作原理 先来看看索引设计和工作原理.想创建高性能索引,首先要了解什么是索引.维基百科对其定义:数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度.通俗来说,索引类似于书的目录,根据其中记录的页码可以快速找到所需的内容. MySQL 官方对索引(Index)的定义是存储引擎用于快速查找记录的一种数据结

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

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

《高性能MySQL》读书笔记之创建高性能的索引

索引是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化的最有效手段.索引能够轻易将查询性能提高几个数量级.创建一个最优的索引经常需要重写查询.5.1 索引基础 在MySQL中,存储引擎首先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行. 索引可以包含一个或多个列的值.如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列. 5.1.1 索引的类型 索引有很多类型,可以为不同的场景提供更好的性能.在MySQL中,索引是在储存引擎层而不是

mysql索引类型以及如何创建高性能的索引

B-tree       ---默认的索引类型 存储引擎会以不同的方式使用B-tree索引,性能也不一样.myisam使用前缀压缩技术,是索引更小,通过数据的物理位置引用索引的行.InnoDB按照原数据格式进行存储,根据主键引用索引的行. 2.B+tree        --- 3.哈希索引        --只有memory引擎支持.无法排序. 4.R-tree 5.全文索引 mysql索引类型以及如何创建高性能的索引,布布扣,bubuko.com