高性能MySQL–查询性能优化
- 3514
- 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分的澡。
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例