Optimization and Indexes

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL通过索引快速定位具有特定列值的行,避免全表扫描,提高查询效率。常用的索引如PRIMARY KEY、UNIQUE等大多存储在B树中,特殊情况使用R树或哈希索引。索引帮助快速匹配WHERE子句条件的行,减少候选行数,并在多列索引和表连接操作中优化查询。具体特性如B树和哈希索引的比较见特定章节。

8.3.1 How MySQL Uses Indexes
索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。桌子越大,成本就越高。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而无需查看所有数据。这比按顺序读取每一行快得多。
大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)都存储在B树中。例外情况:空间数据类型的索引使用R树;MEMORY表还支持哈希索引;InnoDB对FULLTEXT索引使用倒排列表。
一般来说,索引的使用如以下讨论所述。第8.3.8节“B树和哈希索引的比较”描述了哈希索引(如MEMORY表中使用的)的特定特征。

MySQL uses indexes for these operations:
快速查找与WHERE子句匹配的行。
消除考虑中的行。如果可以在多个索引之间进行选择,MySQL通常会使用找到最少行数的索引(最具选择性的索引)。
如果表具有多列索引,则优化器可以使用索引的任何最左侧前缀来查找行。例如,如果你在(col1,col2,col3)上有一个三列索引,那么你在(coll1)、(col1、col2)和(col1)、col2、col3上都有索引搜索功能。有关更多信息,请参阅第8.3.5节“多列索引”。
执行联接时从其他表中检索行。如果列被声明为相同的类型和大小,MySQL可以更有效地在列上使用索引。在这种情况下,如果VARCHAR和CHAR被声明为相同的大小,则它们被认为是相同的。例如,VARCHAR(10)和CHAR(15)的大小相同,但VARCHAR。

对于非二进制字符串列之间的比较,两列应使用相同的字符集。例如,将utf8列与latin1列进行比较会排除使用索引。
如果不进行转换就无法直接比较值,则不同列的比较(例如,将字符串列与时间列或数字列进行比较)可能会阻止使用索引。对于数字列中的给定值(如1),它可能与字符串列中的任意数量的值(如“1”、“1”,“00001”或“01.e1”)进行比较。这排除了对字符串列使用任何索引的可能性。
查找特定索引列key_col的MIN()或MAX()值。这由预处理器进行优化,该预处理器检查您是否在索引中key_col之前出现的所有关键部分上使用WHERE key_part_N=常量。在这种情况下,MySQL对每个MIN()或MAX()表达式进行单键查找,并将其替换为常量。如果所有表达式都被常量替换,则查询会立即返回。例如:

image.png

如果排序或分组是在可用索引的最左侧前缀上完成的,则对表进行排序或分组(例如,ORDER BY key_part1、key_part2)。如果所有关键部分后面都跟着DESC,则按相反顺序读取密钥.按优化排序分组。

在某些情况下,可以优化查询以检索值,而无需查询数据行。(为查询提供所有必要结果的索引称为覆盖索引。)如果查询仅使用表中某些索引中包含的image.png
列,则可以从索引树中检索所选值以获得更快的速度:

索引对于小表上的查询或报表查询处理大部分或全部行的大表来说不太重要。当查询需要访问大部分行时,按顺序读取比遍历索引更快。即使查询不需要所有行,顺序读取也可以最大限度地减少磁盘查找。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
JSON Java 关系型数据库
Optimizer Use of Generated Column Indexes
MySQL支持对生成的列进行索引并利用这些索引优化查询执行计划。即使查询未直接引用生成列,只要表达式与生成列定义匹配,优化器也会自动使用索引。但表达式需与生成列定义完全一致且结果类型相同。此功能适用于特定运算符如=、<、BETWEEN等。生成列定义需含函数调用或指定运算符。对于JSON值的比较,使用`JSON_UNQUOTE()`以确保正确匹配。若优化器未选择合适索引,可使用索引提示调整。
167 82
|
29天前
|
关系型数据库 MySQL 索引
WHERE Clause Optimization
本节探讨了WHERE子句的优化方法,虽然示例基于SELECT语句,但也适用于DELETE和UPDATE语句。MySQL自动执行多种优化,例如仅计算一次索引使用的常量表达式、快速检测无效表达式、合并HAVING和WHERE子句、优先读取常量表、寻找最佳连接组合、使用内存中的临时表、选择最佳索引以及在某些情况下仅使用索引树解析查询,从而提升查询效率。
|
5月前
|
缓存 监控 前端开发
Performance Optimization
Performance Optimization
74 2
|
5月前
|
Oracle 关系型数据库
Adaptive Query Optimization
Adaptive Query Optimization
35 4
|
5月前
|
SQL
Adaptive Statistics
Adaptive Statistics
25 0
|
算法 计算机视觉 知识图谱
ACL2022:A Simple yet Effective Relation Information Guided Approach for Few-Shot Relation Extraction
少样本关系提取旨在通过在每个关系中使用几个标记的例子进行训练来预测句子中一对实体的关系。最近的一些工作引入了关系信息
117 0
|
存储 编解码 固态存储
Performance optimization with Lucene4.0
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里
118 0
|
SQL 存储 算法
《Optimization of Common Table Expressions in MPP Database Systems》论文导读
Optimization of Common Table Expressions in MPP Database Systems
《Optimization of Common Table Expressions in MPP Database Systems》论文导读
|
算法 关系型数据库 MySQL
Fundamental Techniques for Order Optimization
这是一篇1996年的老paper了,主要讲解了IBM DB2如何针对query当中的有序性进行优化。但对于后续physical property的优化有较为深远的影响,由于DB2的优化器起源于System-R以及其后续演进的starburst,因此延续了system-R中的interesting order和order property的概念。关于system-R的介绍请看之前的文章。 order这种physical property并不只限于order by算子,基于有序的group by/distinct等,都会利用到数据的排序操作,而排序本身就是比较昂贵的计算,因此应该对其做尽可能的优化
220 0
Fundamental Techniques for Order Optimization
|
SQL 算法 关系型数据库
Optimizing Queries over Partitioned Tables in MPP Systems
随着互联网数据的爆炸性增长,传统数据库系统在单表数据容量方面承受了越来越大的压力。以前公司内部的数据库,存放的主要是来自公司业务或内部管理系统的信息,中小型公司甚至一个MySQL实例就搞定了。但现在数据源不仅更丰富,数据量也在指数级增长,从业务的角度,基于hash/range的分区表变得越来越有吸引力。
252 0
Optimizing Queries over Partitioned Tables in MPP Systems