MySQL系列(20): 范围查询优化
MySQL 对范围查询提供了 range access method(范围访问方法) 来优化查询。
范围访问方法使用单个索引来检索包含在一个或多个索引值区间内的表行的子集。这里的单个索引可以是单列索引或多列索引。
MySQL 对范围查询提供了 range access method(范围访问方法) 来优化查询。
范围访问方法使用单个索引来检索包含在一个或多个索引值区间内的表行的子集。这里的单个索引可以是单列索引或多列索引。
MySQL 查询是以 SELECT 语句形式执行数据库中的所有查找操作,SELECT 操作在执行的 SQL 语句中占大比例,SELECT 调优可以说是对 SQL 优化的首要任务。
查询调优除了应用于 SELECT 语句外,还适用于诸如 create table…as select、insert in to…select 和 delete 语句中的 where 子句等构造。这些语句还有额外的性能考虑,因为它们将写操作与面向读的操作结合在了一起。
使用索引来提高查询性能效果是显著的,但不正确的 SQL 语句使用也会导致索引失效,索引使用未达预期,甚至执行全表扫描,此情况是严重影响性能的,在编写 SQL 语句时特别注意。
特别强调,在每提交一条 SQL 语句时,必须使用 Explain 分析下索引的的使用。在生产环境或测试环境下,小数据的 SQL 执行感觉不到性能的差异,但一旦发布到线上大数据表,不正确的 SQL 可能会严重影响生产库的性能,并给业务带了损失,此情况仍时有发生。
MySQL 查询执许计划 EXPLAIN 输出的信息有个扩展信息字段 Extra,该字段包含了有关 MySQL 如何解析查询的其他信息,可以更好地帮助理解执行计划。
该字段常见的值有 Using index、Using where。若想尽可能提高查询效率,需要关注 Using filesort 和 Using temporary 值,该值会影响查询的性能。
MySQL 优化器会根据 表、列、索引 和 WHERE 子句中的条件的详细信息,会考虑许多技术来更高效地执行 SQL 查询中涉及的查找。可以在不读取所有行的情况下执行对大表的查询,可以在不比较每个行组合的情况下执行涉及多个表的联接。
MySQL 优化器会选择最有效查询的操作集称为 查询执行计划,也称为 EXPLAIN 计划。MySQL EXPLAIN 官方文档,MySQL EXPLAIN 语句。
我们需要理解 EXPLAIN 计划中的操作是否已达到预期,以及对那些低效的操作进行改进。
给列创建索引是提高 SELECT 查询性能的最佳方式。索引类似于表行的指针,在查询时可以根据索引快速定位某些行与 WHERE 子句中的条件匹配,并检索该行的其他列值。MySQL 所有数据类型都可以创建索引。
虽然添加索引对查询带来的性能提效果是显著的,但也不是为每一个列都创建索引为好,索引还会增加 插入、更新和删除的成功,因为必须更新每个索引。
Ribbon 是 Netflix 开源的内置了软件负载均衡器的进程间通信(远程调用)库。支持负载均衡、容错处理、异步和响应式模型中的多协议(HTTP、TCP、UDP)支持、缓存和批处理。
目前行业常见的负载均衡方案分两种:一种是集中式负载均衡,在消费者与服务提供方中间使用独立的代理方式进行负载,有根据 IP 的硬件负载(如 F5,Array), 有软件的负载(如 Nginx,LVS等);另一种是客户端自己做负载均衡,根据自己对目标的请求做负载,Ribbon 就是属于客户端侧的负载均衡。
后续要讲到的 Rest 客户端 Feign 也是基于 Ribbon 实现的。
Spring Cloiud - Client Side Load Balancer: Ribbon 文档,Netflix Ribbon 官方文档,Ribbon 负载均衡文档,
所有 MySQL列类型都可以被索引,对相关列使用索引是提高select操作性能的最佳途径。
MySQL中最常用的存储引擎有InnoDB和MyISAM,这两种存储引擎的表默认创建的都是B-Tree索引;MEMORY存储引擎使用HASH索引,也支持B-Tree索引。
了解 B-tree 和 Hash 数据结构,有助于预测不同的查询在不同的存储引擎上使用这些数据结构的执行情况。特别是对于允许选择 B-tree 和 Hash 索引的内存存储引擎(MEMORY)。
InnoDB 存储引擎默认使用的是 B-tree 数据结构的索引。官方文档:B-tree 索引 与 Hash 索引比较
MyISAM存储引擎只支持表级锁。该锁类型是也使用非常广泛的锁类型。