MySQL 优化 —— MySQL 如何使用索引

引言

本文翻译自MySQL 官网 :How MySQL Uses Indexes ,MySQL 版本 5.7 。

提升 SELECT 操作性能最好的方式就是在查询的一列或多列上建立索引。索引的行为类似指向表数据的指针,可以让查询能够快速判断哪个记录满足 WHERE 子句中的条件,然后取得这些记录的其他字段的值。所有的 MySQL 数据类型都支持索引。

虽然在可能用于查询的所有字段上都建立索引的做法是非常诱人的,但是不必要的索引既浪费存储空间,同时也浪费了MySQL 决定用哪个索引的时间。索引也会增加 insert、update、delete 等更新操作的开销,因为每个索引都必须更新。你必须找到恰当的平衡点使用最理想的索引集合来实现快速的查询。

MySQL 如何使用索引

索引被用于快速查找特定的列值对应的记录。没有索引,MySQL 就必须得从表的第一行开始,然后读取整张表才能找到符合条件的记录。表越大,花费的时间就越多。如果表里有一个正好适合查询情况的索引,MySQL 就可以快速在表中确定对应的位置而不需要搜索所有数据。这比连续读取每一行要快不少。

绝大多数MySQL 索引(PRIMARY KEY,UNIQUE ,INDEX  和 FULLTEXT)都以 B 树的形式存储。例外的情况:空间数据类型(spatial data type)的索引使用 R 树,MEMORY 存储引擎也支持 hash 索引。InnoDB 使用倒排表(inverted lists)来实现 FULLTEXT 索引

下面的讨论描述了索引使用的一般情况。关于 hash 索引的具体特征请移步至:https://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html (未来我会对该章进行单独翻译,并会更新此处的连接)

MySQL 会在以下操作中使用索引:

1、用于快速找到匹配 WHERE 子句的记录。

2、用于缩小数据检索范围。如果有多个索引可供选择,MySQL normally uses the index that finds the smallest number of rows (the most selective index). MySQL 通常会使用可以找到最小记录数的索引(最具选择性的索引)。

3、如果表有一个复合索引,那么索引中任何最左侧的前缀都可以被优化器使用。例如,如果你有一个三列复合索引如(col1, col2, col3) ,那么你有三种索引搜索的可选方案:(col1)、(col1,col2)、以及(col1,col2, col3)。

4、当执行连接查询时取得其他表中的记录,如果索引字段声明了同样的类型和大小,那么 MySQL 会更有效地利用该列上的索引。在这种语境下,VARCHAR 和 CHAR 如果大小一致,那么就可以认为是同种类型。例如, VARCHAR(10) 和 CHAR(10) 具有相同的大小,但是 VARCHAR(10) 和 CHAR(15) 就不是了。

对于比较非二进制字符串列值,两个列必须具有相同的字符集。例如,比较 utf8 的字段和 latin1 的字段就会影响到使用索引。

比较不同类型的字段(如字符串和时间类型或数值类型等),如果两个值不经过转换就无法直接比较的话,那么同样会无法使用索引。有一个给定的数值类型 1 ,可能会与'1','  1','00001' 或 '01.e1' 这样的字符串比较。那么这种情况就无法使用任何索引。

5、To find the MIN() or MAX() value for a specific indexed column key_col. This is optimized by a preprocessor that checks whether you are using WHERE key_part_N = constant on all key parts that occur before key_col in the index. In this case, MySQL does a single key lookup for each MIN() or MAX()expression and replaces it with a constant. If all expressions are replaced with constants, the query returns at once. For example: 

SELECT MIN(key_part2),MAX(key_part2)FROM tbl_name WHERE key_part1=10;

(上面这段话我没有理解官方文档的意思,有能翻译的同学帮忙评论区留个言!非常感谢)

6、用于排序或分组已经使用索引的左前缀排好序或分好组的表(例如,ORDER BY key_part1, key_part2)。如果所有字段都使用 DESC ,那么索引就会以相反的顺序读取。

7、有些情况,优化器可以优化查询,不需要访问原始记录,就可以获取数据。(可以获取全部查询必要信息的索引叫做覆盖索引)如果查询列表只查询了那些包含在索引中的字段,那么查询的值可以以更快的速度从索引树中获取:

SELECT key_part3 FROM tbl_nameWHERE key_part1=1

索引对于小表不那么重要,对于那些需要查询绝大多数行或全部行的大表也不那么重要。如果查询需要访问绝大多数记录,那么按序读取会比使用索引更快。连续的读取可以最小化磁盘搜索,即使并不是所有记录都需要查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 优化 —— EXPLAIN 执行计划详解

引言 本博客大部分内容翻译自MySQL 官网 Understanding the Query Execution Plan 专题。另外有一些补充,则来自于网课以及《高性能MySQL(第三版)》。 根据我们的表、字段、索引、以及 where 子句中的条件等信息,MySQL 优化器会…

Git 初学札记(十)—— Reset 回退的三种状态解析

引言 工作中经常会涉及到需要本地代码覆盖更新的操作。有时候可能是从远端git 上直接覆盖更新,或者是其他本地分支覆盖更新当前分支等等。这个时候就需要用到 reset 操作。 reset 操作分为三种类型:Soft、Mixed、Hard。今天我们就来说说这三种类型究竟…

MySQL 高级 —— 深入理解 InnoDB 与 MyISAM

引言 在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录下创建一个与表同名的.frm文件保存表的定义。因为MySQL使用文件系统的目录和文件来保存数据库和表的定义…

Ts声明ElementUI控件

初用Ts&#xff0c;有时候想获取三方控件不太会声明类型&#xff0c;记录一下使用InstanceType导入类型 例如声明一个el-select <el-form-item label"类型:" prop"year" :loading"state.loading"><el-select v-model"props.ruleF…

关于 OutOfMemoryError 的总结与解决方法

引言 本文总结自周志明的《深入理解Java虚拟机》第二章部分内容。 这部分内容&#xff0c;可以为后续性能调优方面的工作起到铺垫作用。 一、什么是 OutOfMemoryError OurOfMemory 简称“OOM”&#xff0c; 直译为“内存耗尽”或“内存溢出”&#xff0c;当然&#xff0c;并…

Windows误关闭资源管理器重启的办法

引言 有时候Windows系统在开机后&#xff0c;在桌面底部的任务栏中无法正常加载必要的网络连接图标或音量图标等&#xff0c;导致无法手动操作音量或连接网络。这时候就会需要打开“任务管理器”重新启动“资源管理器”使其重新加载这些必要的控制图标。 但是由于操作失误&am…

MySQL高级 —— 高性能索引

引言 最近一直在抱着《高性能MySQL&#xff08;第三版&#xff09;》研究MySQL相关热点问题&#xff0c;诸如索引、查询优化等&#xff0c;这阶段的学习是前一段时间MySQL基础与官方的“阅读理解”的进一步延伸。 书中第五章详细阐述了如何设计高性能的索引&#xff0c;以及索…

MySQL高级 —— 查询性能优化

引言 承接《MySQL高级 —— 高性能索引》&#xff0c;本篇博客将围绕《高性能MySQL&#xff08;第三版&#xff09;》第六章内容进行总结和概括。 与索引的部分一样&#xff0c;SQL优化也是广大程序员深入MySQL的又一条必经之路。希望通过本篇博客的总结&#xff0c;能够为我…

哈希表的大小为何最好是素数

引言 为什么散列函数采用取模运算&#xff1f;又为什么取模运算的被取模数最好是素数&#xff1f;素数是如何在取模运算中很好的规避冲突的&#xff1f; 这些问题可能困扰诸多程序员很久了。我们总是说素数可以更好的避免冲突&#xff0c;但总是对各种长篇大论的分析望而却步…

Java常用设计模式————适配器模式

引言 由于无法直接使用某个类中的方法而采取的一种中间类转换的策略。将一个类的接口转换成另一个接口&#xff0c;让原本接口不兼容的类可以兼容。 适配器模式可以分为三种&#xff1a;类适配器、对象适配器、接口适配器。它们之间的区别主要体现在适配器角色与被适配角色之…

Java常用设计模式————桥接模式

引言 在实际的业务中&#xff0c;经常会遇到多维度的概念组合&#xff0c;公园的门票&#xff0c;颐和园有年票、月票、日票&#xff0c;故宫也有年票、月票、日票。那么不同的公园和票种类型就可以视为两种不同的纬度&#xff0c;它们之间会形成相互组合的关系。 在类的设计…

Java常用设计模式————装饰者模式

引言 装饰者模式&#xff0c;又叫装饰器模式。它可以动态的将新功能附加到对象上。在对象功能扩展方面&#xff0c;它比继承更灵活&#xff0c;同时装饰者模式也体现了OCP原则。 在客户端调用使用了装饰者模式的对象时&#xff0c;就好像在使用构造器层层包裹核心对象&#x…

Java常用设计模式————组合模式

引言 组合模式&#xff0c;是一种类似递归算法的结构性设计模式&#xff0c;通过以简单的 List &#xff0c;组合本类对象&#xff0c;实现树状对象结构的“部分、整体”的层次。 它可以让调用程序不需要关心复杂对象与简单对象的区别&#xff0c;而统一地实现处理逻辑。 对…

MySQL 高级 —— MVCC 多版本并发控制

引言 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑&#xff0c;它们一般都同时实现了多版本并发控制——MVCC。包括其他数据库如Oracle等&#xff0c;由于MVCC并没有一个统一的实现标准&#xff0c;因此它们的实现原理都不尽相同。 MVCC简介…

Java常用设计模式————外观模式

引言 外观模式&#xff08;Facade Pattern&#xff09;&#xff0c;又叫“过程模式”。外观模式为子系统中的一组接口提供一个一致的入口&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一组子系统更加易用。 一、案例分析 生活中有很多类似的案例&#xf…

Java常用设计模式————享元模式

引言 享元模式&#xff0c;也叫蝇量模式&#xff08;Flyweight Pattern&#xff09;。运用共享技术有效地支持大量细粒度的对象。 享元模式常用于系统底层开发&#xff0c;解决系统的性能问题。例如数据库连接池&#xff0c;里面都是创建好的连接对象&#xff0c;在这些连接对…

IDEA——常用基础设置

一、设置入口 File—>Settings... 或者 在工具栏的“小扳手”图标。 二、主题设置 三、编辑通用设置 设置面板中的 Editor 3.1 自动导包 可以设置IDEA自动为程序导包&#xff0c;在书写时加入准确的导包&#xff0c;在书写时优化导包&#xff08;自动去掉未使用的&#…

IDEA——常用快捷键

引言 总结 IDEA 的常用快捷键&#xff0c;除了部分快捷键与 Eclipse 保持一致之外&#xff0c;枚举更多的实用快捷键。 一、如何设置快捷键 在 Settings -> Keymap 中&#xff0c;下拉框里选择 Eclipse &#xff0c;即可将 IDEA 的快捷键设置为与 Eclipse 保持一致。但并…

IDEA——常用代码模板

引言 IDEA 提供了一些内置的代码模板&#xff0c;可以让开发者快速方便的使用&#xff0c;当然 eclipse 中也是有的&#xff0c;比如输入 syso 快速生成输出语句&#xff0c;main 快速生成主函数等。 idea 的模板设置都在 Settings --> Live Templates 和 General-->Po…

IDEA——Git 的设置与使用

引言 在本机下载好 Git 之后&#xff0c;再去在 IDEA 中设置 Git 相关的参数。详细的 Git 操作和 Eclipse 大同小异&#xff0c;可以移步至&#xff1a;《Git必知必会》 一、设置Git执行程序路径 二、导入一个新的远程 git 托管项目 打开 File ——> New ——> Project…