sql 语句(mysql 优化)绝对经典
误区 1:count(1)和 count(primary_key)
优于 count(*)
很多人为了统计记录条数,就使用 count(1) 和 count(primary_key) 而不是
count(*) ,他们认为这样性能更好, 其实这是一个误区。对于有些场景,这样
做可能性能会更差,应为数据库对 count(*) 计数操作做了一些特别的优化。
误区 2:count(column)
和 count(*)
是一样的
这个误区甚至在很多的资深工程师或者是 DBA 中都普遍存在,很多人都会
认为这是理所当然的。实际上,count(column) 和 count(*) 是一个完全不一样的
操作,所代表的意义也完全不一样。count(column) 是表示结果集中有多少个
column 字段不为空的记录,count(*) 是表示整个结果集有多少条记录
误区 3:select a,b from … 比 select a,b,c from … 可以让数据库访问更少的
数据量
这个误区主要存在于大量的开发人员中,主要原因是对数据库的存储原理不
是太了解。实际上,大多数关系型数据库都是按照行(row)的方式存储,而数据
存取 操作都是以一个固定大小的 IO 单元(被称作 block 或者 page)为单 位,一
般为 4KB,8KB… 大多数时候,每个IO 单元中存储了多行,每行都是存储了该
行的所有字段(lob 等特殊类型字段除外)。
所以,我们是取一个字段还是多个字段,实际上数据库在表中需要访问的
数据量其实是一样的。当然,也有例外情况,那就是我们的这个查询在索引中就
可以完成, 也就是说当只取 a,b 两个字段的时候,不需要回表,而 c 这个字段不
在使用的索引中,需要回表取得其数据。在这样的情况下,二者的
IO
量会有较
大差异。(覆盖索引)
误区 4:order by
一定需要排序操作
我们知道索引数据实际上是有序的,如果我们的需要的数据和某个索引的顺
序一致,而且我们的查询又通过这个索引来执行,那么数据库一般会省略排序操
作,而直 接将数据返回,因为数据库知道数据已经满足我们的排序需求了。实
际上,利用索引来优化有排序需求的 SQL,是一个非常重要的优化手段。延伸
阅读:MySQL ORDER BY 的实现分析 ,MySQL 中 GROUP BY 基本实现原理
以及 MySQL DISTINCT 的基本实现原理。(order by null)
评论0
最新资源