MySQL 优化 —— SQL优化概述(优化专题开篇词)

引言

最近为了研究索引的知识,特地去MySQL 官网研读了一番,发现MySQL官网有比较全面的MySQL优化方案和知识背景,所以希望通过一系列文章,将官网的知识翻译总结一下,避免日后去网上胡乱搜索产生不必要的知识勘误风险。

本系列文章标题都会以 “MySQL 优化” 前缀开头,有些可能是翻译,也会有少量自己的总结和试验,针对 MySQL 5.7 版本进行。当然也并不会全部将官网的优化专题翻译完,可能会挑选我自己认为比较重点的部分进行翻译和总结。

我的翻译文章大多数都没有精推细敲的进行翻译,可能有人会比较失望,但考虑到我的工作状态和时间不允许我过度的专注于翻译工作,不过我依然会秉承最质朴的求真精神,把翻译工作做好。同时,为了避免个人英语水平对原文知识的误读,我会在每篇翻译文章的引言部分贴出原文的 URL 方便他人去查阅和对比阅读增加知识的准确性同时我更希望能有人站出来指正我的错别字和翻译问题

再次强调一下我的翻译风格,并不是精推细敲型,会以一种比较松散但并不丢失原意的方式来翻译MySQL官方文档。如下是我的翻译示例:

原文:To make a slow SELECT ... WHERE query faster, the first thing to check is whether you can add an index.

我的翻译:为了让一个 SELECT ... WHERE 执行的更快,第一件需要考虑的事情就是——我们是否可以为其建立索引。

这就是——“比较松散,但无伤原意”,希望大家多多指正。

以下部分翻译自MySQL官网:https://dev.mysql.com/doc/refman/5.7/en/select-optimization.html

SQL优化需要考虑的方面

查询,以 SELECT 子句的形式,执行着对数据库的全部查找操作。调试这些语句是优先级最高的,不论是在动态web页面实现次秒级别的响应,还是缩短生成大量夜间报告的时间,都是如此。

除了 SELECT 语句,这些用于查询性能优化的调试技术同样会应用于构建诸如 CREATE TABLE... AS SELECT, INSERT INTO ...SELECT, 和 DELETE 语句中的 WHERE 子句等。这些语句需要额外的性能考虑,这是因为他们结合了写和读的操作。

最主要的性能优化考虑有如下这些:

1、为了让一个 SELECT ... WHERE 执行的更快,第一件需要考虑的事情就是——我们是否可以为其建立索引。给 WHERE 子句中的字段建立索引,以此来加速求值、过滤以及对结果集进行的最终检索。为了避免浪费磁盘空间,构建一个“小集合”式的复合索引来加速许多相关的查询。(博主:意思是复合索引不仅可以减少对磁盘空间的过度占用,同时也可以支持许多相关的查询,因此,不要创建太多的单一索引,可以用复合索引的地方,要优先考虑复合索引)

索引在涉及使用诸如 join 和 外键等的多表查询时尤其重要。你可以使用 EXPLAIN 语句来判断在 SELECT 中究竟用到了哪种索引。

2、单独调试非常耗时的查询的每一个部分,如MySQL函数调用等。一个函数可以被结果集中的每条记录执行一遍,也可以被表表中的每条记录执行一遍,这取决于查询的结构,即我们如何构建我们的查询语句。

3、尽量减少查询中全表扫描的次数,特别是大表。

4、定期使用 ANALYZE TABLE 语句来进行表统计,这样SQL优化器才可以有更多的信息来构建有效的执行计划。

5、学习调试技术,索引技术,和配置参数,它们都是特定于每张表的存储引擎的。InnoDB和MyISAM 都有一系列的教程来使我们的查询保持更高的性能。

6、调整MySQL用于缓存的内存区域大小和配置。以有效的方式使用 InnoDB buffer pool,MyISAM key cache,和 MySQL 查询缓存,重复的查询之所以会运行的更快,是因为第二次之后都是从内存中获取数据的。

7、即便是使用内存作为缓存的查询,你可能依然需要更深入的优化以便使它们需要更少的缓存内存,让你的应用程序具备更好的可扩展性。可扩展性意味着你的应用程序可以处理更多同时访问的用户,更大的请求量,而不会产生比较大的性能落差。

8、处理锁的相关问题。在你的查询速度可能会被其他同时访问表的 session 影响到的地方处理锁的问题。

我的总结

总的来说,本篇概述的翻译工作还算顺利,当然非常感谢有道词典对我的帮助,越到后面的部分,翻译工作越顺利,查词典的次数也越来越少。不得不说多看英文文档对自己的提升也是很大的,不仅可以获得最权威的技术解读,同时对英语阅读也有很大帮助。

针对上面的 8 个方面,我个人认为比较重要的是其中的第 1、5,其中第一条应该是占据程序员优化的大部分工作,因此我会对这一专题进行着重翻译和总结,其他的部分我也会根据情况和实际工作中的需要(开发方面,非专业DBA)酌情处理,希望大家可以给予更多的意见和建议。

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

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

相关文章

MySQL 优化 —— WHERE 子句优化

引言 本文翻译自 MySQL 官网:WHERE Clause Optimization WHERE 子句优化 这一部分我们来讨论对 WHERE 子句的优化处理。本部分的案例都是以 SELECT 语句为例,但这些优化同样适用于 DELETE 和 UPDATE 语句中的 WHERE 子句。 注意 因为对 MySQL 优化器的…

MySQL 优化 —— IS NULL 优化

引言 本博客翻译自 MySQL 官网:IS NULL Optimization, MySQL版本 5.7。 MySQL 对 IS NULL 的优化 MySQL 可以对 IS NULL 执行和常量等值判断(列名 常量表达式,如name Tom)相同的优化。MySQL 可以利用索引和范围来…

MySQL 优化 —— ORDER BY 优化

引言 本文翻译自MySQL 官网:ORDER BY Optimization,MySQL 版本:5.7。 这一部分描述了MySQL何时会使用索引来满足order by子句,filesort 操作会在索引不能生效的时候被用到,以及优化器对order by的执行计划信息。 or…

MySQL 高级 —— 索引实现的思考

引言 最近看了一个公开课,是有关MySQL对索引设计的思考。详细讲解了几种索引实现的设计思考与利弊辨析,讨论了为什么MySQL默认情况下会使用B树索引,B树索引又对B树做了哪些结构改进。 本片博客通过个人的学习理解和总结,由几种简…

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

引言 本文翻译自MySQL 官网 :How MySQL Uses Indexes ,MySQL 版本 5.7 。 提升 SELECT 操作性能最好的方式就是在查询的一列或多列上建立索引。索引的行为类似指向表数据的指针,可以让查询能够快速判断哪个记录满足 WHERE 子句中的条件&…

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…