索引

作者: 丶失落叶 | 来源:发表于2019-10-14 19:33 被阅读0次

一、索引类型

1.普通索引:这是最基本的索引,它没有任何限制

2.唯一索引:索引列的值必须唯一,但允许有空值

3.主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引;

4.组合索引:为了进一步提高效率,将两个或多个字段建到一个索引中

二、索引的区别

普通索引需要回表

三、索引的数据结构(常见模型)

1.哈希表

a.哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把value 放在数组的这个位置。将不同的输入值通过Hash算法得到长度相同的输出。不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。 

b.哈希表的优点:随机读的速度快

c.哈希表的缺点:适合等值查询,范围查询慢;无法利用索引进行排序;不支持多联合索引的最左前缀原则;如   果有大量重复的键值,效率低,存在哈希碰撞;插入慢。

d.哈希表适合于等值查询的场景

2.有序数组

a.有序数组在等值查询和范围查询场景中的性能就都非常优秀

b.在需要更新数据的时候麻烦,往中间插入一个数据需要挪动后面的记录,所以有序数组索引只适用于静态存储引擎(不需要更改的数据)

3.B+树

a.B+树的叶子节点可以存放整行数据的主键索引,也可以存放主键值的普通索引,

b.B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护。往中间插入数值时,需要逻辑上挪动后面的数据,空出位置。如果插入的那页已满,这种情况下需要再申请一个新的数据页,然后挪动部分数据过去,这个过程称为页分裂。页分裂不仅影响性能,还影响页的利用率。

c.当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。

三、索引优化

1.覆盖索引:由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优       化手段。

2.最左前缀原作

3.索引下推:mysql5.6以后新加  

四、怎么判断你的查询使用了索引

explain 关键字 

explain执行结果的字段:

table: 这是重要的列,显示连接使用了何种类型.

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

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

possible_keys:可能使用了哪个索引在该表中查找行。如果没有使用任何索引,就显示的NULL,可以用于对优化时的索引调整。 

key:显示使用的索引,如果没有使用,则显示NULL 

key_len:显示的是所使用的索引长度,如果没使用,则是NULL。当然,在使用索引的情况下,索引长度越小。效果越明显。 

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:MYSQL认为必须检查的用来返回请求数据的行数

Extra:关于MYSQL如何解析查询的额外信息。

五、索引失效

1.前导模糊查询:就是模糊查询不能以%开头;

2.如果是组合索引的话,如果不按照索引的顺序进行查找,比如直接使用第三个位置上的索引而忽略第一二个位置上的索引时,则会进行全表查询

3.条件中有or; 应当尽量避免在where语句中使用or连接条件,否则导致引擎放弃使用索引

4.索引无法存储null值,所以where的判断条件如果对字段进行了null值判断,将导致数据库放弃索引而进行全表查询。

单列索引无法储存null值,组合索引无法全储存为null;查询时,采用is null 条件时,不能利用索引,只能通过全表扫描

为什么索引列不能储存null值:索引是有序的。NULL值进入索引时,无法确定其应该放在哪里。

5.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

6.in 和 not in 也要慎用,否则会导致全表扫描

7. 应尽量避免在索引列上进行函数操作或者运算,这将导致引擎放弃使用索引而进行全表扫描

8.mysql优化器觉的全表扫描效率高,就会放弃索引。

相关文章

  • MySQL索引

    MySQL索引 索引介绍 索引原理与分析 组合索引 索引失效分析 索引介绍 什么是索引索引:包括聚集索引、覆盖索引...

  • Mysql优化

    一.索引科普 主键索引 唯一索引 普通索引 单列索引 多列索引 聚簇索引 非聚簇索引 前缀索引 全文索引 二.优化...

  • Oracle 索引学习

    创建索引 标准语法 唯一索引 组合索引 反向键索引 示例 删除索引 修改索引 重建索引 联机重建索引 合并索引

  • MySQL索引

    索引的作用 查看索引 创建索引 删除索引 索引类型 强制索引和禁止某个索引

  • Pandas数据操作

    Pandas数据操作 Series索引 行索引 切片索引 不连续索引 布尔索引 DataFrame索引 列索引 不...

  • 深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索

    唯一索引/非唯一索引 主键索引(主索引) 聚集索引/非聚集索引 组合索引 唯一索引/非唯一索引 唯一索引 1.唯一...

  • MYSQL索引

    mysql的4种常用索引类型:唯一索引,主键索引,全文索引,以及普通索引。 普通索引(INDEX):普通索引为索引...

  • 索引类型

    索引类型有: 主键索引; 唯一索引; 普通索引; 全文索引; 多列索引;

  • mysql 查询效率优化之 常用索引的几种类型 新手使用教程,少

    Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引(联合索引,多列索引) 一、建立的方法介绍 ...

  • MySql 数据查询优化

    1. MySQL索引类型: mysql的索引有5种:主键索引、普通索引、唯一索引、全文索引、聚合索引(多列索引)。...

网友评论

    本文标题:索引

    本文链接:https://www.haomeiwen.com/subject/dpbrmctx.html