《高性能MYSQL》-- 查询性能优化

这篇具有很好参考价值的文章主要介绍了《高性能MYSQL》-- 查询性能优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

查询性能优化

深刻地理解MySQL如何真正地执行查询,并明白高效和低效的原因何在

为什么查询速度会慢

查询的生命周期(不完整):从客户端到服务器,然后服务器上进行语法解析,生成执行计划,执行,并给客户端返回结果。

慢查询基础:优化数据访问

一条查询,如果查询得很慢,原因大概率是访问的数据太多

对于低效的查询,通过下面两个步骤来分析总是很有效:

1. 确认应用程序是否在检索大量且不必要的数据。这通常意味着访问了多的行,但有时候也可能是访问了太多的列。

2. 确认MySQL服务器层是否在分析大量不需要的数据行。

一些导致慢查询的操作:

  1. 查询了不需要的记录
  2. 多表联接时返回全部列
  3. 总是取出全部列
  4. 重复查询相同的数据

MySQL最简单的衡量查询开销的三个指标如下:

● 响应时间
● 扫描的行数
● 返回的行数

如何判断慢查询

1.判断响应时间
概念

响应时间其实有两部分:服务时间和排队时间。服务时间是指数据库处理这个查询真正花了多长时间。排队时间是指服务器因为等待某些资源而没有真正执行查询的时间——可能是等I/O操作完成,也可能是等待行锁,等等。

影响响应时间的因素:

存储引擎的锁 (表锁、行锁)、高并发资源竞争、硬件响应等

快速上限估计法:

用来估计响应时间,了解这个查询需要哪些索引以及它的执行计划是么,然后计算大概需要多少个顺序和随机I/O,再用其乘 以在具体硬件条件下一次I/O的消耗时间。最后把这些消耗都加起来,就可以获得一个大概参考值来判断当前响应时间是不是一个合理的值。

2.扫描的行数和返回的行数比例

理想情况下扫描的行数和返回的行数应该是相同的,这种情况不多。

扫描的行数与返 回的行数的比率通常很低,一般在1:1到10:1之间。

3.扫描的行数和访问类型

EXPLAIN语句中的type列反映了访问类型。访问类型有很多种,从全表扫描到索引扫描、 范围扫描、唯一索引查询、常数引用等。这里列出的这些,速度从慢到快,扫描的行数从 多到少。不需要记住这些访问类型,但需要明白扫描表、扫描索引、范围访问和单值访问的概念。

4.MySQL能够使用如下三种方式应用WHERE条件,从好到坏依次为:

● 在索引中使用WHERE条件来过滤不匹配的记录。这是在存储引擎层完成的。

● 使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。

● 从数据表中返回数据,然后过滤不满足条件的记录

(在Extra列中出现Using

5.如果发现查询需要扫描大量的数据但只返回少数行,要这样改进

● 使用覆盖索引,把所有需要用的列都放到索引中,这样存储引擎无须回表获取对应行就可以返回结果了

● 改变库表结构。例如,使用单独的汇总表(这是我们在第6章中讨论的办法)。

● 重写这个复杂的查询,让MySQL优化器能够以更优化的方式执行这个查询(这是本章后续需要讨论的问题)。

重构查询的方式

一个复杂查询还是多个简单查询

MySQL从设计上让连接和断开连接都很轻量,在返回一个小的查询结果方面很高效。现代的网络速度比以前要快很多,能在很大程 度上降低延迟。

在某些版本的MySQL中,即使在一台通用服务器上,也能够运行每秒超

过10万次的简单查询,即使是一个千兆网卡也能轻松满足每秒超过2000次的查询。

所以运行多个小查询现在已经不是大问题了。

在MySQL内部,每秒能够扫描内存中上百万行的数据

在其他条件都相同的时候,使用尽可能少的查询当然是更好的。但是有时候,将一个大查询分解为多个小查询是很有必要的。

切分查询

定期清除大量数据时,如果用一个大的语句一次性完 成的话,则可能需要一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小

的但重要的查询。将一个大的DELETE语句切分成多个较小的查询可以尽可能小地影响MySQL的性能,同时还可以降低MySQL复制的延迟。

分解联接查询

用分解联接查询的方式重构查询有如下优势:

  1. 让缓存的效率更高
  2. 将查询分解后,执行单个查询可以减少锁的竞争
  3. 查询本身的效率也可能会有所提升。比如使用IN()代替联接查询,可以让MySQL按照ID顺序进行查询,这可能比随机的联接要更高效。
  4. 可以减少对冗余记录的访问

查询执行的基础

MySQL执行一个查询的过程

1. 客户端给服务器发送一条SQL查询语句。

2. 服务器端进行SQL语句解析、预处理,再由优化器生成对应的执行计划。

3. MySQL根据优化器生成的执行计划,调用存储引擎的API来执行询。

4. 将结果返回给客户端

《高性能MYSQL》-- 查询性能优化,mysql,性能优化,数据库

MySQL的客户端/服务器通信协议

概念

MySQL的客户端和服务器之间的通信协议是“半双工”的,这意味着,在任 何时刻,要么是由服务器向客户端发送数据,要么是由客户端向服务器发送数据,这两个动作不能同时发生。

理解

这样设计的好处是让MYSQL通信十分简单快速,缺点是一旦一端开始发送消息,另一端要接收完整个消息才能响应它。

缓存

多数连接MySQL的库函数都可以获得全部结果集并将结果缓存到内存里,还可以逐行获 取需要的数据。默认一般是获得全部结果集并将它们缓存到内存中。

MySQL通常需要等所有的数据都已经发送给客户端才能释放这条查询所占用的资源,所以接收全部结果并缓存通常可以减少服务器的压力,让查询能够早点结束、早点释放相应的资源。

查询状态

对于一个MySQL连接,或者一个线程,任何时刻都有一个状态,该状态表示了MySQL当 前正在做什么。有很多种方式能查看当前的状态,最简单的是使用SHOW FULL PROCESSLIST命令(该命令返回结果中的Command列,其就表示当前的状态)。

Sleep

线程正在等待客户端发送新的请求。

Query

线程正在执行查询或者正在将结果发送给客户端。

Locked

在MySQL服务器层,该线程正在等待表锁。在存储引擎级别实现的锁,例如InnoDB 的行锁,并不会体现在线程状态中。

Analyzing and statistics

线程正在检查存储引擎的统计信息,并优化查询。

Copying to tmp table [on disk]

线程正在执行查询,并且将其结果集复制到一个临时表中,这种状态一般要么是在做 GROUP BY操作,要么是在进行文件排序操作,或者是在进行UNION操作。如果这 个状态后面还有“on disk”标记,那表示MySQL正在将一个内存临时表放到磁盘上。

Sorting result

线程正在对结果集进行排序。

了解这些状态的基本含义非常有用,这可以让你很快地了解当前“谁正在持球”。在一个繁 忙的服务器上,可能会看到大量的不正常的状态,例如,statistics正占用大量的时间。这 通常表示,某个地方有异常了。

MySQL如何对查询进行优化

语法解析器和预处理

MySQL通过关键字将SQL语句进行解析,并生成一棵对应的“解析树,MySQL解析器将进行MySQL语法规则验证和解析查询。它将验证是否使用了错误的关键字,使用关键字的顺序是否正确,或者它还会验证引号是否能前后正确匹配。

预处理器检查生成的解析树,以查找解析器无法解析的其他语义,例如,检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义。

下一步预处理器会验证权限。这通常很快,除非服务器上有非常多的权限配置。

此时解析树是合法的了,然后,查询优化器将解析树转化成查询执行计划

查询优化器

查询优化器会为一个查询找到最好的执行方式.

用什么来衡量"最好"呢?

MySQL使用基于成本的优化器,它将尝试预测一个查询使用某种执行计划时的成本,并

选择其中成本最小的一个。

优化器在评估成本的 时候主要考虑每个表或者索引的页面个数、索引的基 数(索引中不同值的数量)、索引和数据行的长度、索引分布情况。并不考虑任何层面的缓存带来的影响,它假设读取任何数据都需要一次磁盘I/O。文章来源地址https://www.toymoban.com/news/detail-838337.html

到了这里,关于《高性能MYSQL》-- 查询性能优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 读高性能MySQL(第4版)笔记12_查询性能优化(下)

    读高性能MySQL(第4版)笔记12_查询性能优化(下)

    2.3.1.1. 读取行指针和需要排序的字段,对其进行排序,然后再根据排序结果读取所需要的数据行 2.3.1.2. 即需要从数据表中读取两次数据,第二次读取数据的时候,因为是读取排序列进行排序后的所有记录,这会产生大量的随机I/O,所以两次传输排序的成本非常高 2.3.2.1. 先

    2024年02月08日
    浏览(9)
  • 高性能MySQL实战(三):性能优化

    大家好,我是 方圆 。这篇主要介绍对慢 SQL 优化的一些手段,而在讲解具体的优化措施之前,我想先对 EXPLAIN 进行介绍,它是我们在分析查询时必要的操作,理解了它输出结果的内容更有利于我们优化 SQL。为了方便大家的阅读,在下文中规定类似 key1 的表示二级索引,key_

    2024年02月11日
    浏览(46)
  • MySQL高性能优化规范建议

    数据库命令规范 数据库基本设计规范 1. 所有表必须使用 Innodb 存储引擎 2. 数据库和表的字符集统一使用 UTF8 3. 所有表和字段都需要添加注释 4. 尽量控制单表数据量的大小,建议控制在 500 万以内。 5. 谨慎使用 MySQL 分区表 6.尽量做到冷热数据分离,减小表的宽度 7. 禁止在表中建

    2024年02月12日
    浏览(9)
  • 高性能服务器Nodejs操作Mysql数据库

    高性能服务器Nodejs操作Mysql数据库

    数据库和身份认证 配置 mysql 模块 安装 mysql 模块 建立连接 测试是否正常工作 1.2 操作 mysql 数据库 查询数据 插入数据 向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据: 更新数据 快捷方式: 删除数据 使用 delete 语句

    2024年02月11日
    浏览(17)
  • 读高性能MySQL(第4版)笔记07_优化数据类型(下)

    读高性能MySQL(第4版)笔记07_优化数据类型(下)

    2.3.1.1. 与UNIX时间戳相同 2.3.2.1. 会遇到2038年的问题 2.3.2.1.1. 使用带符号的32位INT,可以表达直到2038年的时间 2.3.2.1.2. 使用无符号的32位INT,可以表达直到2106年的时间 2.3.2.1.3. 使用64位,还可以超出这些范围 2.3.3.1. MySQL服务器、操作系统和客户端连接都有时区设置 2.3.3.2. 存

    2024年02月09日
    浏览(12)
  • 读高性能MySQL(第4版)笔记06_优化数据类型(上)

    读高性能MySQL(第4版)笔记06_优化数据类型(上)

    3.2.2.1. 字符集和排序规则(collation)使字符型数据的比较更复杂 3.2.2.2. 应该将日期和时间存储为MySQL的内置类型而不是字符串类型 3.2.2.3. 应该用整型数据存储IP地址 4.1.1.1. 使用8、16、24、32和64位存储空间 5.2.4.1. VARCHAR(1000)的列则需要1002个字节,因为需要2字节存储长度

    2024年02月09日
    浏览(10)
  • 读高性能MySQL(第4版)笔记05_优化服务器设置

    读高性能MySQL(第4版)笔记05_优化服务器设置

    2.1.3.1. MySQL只需要少量的内存就能保持一个连接(通常是一个相关的专用线程)打开 2.2.1.1. InnoDB缓冲池大小 2.2.1.2. 需要的内存比其他任何组件都多 2.2.1.3. 不仅缓存索引,还缓存行数据、自适应哈希索引、更改缓冲区、锁和其他内部结构等 2.2.1.4. InnoDB严重依赖缓冲池,应

    2024年02月09日
    浏览(17)
  • 读高性能MySQL(第4版)笔记04_操作系统和硬件优化

    读高性能MySQL(第4版)笔记04_操作系统和硬件优化

    4.9.2.1. 允许在内存中更改页面,而不用将更改刷新到磁盘,这通常涉及随机I/O,速度非常慢 4.9.2.2. 将更改的记录写入顺序日志文件,这样要快得多 4.9.2.3. 后台线程可以稍后将修改过的页面刷新到磁盘,这样做可以优化写操作的性能 5.11.2.1. 只有进行特殊的擦除操作之后,

    2024年02月09日
    浏览(15)
  • 《高性能MySQL》——创建高性能的索引(笔记)

    《高性能MySQL》——创建高性能的索引(笔记)

    索引(在MySQL中也叫做“键(key)”) 是存储引擎用于快速找到记录的一种数据结构。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。 在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时

    2024年02月07日
    浏览(41)
  • 【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

    【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

    QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化 简介 本文介绍了QT模型视图代理框架中的QT表格控件和QT数据库模块中的QT数据库查询模型结合使用的一个应用实践案例:QT高性能表格控件分页展示千万行数据。本文介绍了这个应用实践案例的运行效果

    2024年02月14日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包