max
io就相当高
建索引
count(*) 全部行
count(id)不包括null
select count (code='18') as 'good',count(code='19')as 'hahah' from study
在一条 SQL 中同时查出 2006 年和 2007 年电影的数量一优化 count0 函数正确的方式:
SELECT COUNT (release_year='2006' OR NULL) AS '2006 年电影数量', COUNT (release_year='2007’ OR NULL) AS '2007 年电影数量' FROM film;
在一条 SQL 中同时查出 2006 年和 2007 年电影的数量一优化 count() 函数
错误的方式:
SELECT COUNT (release_year='2006' OR release_year='2007') FROM film;
无法分开计算 2006 和 2007 年的电影数量
SELECT COUNT (*) FROM film WHERE release_year='2006' AND release_year ='2007';
Release_year 不可能同时为 2006 和 2007,因此上有逻辑错误
查询最后支付时间一优化 max() 函数
select max(payment_date) from payment;
or null count 见评论区
另外本章这几节,因mysql版本号过时,不用再看
本课程看看目录.根据目录自己查资料即可
逻辑上的sql优化具体案例(需要大量经验和自我总结得到):
max()语句优化:
1:44:看到rows 非常高,说明sql语句效率不高;
这时候优化思路是:可以在'payment_date'上建立索引
create index idx_paydate on payment(payment_date);
这时候 在执行max(payment_date)后rows为null,说明执行效率很高,
因为索引是顺序排列的,通过索引统计信息就可以知道,最后一个payment_date的数值是怎么样的,所以不需要经过表数据查询即可知道max()结果。
完全可以通过索引信息查到我们需要的结果,称为“覆盖”索引;
count()优化:
3:37:sql语句逻辑上不符合我们的具体要求了;
4:52 优化后的语句逻辑上符合要求:
用到了count(null)返回值为0的特点,(这也是需要经验的),count(*)中,若遇到null返回值为1;
write this down
count(*)在计数时会计入为null的行
count(某字段)不会计入null的行
count有两个作用一个是统计行数(e. g count(*)的用法) , 还有一个就是统计列值. 在统计列值时要求列值是非空的(不统计null). 如果在count()的括号里指定了列值或列值的表达式, 则统计的是这个表达式有值的结果数.
(gender = 1) OR NULL, 而很多人其实误以为是这样的gender = 1 OR gender IS NULL. 亲, 这可是两个完全不同的表达式啊!!!! 第二个表达式不用我多说了, 当gender为1时, 整个表达式为1, 当gender为2时, 整个表达式为0. 第一个表达式其实也很容易看啊, 当gender为1时, gender = 1 OR NULL —–> 1=1 OR NULL —-> 1 OR NULL —-> 1, 当gender为2时, gender = 1 OR NULL —–> 2 = 1 OR NULL —-> 0 OR NULL —-> NULL.
COUNT(XXX OR NULL)性能方面的问题:
前提在gender上建立过btree索引了,SELECT COUNT(gender = 1 OR NULL) FROM employee没有SELECT COUNT(*) FROM employee WHERE gender = 1性能高。前者type是index,后者是ref.
但如果需求是既要统计男员工的数量也要统计女员工的数量,办法就是写在一条SQL语句里, 让数据库一次就统计完成, 性能就不会损耗在多次数据库连接上了.
SELECT COUNT(gender = 1 OR NULL) AS male, COUNT(gender = 2 OR NULL) AS female FROM employee
count(id)的统计的行数不包含值为NULL的行
创建一个覆盖索引(查询列被所建的索引覆盖)
create index idx_paydate on payment(payment_date);
explain中的extra列出现了Using filesort 或者 Using temporary时,说明需要优化查询了,可能是order by 或者group by没有使用到索引;
count()函数: count(*)和count(id)查询的结果是不同的,count(*)会包含id是null的列,比如select count(num='2006' or null),count(year='2007' or null) from t;(查询2007和2006年的各自的票数,count函数的参数为null不进行统计)
max()函数,可以使用索引优化:select max(payment_date) from payment; 可以在表payment_date上加索引:create index idx_paydate on payment(pay_date);通过explain解释:explain select max(payment_date) from payment \G ,Extra行出现提示:Seletct tables optimized away(已经优化到不能再优化了)
count(*) //统计数量,包含null在内
count(字段名) //统计数量,不包含null在内
创建索引:create index 索引名 on 表名(字段名);
count()和max()的优化:
比如max()查询最后支付时间:给支付时间列建立索引 create index idx_paydate on paydate(payment_date);
count() 在同一条SQL中同时查询出2006和2007年电影的数量:select count(release_year='2006' or null) as '2006年电影数量',count(release_year='2007' or null)as '2007年电影数量' from film;
SQL及索引优化
count(id)对null不计算
count()和max()的优化:
比如max()查询最后支付时间:给支付时间列建立索引 create index idx_paydate on paydate(payment_date);
countz() 在同一条SQL中同时查询出2006和2007年电影的数量:select count(release_year='2006' or null) as '2006年电影数量',count(release_year='2007' or null)as '2007年电影数量' from film;
count 优化
max函数优化
explain 分析SQL执行计划
extra列 出现 Using filesort和 Using temporary 使用外部文件或临时表存储结果 需要优化
Count()和Max()的优化
SQL及索引优化