MYSQL查询性能优化

查询的基础知识

MySQL查询过程如下图所示:

MySQL是通过查询语句的哈希查找来命中缓存的,需要注意的是如果查询语句大小写不一致或者有多余的空格,是不会命中缓存的。

一个查询通常有很多执行方式,查询优化器通过计算开销(随机读取次数)来选择最优的查询。

MySQL把所以的查询都当做联接来处理,联接是按照循环嵌套的策略来执行的,如下图所示:

查询的优化和限制

我们需要知道查询优化器会做哪些优化,这样在写查询的时候就可以不需要考虑手动来做这些优化,把这些事情交给查询优化器去做是更好的选择,查询优化器的优化类型如下:

1. 联接优化

(1)对联接中的表重新排序

(2)将外联接转换为内联接

2.  排序优化

(1)使用索引排序

(2)内存快速排序

(3)文件排序

3. 优化COUNT()

(1)没有Where子句的COUNT(*):记录表的行数

(2)COUNT(column) 统计column非NULL的行数,column不可能为NULL时,COUNT(column)优化为COUNT(*)

4. 优化IN()

(1)对IN()里面的数据排序,进行二分查找,对IN()子查询不会使用这种优化,如:

5. 代数等价优化

(1)简化并规范化代数表达式

(a<b AND b=c) AND a=5  =>  b>5 AND b=c AND a=5

6. 早期终结

早期终结是指一旦满足查询的条件,MySQL就会立即停止处理该查询。

(1)LIMIT

(2)不可能的查询条件

(3)取得唯一值或值不存在

7. 其它优化

(1)索引优化MIN()和MAX()

(2)覆盖索引

(3)相等传递

查询优化器优化时存在一定的限制,在这些查询优化器不能很好地优化的地方,需要我们手动进行优化:

(1)关联子查询。如IN()可能优化得很差,如下面是个不好的优化

(2)联合(UNION)。有时不能把UNION外的条件应用到内部

(3)索引合并。排序和合并的开销可能很大

(4)相等传递。大IN表导致较慢的优化

(5)并行执行。不能在多CPU并行执行一个查询

(6)对同一个表SELECT和UPDATE

写出高效的查询

查询效率低的原因:

(1)应用程序获取了超过需要的数据

(2)MySQL服务器分析了超过需要的行

重构查询的方式:

(1)复杂查询和多个查询的权衡。用尽可能少的查询做尽可能多的事情有时候是不对的。

(2)缩短查询,防止查询长时间占用表

(3)分解联接

写查询时考虑以下的优化方法:

1. 优化联接

(1)ON或USING使用的列上有索引

(2)GROUP BY或ORDER BY只引用一个表的列

2. 优化COUNT()

(1)总是使用COUNT(*)

(2)对索引的小部分进行统计

(3)保存统计结果

3. 优化LIMIT和OFFSET

在覆盖索引上进行偏移

4. 优化子查询

尽可能使用联接代替IN、EXISTS、NOT EXISTS

5. 优化联合

(1)始终使用UNION ALL

(2)条件下推到UNION

6. 优化GROUP BY和DISTINCT

(1)索引优化

(2)ORDER BY NULL跳过自动排序

以下是常用的查询优化提示:

时间: 2024-12-23 02:05:17

MYSQL查询性能优化的相关文章

170727、MySQL查询性能优化

MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下我们从数据库的索引和查询语句的设计两个角度介绍如何提高MySQL查询性能. 数据库索引 索引是存储引擎中用于快速找到记录的一种数据结构.索引有多种分类方式,按照存储方式可以分为:聚簇索引和非聚簇索引:按照数据的唯一性可以分为:唯一索引和非唯一索引:按照列个数可以分为:单列索引和多列索引等.索引也有多

《高性能MySQL》之MySQL查询性能优化

为什么查询会慢? 响应时间过长.如果把查询看做是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快. 查询的生命周期: 客户端->服务器->服务器上解析->生成执行计划->执行->返回结果给客户端. 其中”执行”包括大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序.分组等. 慢查询:优化数据访问 查询性能低下最基本的原因:访问的数据太多.

MySQL查询性能优化一则

公司有一套Web系统, 使用方反馈系统某些页面访问速度缓慢, 用户体验很差, 并且偶尔还会出现HTTP 502错误. 这是典型的服务器端IO阻塞引发的问题,通过对访问页面的程序逻辑进行跟踪,发现问题应该是出在某个SQL查询上. 在页面程序运行的某个步骤中,有这样一段SQL select distinct(server) from user_record where type = 'GD0001' user_record表中的数据大概有2000万条左右 , 字段type的值为GD0001的记录大概

mysql 查询性能优化第一章 为什么查询速度会慢

一 为什么查询速度会慢 在尝试编写快速的查询之前,咱们需要清楚一点,真正重要的是响应时间.如果把查询看成是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要有 优化查询,实际上要优化起子任务,要么消除其中一些子任务,要么减少子任务的执行次数,Mysql在执行查询的时候有哪些子任务,哪些子任务运行的速度很慢?这里还不好给出完 整的列表.一般来说,查询的生命周期大致可以按照顺序爱看:从客户端->服务器->然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中执行

mysql笔记03 查询性能优化

查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行的更快. 2). 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中"执行"可以认为是整个生命周期中最重要的阶段,这其中包括 大量为了检索数据到存储引擎的调用以及调用后

高性能mysql 第六章查询性能优化 总结(上)查询的执行过程

6  查询性能优化 6.1为什么查询会变慢 这里说明了的查询执行周期,从客户端到服务器端,服务器端解析,优化器生成执行计划,执行(可以细分,大体过程可以通过show profile查看),从服务器端返回客户端结果. 而执行部分作为最重要的一环,需要做的事情比较多,而不合适的query往往让执行过程做了不必要的操作,或者不能使用更优秀的底层数据结构,从而用时更久. 6.2慢查询基础:优化数据访问 访问数据量多大,超过实际所需是慢查询的一个原因.导致这种情况的原因大致有两个 1.应用程序向mysql

Mysql数据库性能优化(一)

参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面

架构设计:系统存储(8)——MySQL数据库性能优化(4)

================================ (接上文<架构设计:系统存储(7)--MySQL数据库性能优化(3)>) 4-3.InnoDB中的锁 虽然锁机制是InnoDB引擎中为了保证事务性而自然存在的,在索引.表结构.配置参数一定的前提下,InnoDB引擎加锁过程是一样的,所以理论上来说也就不存在"锁机制能够提升性能"这样的说法.但如果技术人员不理解InnoDB中的锁机制或者混乱.错误的索引定义和同样混乱的SQL写操作语句共同作用,那么导致死锁出现的

架构设计:系统存储(9)——MySQL数据库性能优化(5)

=================================== (接上文<架构设计:系统存储(9)--MySQL数据库性能优化(5)>) 4-3-3-3.避免死锁的建议 上一篇文章我们主要介绍了MySQL数据库中锁的基本原理.工作过程和产生死锁的原因.通过上一篇文章的介绍,可以确定我们需要业务系统中尽可能避免死锁的出现.这里为各位读者介绍一些在InnoDB引擎使用过程中减少死锁的建议. 正确使用读操作语句 经过之前文章介绍,我们知道一般的快照读是不会给数据表任何锁的.那么这些快照读操作