1. 面试常见问题: sql性能调优(惊艳版)

1.在查询列加索引

2.不要写select * 这样的代码,指定需要的字段名

3.避免多余的排序。使用GROUP BY 时,默认会进行排序,当你不需要排序时,可以使用order by null
Select product,count(*) cnt from crm_sale_detail group by product order by null;

4.如果like一个字段, 且该字段有索引的话,%要后置,因为%放在前面的话,索引会失效
为什么%在前面就不会使用索引了?
因为比较字符串都是从第一个字符开始比较, 你前面都不确定, 怎么使用索引
面试官反问: %前置的情况,什么情况下会使用到索引?
可以用reverse反转模糊查询的字段
如: select * from student where name like ‘%三’
我们可以改造为:
select * from student where reverse(name) like reverse(’%三’)

5.多表查询时 每个字段要指定表名做前缀:要是不这样写的话, 每个字段都要查多个表, 那样性能会下降

6.对于多表关联, 包含统计逻辑的脚本, 要是性能太差的话,
可以弄一个中间指标表 写存储过程初始化数据 在用定时器定时执行,
这样的话页面只要单表查询就可以了, 这样可以大大提升性能, 不过要多维护一个表和一个存储过程

7.不允许在where子句的字段上添加函数或者表达式,这样将导致索引失效
错误的写法:
1.select * from iw_account_log
where to_char ( trans_dt, ‘yyyy-mm-dd’) = ‘2007-04-04’;
2.select qty from product where p_id + 12 = 168;
3.select * from iw_account_log where substr(username,1,5)=‘abcde’
正确的写法:
1.select * from iw_account_log
where trans_dt >= to_date ( ‘2007-04-04’, ‘yyyy-mm-dd’)
and trans_dt < to_date ( ‘2007-04-05’, ‘yyyy-mm-dd’);
2.select qty from product where p_id = 168 - 12;
3.select * from iw_account_log where username like ‘abcde%’

8.当表连接时,用于连接的两个表的字段如果数据类型不一致,则必须在一边加上类型转换的函数
错误的写法(a.id是number类型,而b.operator_number是char类 型) :
select count() from adm_user a, adm_action_log b
where a.id = b.operator_number
and a.username = ‘小钗’;
正确的写法:
select count(
) from adm_user a, adm_action_log b
where to_char(a.id) = b.operator_number
and a.username = ‘小钗’;
select count from adm_user a, adm_action_log b
where a.id = to_number(b.operator_number)
and a.username = ‘小钗’;
注意:
Mysql 的日期与字符是相同的,所以不需要做另外的转换
例:Select e.username from employee e where e.birthday >= ‘1998-12-31 11:30:45’

9.用子查询代替表连接
10.将sql表连接的实现方式, 转为后台java拼装来实现
11.IS NULL不走索引,IS NOT NULL走索引
SELECT * FROM user WHERE address IS NULL 不走索引
SELECT * FROM user WHERE address IS NOT NULL; 走索引
12.如果是联合索引, 必须符合最左原则, 否则索引无效
13.多表join 性能差 、like “%xxx” 效率低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值