一.SQL调优方法
1.查询时,避免使用select*,使用select列,只查需要用到的列,多余的列根本无需查出来。
2.用union all代替union
union all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高
3.多用limit,提高效率。
4.增量查询
select*,获取所有的数据进行同步=>改为增量查询,只同步一批数据,比如100条,提升单词查询的效率。
5.分页查询。
对查询接口做分页处理,避免一次性返回过多的数据影响接口性能。
6.用连接查询代替子查询.
子查询时,需要创建临时表,查询完毕后,需要再删除这些临时表,有一些额外的性能消耗。
7.join表的数量不宜过多
join太多,mysql在选择索引的时候会非常复杂,很容易选错索引。
8.join时要注意
在用left join关联查询时,左边要用小表,右边可以用大表。如果能用inner join的地方,尽量少用left join。
9.控制索引的数量
众所周知,索引能够显著的提升查询sql的性能,但索引数量并非越多越好。
因为表中新增数据时,需要同时为它创建索引,而索引是需要额外的存储空间的,而且还会有一定的性能消耗。
10.选择合理的字段类型
-能用数字类型,就不用字符串,因为字符的处理往往比数字要慢。
-尽可能使用小的类型,比如:用bit存布尔值,用tinyint存枚举值等。
-长度固定的字符串字段,用char类型。
-长度可变的字符串字段,用varchar类型。
-金额字段用decimal,避免精度丢失问题。
11.提升group by效率
where条件在分组前,就把多余的数据过滤掉了,这样分组时效率就会更高一些。也就是SQL语句在执行一些耗时操作之前,尽可能缩小数据范围,这样能提升sql整体的性能。
12.小表驱动大表-- in和exists关键字
in:会优先执行in里面的子查询语句,然后再执行in外面的语句。如果in里面的数据量很少,作为条件查询速度更快。
select * from order where user_id in (select id from user where status=1)
exists:优先执行exists左边的语句(即主查询语句)。然后把它作为条件,去跟右边的语句匹配。如果匹配上,则可以查询出数据。如果匹配不上,数据就被过滤掉了。
select * from order where exists (select 1 from user where order.user_id = user.id and status=1)
in 适用于左边大表,右边小表。
exists 适用于左边小表,右边大表。
13.索引优化
1.检查sql语句有没有走索引。
可以使用explain命令,查看mysql执行计划。
执行计划查看:通过type、key、key_len这几列可以判断索引使用情况。
type:连接类型 key:实际用到的索引 key_len: 实际索引长度
2.防止索引失效
全值索引
对索引中所有的列都指明值,是做好用的一种避免索引失效的方法。
创建复合索引
create index deptno_sal_index on emp(deptno,sal);
二、Hive调优方法
1.Hive的参数配置问题
Hive的参数配置有3种方式,分别是:
1.修改配置文件. 直接去/export/server/hive/conf文件中,修改hive-env.sh,hive-site.xml文件即可
2.命令行配置. nohup hive --service hiveserver2 --h