您的位置:首页 > 数据库

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

2015-08-20 16:23 225 查看
在正常的企业应用中,一个好的数据库架构需要多方面的把握和优化:可以从选择硬件方面提升磁盘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语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: