count(distinct a._url) CUrl 这里那个distinct完全可以不要。因为你的a._url在group by里面,已经完成了distinct功能了。你也知道distinct得支出的。
建议:
1) 用view, 譬如t_gw_merge_log a, t_gw_netuser u on a._uid=u._id 建立view,其他依次类推。我曾经作过9个表的连接(DB2),用了view之后,性能提升了30%。。 view只是把你的表里面只需要的字段拿出来从而减少表得扫描量。
语法:CREATE VIEW tab_view AS SELECT field1, file2 , filed3 FROM tab WHERE...
2) 因为sum(p._ul) SUl,sum(p._dl) SDl这两个聚合函数引起的,因为相对应的t_gw_applog 这个表数据也很多。如果是因为这个,就要建立适当的索引了。下午有时间再研究下。
需要准备的工具:电脑,sql数据库。
1、首先新建一个test表,有id,name,second三个字段,其中name字段有重复数据。
2、输入“select name,max(second) from test group by name”语句,点击运行。
3、可以看到已经查询出按name分组后取出的second最大的一条记录。
4、以输入“select name,max(second) from test group by name order by max(second) desc”语句,按分组后second最大值进行降序。
5、如果想查询mysql分组后最小的一条记录,输入“select name,min(second) from test group by name”语句,点击运行即可。
2020-03-01
对于count的函数的使用,我们常见的一个错误是在括号内随意指定一个列去统计结果集的行数。但只有指定的行确实都是有值的时候,统计的才是实际的行数,否则可能统计的结果并不是实际的行数。而对于MyISAM存储引擎,如果某一列的值确实不可能为null时,MySQL内部就会将count()函数优化成count(*),若没有带where条件,此时计算速度是非常快的,因为此时没有实际的去计算表的行数。
总结: 对于MyISAM存储引擎,不带where条件的count(*)是非常快的。
技巧:
利用上述MyISAM的count(* )特性,加速一些特定查询条件的count()查询。
如:
对于select count(* ) from tablename where id >10可以做如下的反转查询:
select (select count(* ) from tablename) - count(* ) from tablename where id <10
因为这样在查询阶段MySQL将子查询当做一个常数来处理,大大减少了扫描的行数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)