数据库优化 ---- 问题查询定位
2015-08-20 16:23
225 查看
在正常的企业应用中,一个好的数据库架构需要多方面的把握和优化:可以从选择硬件方面提升磁盘I/O、可以通过主从复制或负载均衡等策略对数据库访问进行分流、可以通过优化数据库对象(字段的选择以及字段长度的设定优化数据库空间)、可以通过应用优化减少与数据库的交互(一次查询出所需的字段信息、创建连接池等),然而对于程序员来说最常用到的数据库优化策略就是我们的SQL优化,接下我将以MYSQL为例学习经典的SQL优化策略:
一、利用数据库提供的函数解决需求问题:
1、巧用RAND()进行随机取样:
例句:随机从lender表中获取50条数据
SQL语句:
2、在使用group by进行分组聚合信息的检索的时候,可以加上with rollup字句进行整体聚合信息的检索:
例句:统计lender表中各个分销商来源的用户的数量
SQL语句:
点评:这样在最后就会显示出一行数据对分销商用户的总数进行汇总。
3、利用case when ... then ... else ... end流程语句进行条件控制
例句:统计lender表中的分销商用户的数量,如果为空默认来自"caikr"
SQL语句:
4、当一个表中的数据过大时,如果要对该数据表中的某些数据进行统计,可以创建中间表,中间表中数据结构和主表中的数据结构一致,这是将所有统计的数据从主表插入中间表中,这样可以可以不和正常的业务进行交互共同操作一张表,而且也可以从中间表中增加索引等操作提升统计效率。
二、SQL优化:
对于影响新能的SQL语句,我们应该如何进行系统的分析,定位SQL的问题并进行解决?
1、利用explain + SQL语句 分析低效SQL的执行计划,得到以下信息:
点评:根据上面的范式就能定位问题并采取相应的优化措施,该加索引的加索引,该调整sql语句的调整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语句。
相关文章推荐
- 数据库查询之速度优化---游标定位
- ruby on rails 使用bullet gem调试 n + 1 问题, 优化数据库查询
- oracle中查询和定位数据库问题的SQL语句
- 数据库查询性能优化问题
- 数据库查询优化问题笔记
- Oracle查询性能优化(面试题:数据库查询优化也是常问的问题)
- 数据库优化_定位慢查询
- 数据库查询优化问题
- 程序优化的问题--Locate定位查询
- 提高数据库的查询速率及其sql语句的优化问题
- 数据库解析——mysql百万级以上查询优化
- 查询优化:说说一个数据库的查询方法
- Sql server 数据库中,纯SQL语句查询、执行 单引号问题。
- 网站平台架构演变史(三) - 数据库表的查询优化
- 遇见了奇怪bug,前端用的AngularJs,后台是SpringMVC,持久用的hibernate,跟后台断点时查询数据库返回一条数据,否则返回两条,以下是问题详述
- 数据库查询问题--int型字段对应以Int型数值+','组成的nvarchar型字段
- Oralce数据库的优化(面试必问题)
- 公交车路线查询系统后台数据库设计——换乘算法改进与优化
- 数据库查询优化
- 数据库查询优化