数据库--浅谈Mysql索引类型以及不同索引之间的区别

简介

索引是一种数据结构,能够快速检索数据库中的数据

常见Mysql索引类型

1、FullText 全文索引
只有在MyISAM上支持
只有char/varchar/text列上可以创建全文索引

2、Hash 哈希索引
Hash索引底层是哈希表
对于精准查询非常高效,即在‘=’、‘in’条件下高效
无法通过索引做区间查询,只能扫描全表
范围查询、排序、组合索引效率不高

3、B+Tree
InnoDB引擎默认索引模型
B+Tree是一种多路平衡二叉树的结构,每次查询都是从根节点root开始,遍历子节点
可以存储整行数据(存储整行数据的叫主键索引,也叫聚簇索引),也可以是主键值(存储主键值叫非主键索引,也叫非聚簇索引)

InnoDB默认对主键建立聚簇索引,如果不指定主键,InnoDB会用一个非空值的索引代替
一般来说聚簇索引查询比非聚簇索引更快,因为主键索引树的叶子结点就是我们要查的整行数据。而非主键索引需要回表查询多次。
但是有个例外情况,就是索引覆盖的情况。覆盖索引是指一个查询语句的执行从索引中就可以获取,不必从数据表读取。避免了回表操作,
减少I/O操作。

4、RTree
RTree很少使用
仅支持geometry数据类型

常见面试题:
为什么mysql选择B+Tree索引而不用Hash索引?
1、Hash索引适用于等值查询,无法进行区间查询
2、Hash索引无法用过索引排序
3、Hash索引不支持联合索引的最左匹配规则
4、如果有大量重复键值,可能会出现哈希碰撞,到会索引效率低下

索引种类

1、普通索引:仅仅提高查询速率
2、唯一索引:提高查询速率+列值唯一(可以null)
3、主键索引:提高查询速率+列值唯一(不可以null)
4、组合索引:多个字段组合的索引,效率大于索引合并
5、全文索引:对文本内容分词搜索

组合索引也称联合索引,联合索引遵循最左前缀匹配规则
左前缀原则:
如abcd_index:abcd联合索引。where条件按照索引建立的顺序来使用,如果中间某列没有值或使用like会导致后面的列不走索引

索引优化

Mysql在5.6时对索引进行了优化

引入索引下推优化,默认开始(关闭命令:SET optimizer_switch = ‘index_condition_pushdown=off’;)
引入索引下推优化,可以在like条件查询下,减少回表次数

查询优化器优化过程:
1、根据搜索条件,找出所有可能使用的索引
2、计算全表扫描的代价
3、计算使用不同索引执行查询的代价
4、对比各种方案,找出最小代价的那个执行

索引失效场景总结

  1. or两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。
  2. where子句中对字段进行值判断会导致引擎放弃使用索引而进行全表扫描
  3. 使用%前缀模糊查询会导致索引失效
  4. 在where子句中对字段进行表达式操作 会导致索引失效
  5. 联合索引来如果存在范围查询,比如between、>、<等条件时,会造成后面的索引字段失效。

持续更新中…

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
索引是一种数据结构,它可以帮助加快数据库表中数据检索速度。在 MySQL 数据库中,索引通常被称为 B-tree 索引,它可以加速 SELECT、UPDATE 和 DELETE 操作的速度。在本文中,我们将介绍 MySQL 中的索引,包括索引类型、如何创建索引、如何使用索引以及索引的优化。 ## 索引类型 MySQL 支持多种类型索引,包括以下几种常见的类型: - PRIMARY KEY 索引:用于唯一标识数据库表中的每一行记录。 - UNIQUE 索引:用于确保表中某一列的值是唯一的。 - INDEX 索引:用于加速表中的数据检索操作。 - FULLTEXT 索引:用于全文搜索操作。 ## 如何创建索引MySQL 中,可以使用 CREATE INDEX 语句来创建索引。例如,下面的语句创建一个名为 idx_last_name 的索引,用于加速对 employees 表中 last_name 列的检索: ``` CREATE INDEX idx_last_name ON employees (last_name); ``` 需要注意的是,创建索引可能会增加数据库表的插入、更新和删除操作的时间开销。因此,应该谨慎地考虑是否需要创建索引,以及应该创建哪些索引。 ## 如何使用索引MySQL 中,可以使用 EXPLAIN 语句来查看查询语句的执行计划。如果查询语句使用了索引,则在执行计划中会显示使用的索引名称。例如,下面的语句使用 EXPLAIN 来查看对 employees 表进行 last_name 列检索的执行计划: ``` EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; ``` 如果查询语句没有使用索引,则可以使用 FORCE INDEX 语句来强制使用指定的索引。例如,下面的语句强制使用 idx_last_name 索引来对 employees 表进行 last_name 列检索: ``` SELECT * FROM employees FORCE INDEX (idx_last_name) WHERE last_name = 'Smith'; ``` 需要注意的是,强制使用索引可能会导致性能下降。因此,应该仅在必要时使用强制索引。 ## 索引的优化 在 MySQL 中,可以使用 OPTIMIZE TABLE 语句来优化数据库表。优化表可以帮助减少表中的碎片,提高表的查询性能。例如,下面的语句优化 employees 表: ``` OPTIMIZE TABLE employees; ``` 此外,还可以使用 ANALYZE TABLE 语句来分析表中的数据分布情况,以便优化索引。例如,下面的语句分析 employees 表的数据分布情况: ``` ANALYZE TABLE employees; ``` 需要注意的是,索引的性能可能会受到数据分布的影响。如果表中的数据分布不均匀,则可能需要重新设计索引或优化查询语句以提高性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qrainly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值