Mysql索引

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: Mysql索引

Mysql索引

  • Mysql5.6的索引下堆:指待匹配的列都在联合索引中,但是存在索引跳过(如index(a,b,c);where a='' and c='');此时对于where的条件匹配 判定会发生在存储引擎层面,而不是返回给Server层在进行条件判定,其目的是减少回表次数
  • 索引优化三原则
  1. 尽量减少单行访问;因为从海量数据中取出一条,将浪费很多资源
  2. 尽量顺序访问
  • 顺序访问保证了I/O的顺序性,避免了随机I/O
  • 顺序访问之后将不再需要进行其余的排序操作
  1. 数据列尽量只返回我们需要的;让数据检索走覆盖索引,避免二级索引的回表操作
  • 何为索引?
  • 索引实际上类似于目录,它可以帮助我们跳过全文查找,快速的找到我们所需要的内容.索引最大的优点便是节省时间
  • 但是实际上索引的建立是一种以空间换时间的方式,在物理存储上依然是存在索引文件的
  • 索引记录了关系表的索引信息,有利于查询;但是如果频繁修改、删除、新增,则对性能的损耗也很严重;因为**不但需要维护关系表还需要维护索引 **
  • MySQL的索引类型
  • MySQL索引的建立与MySQL索引列的顺序很大的关系
  • B+树索引:
  • 全键值、键值范围、键前缀(只适合最左前缀匹配)
  • B+树索引的限制场景
  • 聚合索引没有按照索引列的最左列开始查找;如index(id,name,age);如果使用age则索引失效
  • 聚合索引索引列不能跳索引列;如index(id,name,age);如果使用id,age则索引失效
  • 如果存在范围查询,则范围查询的列的右边列索引失效
  • 自适应Hash索引:当某个值被频繁使用时,innodb会自动在内存创建一个Hash索引,进而加快查找
  • 哈希索引:
  • 哈希索引基于Hash表实现的,只有在精确匹配时才有效
  • 哈希索引通过所有索引列来计算hash值,哈希索引十分的快
  • 哈希索引的限制
  • 只包含行指针、Hash值,所以依然需要读取行;但是行在内存中,性能损耗忽略不计
  • Hash索引是通过索引的Hash值插入,因此Hash索引不能用于排序
  • Hash索引通过全部索引列生成Hash值,因此不支持部分索引列查找
  • Hash索引只支持等值比较;不支持任何的范围比较
  • 空间数据索引(R-Tree)
  • 全文索引
  • 聚簇索引
  • 聚簇索引并非是一种单独的索引类型,它更加像一种数据存储的方式
  • 聚簇索引的主键值与行的信息是绑定在一起的;如果没有主键怎么办?
  • 优先选择唯一非空列作为索引列
  • 如果不存在唯一、非空列,则采用隐藏的索引列(6个字节),随行的新增而ID自增
  • 聚簇索引的优势
  • 主键与数据在一块,减少了I/O次数,极大提升了I/O密集行应用的性能
  • 主键与数据在一块,不需要进行回表
  • 什么是回表?
  • 指首先获取主键ID,在根据主键ID来获取具体信息(涉及了两次查询)
  • 聚簇索引的劣势
  • 数据插入的速度依赖于插入的顺序;B+Tree需要排序
  • 数据更新的代价很高,因为需要移动行
  • 当行移动时,有可能会触发页分裂
  • 当某一页的数据满时,如果发生新插入,会触发页分裂将一页分裂为两页;同时,后一列的聚簇索引必然大于前一页
  • 当数据稀疏时、或者页分裂的过程导致数据不连续时,对性能影响很大
  • 非聚簇索引(二级索引)
  • 非聚簇索引需要两次索引查找(第一次查询主键ID,第二次根据主键ID查询对应的数据条目);使用自适应性Hash可以减少索引查询的次数

为什么聚簇索引的设计应该尽量避免随机?

  • 假设聚簇索引是有序的,则对于数据的记录,当前数据条目应该追加在前一个条目的尾部
  • 如果聚簇索引的设计是随机的,那么会存在以下问题:
  • 如果当前的索引的写入目标页已经不在内存,此时会将磁盘数据载入内存,增加随机I/O,使性能降低
  • 由于索引的随机性,会导致引擎进行大量的重排序,进而导致频繁的页分裂
  • 大量的页分裂,会使业内碎片增加,使数据页碎片化严重,数据访问的性能降低
  • 覆盖索引
  • 如果一个索引包含了所需要查询的所有字段,则称该索引为覆盖索引;(换而言之,只扫描一个B+Tree树就能获得结果)
  • 覆盖索引的优势
  • 索引所占用的空间比数据行空间小;因此如果只读索引,则会极大减少数据访问
  • 索引是依据一定顺序构建的,因此一般比随机访问的区间小很多;
  • 如果说非聚簇索引能够覆盖查询,则能够避免对于主键索引的二次查询
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
14 4
|
3天前
|
SQL JavaScript 关系型数据库
Mysql索引不当引发死锁问题
本文通过真实案例解析了MySQL在高并发环境下出现死锁的问题。数据库表`t_award`包含多个索引,但在执行特定SQL语句时遭遇索引失效,导致更新操作变慢并引发死锁。分析发现,联合索引`(pool_id, identifier, status, is_redeemed)`因`identifier`允许为空值而导致索引部分失效。此外,`pool_id`上的普通索引产生的间隙锁在高并发下加剧了死锁风险。为解决此问题,文中提出了调整索引顺序至`(pool_id, status, is_redeemed, identifier)`等方案来优化索引使用,进而减轻死锁现象。
|
6天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
19天前
|
存储 SQL 关系型数据库
(六)MySQL索引原理篇:深入数据库底层揭开索引机制的神秘面纱!
《索引原理篇》它现在终于来了!但对于索引原理及底层实现,相信大家多多少少都有了解过,毕竟这也是面试过程中出现次数较为频繁的一个技术点。在本文中就来一窥`MySQL`索引底层的神秘面纱!
|
19天前
|
SQL 存储 关系型数据库
(五)MySQL索引应用篇:建立索引的正确姿势与使用索引的最佳指南!
在本篇中,则重点讲解索引应用相关的方式方法,例如各索引优劣分析、建立索引的原则、使用索引的指南以及索引失效与索引优化等内容。
|
24天前
|
SQL 缓存 关系型数据库
MySQL 查询索引失效及如何进行索引优化
MySQL 查询索引失效及如何进行索引优化
60 1
|
26天前
|
SQL 缓存 关系型数据库
面试题MySQL问题之实现覆盖索引如何解决
面试题MySQL问题之实现覆盖索引如何解决
30 1
|
26天前
|
存储 SQL 索引
面试题MySQL问题之使用SQL语句创建一个索引如何解决
面试题MySQL问题之使用SQL语句创建一个索引如何解决
32 1
|
13天前
|
缓存 关系型数据库 MySQL
MySQL调优秘籍曝光!从索引到事务,全方位解锁高可用秘诀,让你的数据库性能飞起来!
【8月更文挑战第6天】MySQL是顶级关系型数据库之一,其性能直接影响应用的高可用性与用户体验。本文聚焦MySQL的高性能调优,从索引设计到事务管理,逐一解析。介绍如何构建高效索引,如联合索引`CREATE INDEX idx_order_customer ON orders(order_id, customer_id);`,以及索引覆盖查询等技术。
39 0
|
19天前
|
存储 SQL 关系型数据库
(四)MySQL之索引初识篇:索引机制、索引分类、索引使用与管理综述
本篇中就对MySQL的索引机制有了全面认知,从索引的由来,到索引概述、索引管理、索引分类、唯一/全文/联合/空间索引的创建与使用等内容,进行了全面概述。