高性能MySQL–查询性能优化

  •   
  • 2993
  • MySQL
  • 31
  • super_dodo
  • 2017/03/03

在尝试编写快速的查询之前,需要清楚一点,真正重要的是响应时间。如果把查询看做是一个任务,那么它由一些列子任务组成,每个子任务都会消耗一定的时间。响应时间是两个部分之和:服务时间和排队时间。服务时间是指数据库处理这个查询真正花了多长时间。

在EXPLAIN语句中的type列反应了访问类型。访问类型有很多种,从全表扫描、索引扫描、范围扫描、唯一索引查询、常数引用等。这里列的这些,速度是从慢到快,扫描行数也是从多到少。索引让MySQL以最高效、扫描行数最少的方式找到需要的记录。

MySQL内部每秒能够扫描内存中上百万行的数据,相比之下,MySQL响应数据给客户端就慢得很多。

在很多数据库系统中,IN()完全等同于多个OR条件的子句,因为这两者是完全等价的。在MySQL中这点是不成立的,MySQL将IN()列表中的数据进行排序,然后通过二分查找的方式来确定列表中的值是否满足条件,这是一个O(log n)复杂度的操作,等价的转换成OR查询的复杂度为O(n),对于IN()列表中有大量取值的时候,MySQL的处理速度将会更快。

MySQL的临时表是没有任何索引的,在编写复杂的子查询和关联查询的时候需要注意一下,这一点对UNION查询也是一样。

无论如何MySQL排序都是一个成本很高的操作。所以从性能角度考虑,应尽可能避免排序或者尽可能避免对大量数据进行排序。

COUNT()是一个特殊的函数,有两种非常不同的作用:它可以统计某个列值的数量,也可以统计行数。在统计列值时要求列值时非空的(不统计NULL)。COUNT()的另一个作用是统计结果集的行数。最简单的就是当我们使用COUNT(*)的时候,这种情况下通配符*并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。如果希望知道的时候结果集的行数,最好使用COUNT(*),这样写意义清晰,性能也会很好。

优化通常都需要三管齐下:不做、少做、快速地做。

我本来平时不洗澡,那天听说你要来,我足足洗了2块3毛1分的澡。

高性能MySQL--MySQL架构与历史

高性能MySQL--MySQL基准测试

高性能MySQL--服务器性能剖析

高性能MySQL--Schema与数据类型优化

高性能MySQL--创建高性能的索引

高性能MySQL--查询性能优化

高性能MySQL--MySQL高级特性

高性能MySQL--优化服务器设置

高性能MySQL--操作系统和硬件优化

高性能MySQL--复制

高性能MySQL--可扩展的MySQL

高性能MySQL--高可用性

高性能MySQL--云端的MySQL

高性能MySQL--应用层优化

高性能MySQL--备份与恢复

高性能MySQL--MySQL用户工具