我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql-查询性能优化

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql-查询性能优化

mysql-查询性能优化

不要取出全部列,取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。应该严格禁止SELECT * 的写法。MySQL使用如下三种方式应用WHERE条件,从好到坏依次为:

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

  1.2 使用索引覆盖扫描(Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在MySQL服务器层完成的,但无须在回表查询记录。

  1.3 从数据表中返回数据,然后过滤不满足条件的记录(在Extra列中出现Using Where)。这在MySQL服务器层完成,MySQL需要先从数据表独处记录然后过滤。

上面的例子说明了好的索引很重要。

如果发现查询需要扫描大量的数据但值返回少数的行,那么可以尝试下面的技巧优化它:

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

  2.2 改变库表结构。例如使用单独的汇总表。

  2.3 重写这个复杂的查询,让MySQL优化器能够以更优化的方式执行这个查询。

重构查询:

  1、一个复杂查询还是多个简单查询;

  2、切分查询;

  例如:

DELECT FROM message WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH);

改成:

rows_affected=0
do{
    rows_affected=do_query(
        "DELECT FROM message WHERE create created < DATE_SUB(NOW(),INTERVAL 3 MONTH) LIMIT 10000"
    )
} while rows_affected > 0

  一次删除一万行数据一般来说比较高效,如果每次删除数据后,都暂停一会儿再做下一次删除,这样也可以将服务器上原本一次性的压力分散到一个很长的时间段中,可以大大的减少对服务器的影响

  3、分解关联查询

查询优化处理

  查询优化处理包括多个子阶段:解析SQL、预处理、优化SQL执行计划。这个过程中的任何错误(例如语法错误)都可能终止查询。

  优化策略可以简单的分为两种:

  1、静态优化:直接对解析树进行分析,并完成优化

  2、动态优化:动态优化跟查询上下文有关,也可能和很多其他因素有关,例如WHERE条件中的取值、索引中条目对应的数据行数等。

  MySQL能够处理的优化类型:

  • 重新定义关联表的顺序。
  • 将外连接转化成内连接。
  • 使用等价变换规则。
  • 优化COUNT()、MIN()和MAX()。
  • 预估并转化为常数表达式
  • 覆盖索引扫描
  • 子查询优化
  • 提前终止查询
  • 等值传播
  • 列表IN()的比较

  怎么查看优化器重写后的SQL?

  用到了explain extended和showwarnings

  用ORDER BY排序,如果查询中有LIMIT的话,LIMT也会在排序之后应用,所以即使需要返回较少的数据,历史表和需要排序的数据量仍然会非常大。MySQL5.6在这里做了很多重要的改进。当只需要返回部分排序结果的时候,例如使用LIMIT子句,MySQL不再对所有的结果进行排序,而是根据实际情况,选择抛弃不满足条件的结果,然后再进行排序。

参考:

[1]Baron Schwartz等 著,宁海元等 译 ;《高性能MySQL》(第3版); 电子工业出版社 ,2013

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql-查询性能优化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql-查询性能优化

1、不要取出全部列,取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。应该严格禁止SELECT * 的写法。MySQL使用如下三种方式应用WHERE条件,从好到坏依次为:  1.1 在索引中使用WHERE条件
mysql-查询性能优化
2021-02-18

SQL查询优化-MySQL 性能调优

  在进行库表结构设计时,我们要考虑到以后的查询要如何的使用这些表,同样,编写 SQL 语句的时候也要考虑到如何使用到目前已经存在的索引,或是如何增加新的索引才能提高查询的性能。  想要对存在性能问题的查询进行优化,需要能够找到这些查询,下面先看下如何获取有性能问题的SQL。  如何设计最优的数据库表结构,如何建立最好
SQL查询优化-MySQL 性能调优
2024-04-18

如何优化MySQL的查询性能?

如何优化MySQL的查询性能?MySQL是一款广泛应用于Web开发的关系型数据库管理系统。然而,在处理大量数据和复杂查询时,MySQL的查询性能可能会受到影响,从而导致应用程序的响应时间变慢。为了提高MySQL的查询性能,我们可以采取以下几
2023-10-22

MySQL查询性能优化索引下推

目录前言1. 索引下推的作用2. 案例实践3. 索引下推配置4. 索引下推原理剖析5. 索引下推应用范围前言前面已经讲了mysql的其他查询性能优化方式,没看过可以去了解一下:MySQL查询性能优化七种方式索引潜水MySQL查询性能优
2022-08-16

MySQL高性能索引策略和查询性能优化

前缀索引和索引选择性有时候需要索引很长的字符,这会让索引变得大且慢。一个策略是模拟哈希索引。通常可以索引开始的部分字符,这样可以大大解约索引空间,提高索引效率。但这样会降低索引的选择性。索引的选择性:不重复的索引值(也成为基数)和数据表的记录总数比值。索引的选
MySQL高性能索引策略和查询性能优化
2017-05-17

MySQL 索引优化与查询性能提升

MySQL 索引的优化是提升数据库查询性能的重要手段。通过合理设计索引、优化查询条件以及采取适当的优化策略,可以显著提高 MySQL 数据库的查询效率和整体性能。

MySQL数据库查询性能优化策略

优化查询使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。 通过对查询语句的分析,可以了解查询语句的执行情况,找出查询语句执行的瓶颈,从而优化查询
2022-05-25

如何优化 PHP 中的 MySQL 查询性能?

可以通过以下方式优化 mysql 查询性能:建立索引,将查找时间从线性复杂度降至对数复杂度。使用 prepared statements,防止 sql 注入并提高查询性能。限制查询结果,减少服务器处理的数据量。优化连接查询,包括使用适当的连
如何优化 PHP 中的 MySQL 查询性能?
2024-05-11

MySQL查询性能优化的实战技巧

MySQL查询性能优化是一个复杂的过程,涉及到多个方面。以下是一些实战技巧,可以帮助你提高MySQL查询的性能:使用索引:索引是提高查询性能的关键。确保在经常用于查询的列上创建索引,并且索引应该是有意义的,即索引列应该是有序的。同时,要注意
MySQL查询性能优化的实战技巧
2024-10-21

mysql查询性能优化的方法是什么

MySQL查询性能优化的方法包括以下几种:创建合适的索引:通过在查询中使用索引,可以大大提高查询的性能。确保在查询中使用最适合的索引类型,避免全表扫描。优化查询语句:避免使用SELECT *,只选择需要的列;使用JOIN语句代替子查询;避免
mysql查询性能优化的方法是什么
2024-05-14

mysql优化——查询优化

这一篇mysql优化是注重于查询优化,根据mysql的执行情况,判断mysql什么时候需要优化,关于数据库开始阶段的数据库逻辑、物理结构的设计结构优化不是本文重点,下次再谈。 查看mysql语句的执行情况,判断是否需要进行优化 当感觉操作数据库查询语句速度
mysql优化——查询优化
2016-09-05

mysql查询优化

select * from a where id in (select id from b)等价于:for select id from bfor select 8 from a where a.id = b.id当b表数据必须小于a表数据时,in优于exis
mysql查询优化
2022-02-02

MySQL查询性能优化武器之链路追踪

目录前言1. 查看optimizer trace配置2. 开启optimizer trace3. 线上问题复现3. 使用optimizer trace前言mysql优化器可以生成Explain执行计划,我们可以通过执行计划查看是否使用了索
2022-08-08

编程热搜

目录