高性能的MySQL(5)索引策略一聚簇索引

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

聚簇索引,并不是一种单独的索引类型,而是一种数据存储方式。InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行信息。

因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引(不过可以通过覆盖索引来模拟,稍后再介绍)。

这里主要讨论InnoDB引擎,InnoDB通过主键聚集数据,如果没有主键会选择一个非空的唯一索引,如果还没有,InnoDB会隐式定义一个主键来作为聚簇索引。

聚簇索引是一把双刃剑,要仔细考虑。

优点:

1、可以把相关数据保存在一起,例如实现电子邮件时,根据用户ID来聚集数据,这样只需要从磁盘都去少量数据页就可以获取某个用户的全部邮件,如果没有聚簇索引,则每封邮件都可能导致一次I/O

2、数据访问更快。因为索引和数据都在一个B-Tree中。

3、使用聚簇索引的查询,可以直接使用页节点中的主键值。

缺点:

1、聚簇索引最大限度的提高了I/O密集型应用的性能,如果数据都放在内存中了,优势就没了。

2、插入速度严重依赖于插入顺序,按照主键的顺序插入到数据表中速度是最快的。如果不是,插入完数据之后最好使用OPTIMIZE TABLE命令组织一下。

3、更新聚簇索引列的代价很高,因为需要移动新的数据。

4、在插入新行,或者主键更新需要移动行的时候,可能导致页分裂,从而导致占用更多的磁盘空间。

5、二级索引(非聚簇)可能比想象的要大,因为二级索引的叶子节点中包含了引用行的主键列。

6、二级索引访问需要2次索引查找,而不是一次,因为二级索引保存的不是行的物理位置,而是主键值。


InnoDB和MyISAM数据分布对比。

1
2
3
4
5
6
CREATE  TABLE  `layout_test` (
   `col1`  int (11)  NOT  NULL ,
   `col2`  int (11)  NOT  NULL ,
   PRIMARY  KEY  (`col1`),
   KEY  `col2` (`col2`)
);

主键不是递增的,随机顺序插入,col2随即复制,重复的很多。

MyISAM比较简单,他按照数据插入的顺序存储在磁盘上。

161656641.png

col2索引没有什么区别。

InnoDB支持聚簇索引,所以存储方式非常不同

162133965.png

会发现,该图显示了整个表,而不是只有索引。因为InnoDB中,聚簇索引“就是”表,所以不会像MyISAM那样需要独立的行存储。

即使主键是一个前缀索引,聚簇索引也会包含完整的主键列和其他列。

还有一点和MyISAM不同,InnoDB的二级索引和聚簇索引很不相同,InnoDB二级索引的叶子节点中存储的不是行指针,而是主键值,这样就减少了移动数据或者页分裂时对二级索引的维护工作。使用主键占用的空间更多,但是无需更新二级索引。

164728177.png


下图更直接的展示了两者的区别。

164947761.png


如果在使用InnoDB表,并且没有数据需要聚集,那么可以定义一个和应用无关的主键,按主键顺序插入行,最好使用AUTO_INCREMENT,避免使用随机并且范围很大的聚簇索引,这会使聚簇索引的插入变得完全随机,不仅花费时间更长,而且索引占用空间也会更大。


对于高并发的工作负载,在InnoDB中按主键顺序插入可能造成明显的争用,主键的上界会成为“热点”,因为插入都发生在这里,造成锁竞争,另一个热点可能是AUTO_INCREMENT锁机制,对于比较新的版本更改innodb_autoinc_lock_mode配置,可能会工作的更好。




















本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1310976,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
101
分享
相关文章
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
71 11
Mysql的索引
MYSQL索引主要有 : 单列索引 , 组合索引和空间索引 , 用的比较多的就是单列索引和组合索引 , 空间索引我这边没有用到过 单列索引 : 在MYSQL数据库表的某一列上面创建的索引叫单列索引 , 单列索引又分为 ● 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。 ● 唯一索引:索引列中的值必须是唯一的,但是允许为空值 ● 主键索引:是一种特殊的唯一索引,不允许有空值 ● 全文索引: 只有在MyISAM引擎、InnoDB(5.6以后)上才能使⽤用,而且只能在CHAR,VARCHAR,TEXT类型字段上使⽤用全⽂文索引。
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
141 22
MySQL底层概述—8.JOIN排序索引优化
MySQL索引有哪些类型?
● 普通索引:最基本的索引,没有任何限制。 ● 唯一索引:索引列的值必须唯一,但可以有空值。可以创建组合索引,则列值的组合必须唯一。 ● 主键索引:是特殊的唯一索引,不可以有空值,且表中只存在一个该值。 ● 组合索引:多列值组成一个索引,用于组合搜索,效率高于索引合并。 ● 全文索引:对文本的内容进行分词,进行搜索。
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
129 18
MySQL原理简介—9.MySQL索引原理
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
127 11
MySQL底层概述—6.索引原理
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
232 82
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)