数据库优化 ---- 问题查询定位

    在正常的企业应用中,一个好的数据库架构需要多方面的把握和优化:可以从选择硬件方面提升磁盘I/O、可以通过主从复制或负载均衡等策略对数据库访问进行分流、可以通过优化数据库对象(字段的选择以及字段长度的设定优化数据库空间)、可以通过应用优化减少与数据库的交互(一次查询出所需的字段信息、创建连接池等),然而对于程序员来说最常用到的数据库优化策略就是我们的SQL优化,接下我将以MYSQL为例学习经典的SQL优化策略:

    一、利用数据库提供的函数解决需求问题:

        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语句。

猜你喜欢

转载自wangxinhong4468.iteye.com/blog/2236875