一、利用数据库提供的函数解决需求问题:
1、巧用RAND()进行随机取样:
例句:随机从lender表中获取50条数据
SQL语句:
select * from lender ORDER BY RAND() LIMIT 50
2、在使用group by进行分组聚合信息的检索的时候,可以加上with rollup字句进行整体聚合信息的检索:
例句:统计lender表中各个分销商来源的用户的数量
SQL语句:
select count(1),regist_distrub_type from lender GROUP BY regist_distrub_type with ROLLUP
点评:这样在最后就会显示出一行数据对分销商用户的总数进行汇总。
3、利用case when ... then ... else ... end流程语句进行条件控制
例句:统计lender表中的分销商用户的数量,如果为空默认来自"caikr"
SQL语句:
SELECT count(1), CASE WHEN regist_distrub_type IS NULL THEN 'caikr' ELSE regist_distrub_type END FROM lender GROUP BY regist_distrub_type
4、当一个表中的数据过大时,如果要对该数据表中的某些数据进行统计,可以创建中间表,中间表中数据结构和主表中的数据结构一致,这是将所有统计的数据从主表插入中间表中,这样可以可以不和正常的业务进行交互共同操作一张表,而且也可以从中间表中增加索引等操作提升统计效率。
二、SQL优化:
对于影响新能的SQL语句,我们应该如何进行系统的分析,定位SQL的问题并进行解决?
1、利用explain + SQL语句 分析低效SQL的执行计划,得到以下信息:
select_type:表示select的类型,常见的有simple(简单表,即不使用表链接或子查询)、primary(主查询、即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、subquery(子查询中的第一个select) table:输出结果集的表 type:表示表的连接类型,主要检查性能,其中性能由好到差的连接类型为 system(表中仅有一行,即常量表)、 const(表中最多有一个匹配行,例如primary key或者unique index作为条件查询)、 eq_ref(简单来说就是多表连接中使用外键或者unique index)、 ref(与eq_ref相同,只不过使用的是普通的索引)、index_merge(索引合并优化)、 unique_subquery(in 的后面是一个查询主键字段的子查询)、 index_subquery(作用和unique_subquery相同,区别在于in后面是查询非唯一索引的子查询)、 range(单表中的范围查询)、 index(对于前面的每一行,都通过索引来得到数据)、 all(对于前面的每一行,都是通过全表扫描得到数据) possible_keys:表示查询时,可能使用的索引。 key:表示实际查询中使用的索引 key_len:索引字段的长度 rows:扫描行的数量 Extra:执行情况的说明和描述.
点评:根据上面的范式就能定位问题并采取相应的优化措施,该加索引的加索引,该调整sql语句的调整sql语句。