【mysql】--性能优化之特定类型的查询

一、count()查询

Count()函数:统计某列值的数量;统计结果集的行数。

SELECT count() from t_content; -----忽略所有列,直接统计所有行数 SELECT count(1) from t_content; SELECT count(status) from t_content; —统计该列不为NULL的数量 **count()**: 不取值,统计行数。 count(1):InnoDB引擎遍历整个表,但不取值。Server层对返回的每一行放一个数字”1”,按行累加。 count(主键):InnoDB遍历整个表,每行的id取出来返回server层,server层拿到id后,判断不为空,按行累加。 count(字段):InnoDB遍历整个表。【会判断是否为空,不为null,会返回值】 该字段定义为not null,一行一行从记录读取这个字段,判断不为null,按行累加; 该字段定允许null,执行时先判断有可能为null,还要把值取出来在判断一下,不是null才累加。

----所以按照效率:count(*) > count(1) > count(主键)>count(字段)

二、优化关联查询

确保ON或Using子句中的列有索引。 当表A和表B用列c关联,如果优化器的关联顺序是B、A,那么不需要在B表对应列上建索引。 【优化器的关联顺序:一般是记录少的放在前面—小数据集驱动大数据集。所以大表上ON关联对应的列需要建索引】

确保任何的Group by 和order by中的表达式只涉及到一个表中的列。

三、优化limit分页

limit a,b: a最小为0【第一个位置】,b表示选取的数量。

如果表比较大,limit a,b, a越大则需要扫描很多记录抛弃,性能不太好。 可以使用“延迟关联”来提升查询效率。

[SQL] SELECT * from content_191125_p ORDER BY last_update limit 6000,10; 受影响的行: 0 时间: 43.005s

[SQL] SELECT * from content_191125_p2 p1 INNER JOIN (SELECT id from t_hg_content_191125_p2 ORDER BY last_update limit 6000,10) p2 ON p1.id = p2.id; 受影响的行: 0 时间: 0.272s

[SQL] SELECT * from content_191125_p3 p1 INNER JOIN (SELECT id from content_191125_p3 ORDER BY last_update limit 6000,10) p2 USING(id); 受影响的行: 0 时间: 0.216s

经验分享 程序员 微信小程序 职场和发展