介绍
上一篇文章中介绍了MySQL的索引基本原理以及常见的索引种类,这边文章的重点在于如何构建一个高性能的MySQL索引,从中你可以学到如何分析一个索引是不是好索引,以及如何构建一个好的索引。
索引误区
多列索引
一个索引的常见误区是为每一列创建一个索引,如下面创建的索引:
CREATE TABLE `t` (
`c1` varchar(50) DEFAULT NULL,
`c2` varchar(50) DEFAULT NULL,
`c3` varchar(50) DEFAULT NULL,
KEY `c1` (`c1`),
KEY `c2` (`c2`),
KEY `c3` (`c3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
t表里有三列,并且为每列创建了一个索引。创建索引的人为了能够快速访问表中的任何一列,因此为每一列添加了一个单独的索引。在多个列上创建索引通常并不能很好的提高MySQL查询性能,虽然说MySQL 5.0之后引入了索引合并策略,可以将多个单列索引合并成一个索引,但这并不总是有效的。同时创建多个索引的时候还会增加数据插入的成本,在插入数据的时候需要同时维护多个索引的写入操作。
索引的计算
看下面这条sql语句:
select name from student where id + 1 = 5
即使我们在student表的id列上建立索引,上面的这条SQL语句也无法使用索引。SQL语句中索引字段不能是表达式的一部分,也不能是函数的参数。
索引的长度以及选择性
尽量不要在一个很长的列上使用索引,否则会导致索引占用的空间很大,同时在进行数据的插入和更新的时候意味着更慢的速度。因此使用uuid列作为索引并不是一个好的选择。从上一篇文章中我们可以知道,为了加快数据的访问索引是需要常驻内存的,假如说我们把64位uuid作为索引,那么随着表中数据量的增加索引的大小也在急剧增加。同时因为uuid并没有顺序性,因此在数据插入的时候都需要从根节点找到当前索引的插入位置,如果同一个节点中的索引大小达到上限,还会导致节点分裂,更加降低了插入速度。
创建索引另外一个需要考虑的是索引的选择性,通常情况下我们会使用选择性高的列作为索引,但是也不一定一直是这样,下一节会介绍如何权衡索引的选择性。
创建高性能索引
选择正确的索引顺序
在选择索引的顺序的时候有一个原则:将索引选择性最高的列放在左侧,同时索引的顺序要与查询索引的顺序一致,并且要兼顾考虑排序和分组的需要。在一个多列B树多列中索引的顺序意味着索引首先按照最左侧的列进行排序,其次是第二列。所以无论是where语句还是order by语句都需要尽量满足这个顺序,这样才能更好的使用索引。
索引的选择性
列的选择性高的含义是通过这一列能够更多的过滤掉无用的数据,举个极端的例子,如果把自增id建成索引那么它的选择性是最高的,因为会把无用的数据都过滤掉,只会剩下一条有效数据。我们可以通过下面的方式来简单衡量某一个列的选择性:
select count(distinct columnA)/count(*) as selectivity from table
当上面的数据越大的时候意味着columnA的选择性越高。这种方式提供了一个衡量平均选择性的办法,但是也不一定是有效的,需要具体情况具体分析。
前缀索引
当遇到特别长的列,但又必须要建立索引的时候可以考虑建立前缀索引。前缀索引的含义是把某一列的前N个字符作为索引,创建前缀索引的方式如下:
alter table test add key(columnA(5));
上面这个语句就是把columnA的前5个字符创建为前缀索引。前缀索引是一种使索引更小、更快的有效办法。但是前缀所有有一个缺点:MySQL无法使用前缀索引来做order by和group by,也无法使用前缀索引做覆盖扫描。
聚簇索引和非聚簇索引
聚簇索引
聚簇索引代表一种数据的存储方式,表示同一个结构中保存了B-Tree索引和数据行。也就是说当建立聚簇索引的时候实际的数据行存放在索引的叶子节点上。这也决定了每个表只能有一个聚簇索引。
聚簇索引组织数据的方式如下图所示:
从图中可以看到索引的叶子节点和数据行是存放在一起的,这样的好处是可以直接读取到数据行。在创建表的时候如果我们不显式指定聚簇索引,那么MySQL将会按照下面的逻辑来选择聚簇索引:首先会通过主键列来聚集数据,如果没有主键列那么会选择唯一的非空索引来替代。如果还没有这样的索引那么会隐式的创建一个主键列来作为聚簇索引。
聚簇索引优点:
1、相关数据存放在一起,检索的时候降低IO的次数
2、数据访问更快
3、使用覆盖索引扫描的查询可以直接使用节点中的主键值
在使用上面的优点的时候聚簇索引也有一定的缺点:
1、聚簇索引将数据聚集在一起限制了插入速度,插入速度比较依赖于主键的顺序
2、更新索引的时候代价会变高
3、二级索引的访问的时候需要查找两次
非聚簇索引
非聚簇索引通常被称为二级索引,与聚簇索引的不同在于,非聚簇索引的叶子节点存放的是数据的行指针或者是一个主键值。这样在查找数据的时候首先定位到叶子节点上的主键值(或者行指针),然后通过主键值再到聚簇索引中查找到对应的数据。从中我们可以看到对于非聚簇索引的查询需要走两次索引。下图是一个非聚簇索引:
这个索引是InnoDB中的耳机索引,叶子节点中存储的是索引和主键。对于MyISAM叶子节点存储的是索引和行指针。
覆盖索引
如果一个索引包含或者说覆盖所有需要查询的字段的值,那么就称为覆盖索引。覆盖索引可以极大的提高查询的效率,如果我们的查询中只查询索引,而不用去回表那应该最好不过了。
通常我们使用explain关键字来查看一个查询语句的执行计划,通过执行计划我们可以了解到查询的细节。如果是覆盖索引,我们会看到执行计划的Extra列里有”Using Index”的信息。在查询语句中一般我们希望是where条件中的语句尽量能被覆盖,并且顺序要跟索引的保持一致。还有一个需要注意的点是MySQL不能在索引中使用like操作,这样会导致后面的索引失效。
后记
本文主要讲了几种索引的原理以及如何构建一个高性能的索引。索引的优先是一个渐进的过程,随着数据量和查询语句的不同而发生变化,重要的是了解索引的原理,这样做出正确的优化。下一篇文章中将会介绍explain关键字,教你如何来看执行计划,以及如何判断一个查询语句是否需要优化的。
----------------------------------------------------------------
欢迎关注我的微信公众号:yunxi-talk,分享Java干货,进阶Java程序员必备。
相关推荐
总之,构建高性能MySQL系统是一个全方位的工程,需要综合考虑硬件、操作系统、文件系统、数据库配置和SQL设计等多个方面。通过合理优化,可以显著提升数据库的响应速度和并发处理能力,从而支持高性能的应用场景。
快速理解与构建高性能MySQL体系
《高性能MySQL》是一本深入探讨MySQL数据库系统优化与管理的经典著作。这本书涵盖了MySQL的架构、历史、性能调优以及基准测试等多个重要主题,对于数据库管理员、开发人员以及对数据库性能有高要求的技术人员来说,...
《高性能MySQL》汇聚了著名MySQL 专家在实践中构建大型系统的多年宝贵经验,指导你如何使用MySQLTF发出快速可靠的系统。的第二版着眼于健壮性、安全性及数据完整性,涵盖了 MySQL性能的细微之处。 《高性能MYSQL》...
《高性能MySQL》是一本经典的数据库技术专著,深入探讨了MySQL的高性能优化、备份、恢复、复制和安全性等方面,对于数据库管理员、开发人员以及对MySQL性能有高要求的技术人员来说,是一本不可或缺的参考书。...
构建高性能MySQL的核心在于优秀架构设计、最佳数据模型、高效程序代码、合适部署结构及适当资源投入。这些要素共同作用于系统,旨在实现高性能、缩减成本并获取行业竞争优势。构建过程涉及SDLC(软件开发生命周期)...
本书由资深MySQL专家撰写,以最新的MySQL版本为基础,以构建高性能MySQL服务器为核心,从故障诊断、表设计、SQL优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、MySQL高可用集群搭建与管理、MySQL服务器...
11. **最新版本特性**:《高性能MySQL》第三版可能会涵盖MySQL的新特性,如InnoDB Cluster、JSON支持、窗口函数等,帮助读者掌握最新技术动态。 总的来说,这本书是提升MySQL性能的宝典,无论你是初学者还是经验...
6.8.1使用MySQL构建一个队列表251 6.8.2计算两点之间的距离254 6.8.3使用用户自定义函数257 6.9总结258 第7章MySQL高级特性259 7.1分区表259 7.1.1分区表的原理260 7.1.2分区表的类型261 7.1.3如何使用分区...
《高性能MySQL》是一本深入探讨MySQL数据库性能优化的权威指南,尤其适合于已经对MySQL有一定了解,希望进一步提升系统性能的DBA和开发者。这本书详细阐述了如何在实际环境中实现MySQL的高效运行,覆盖了从基础概念...
本文主要从MySQL的逻辑架构、并发控制、事务处理、多版本并发控制(MVCC)以及存储引擎等方面,对《高性能MySQL》一书的学习摘要进行详细阐述。 首先,MySQL的逻辑架构分为三层。第一层是连接处理、授权认证和安全...
《高性能MySQL》第三版是数据库领域的一本经典著作,专注于MySQL的优化与高效使用。这本书深入探讨了如何在实际环境中实现MySQL的高性能运行,对于数据库管理员、开发人员以及对数据库性能有需求的技术人员来说,是...
总而言之,《高性能MySQL》是一本全面且实用的MySQL指南,它提供了从基础到高级的全方位知识,帮助读者构建、优化和管理高性能的MySQL环境。无论是新手还是经验丰富的DBA,都能从中找到提升数据库性能的有效方法。...
资源名称:MySQL管理之道:性能调优、高可用与监控内容简介:《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql...
《高性能MySQL(第3版)》是一本深受数据库管理员、开发者和系统架构师喜爱的经典著作。这本书详尽地探讨了如何优化和管理MySQL数据库,以实现高性能和高可用性。以下将从多个方面阐述该书涉及的重要知识点: 1. **...
### 高性能MySQL第三版知识点概述 #### 一、书籍简介 《高性能MySQL》第三版是一本关于MySQL数据库优化的经典著作。本书不仅深入探讨了MySQL的内部机制与使用技巧,还涉及了大量的性能优化方法和实战案例,对于提高...
为了生成您所需的关于"高性能mysql——高清版"的知识点,我将依赖标题和描述部分提供的信息,以及对MySQL数据库性能优化的普遍知识来进行回答。 1. MySQL概述 MySQL是一个多用户、多线程的SQL数据库管理系统,使用...
《高性能MySQL》(第三版)是关于MySQL数据库性能调优方面的权威指南,由O'Reilly Media公司出版。这本书由MySQL领域的专家...通过阅读本书,读者可以获得关于如何构建、管理和维护高性能MySQL数据库系统的全方位知识。