1.⾯试常见问题:sql性能调优(惊艳版)
1.在查询列加索引
2.不要写lect * 这样的代码,指定需要的字段名
乞巧的拼音3.避免多余的排序。使⽤GROUP BY 时,默认会进⾏排序,当你不需要排序时,可以使⽤order by null Select product,count(*) cnt from crm_sale_detail group by product order by null;
4.如果like⼀个字段, 且该字段有索引的话,%要后置,因为%放在前⾯的话,索引会失效
为什么%在前⾯就不会使⽤索引了?
因为⽐较字符串都是从第⼀个字符开始⽐较, 你前⾯都不确定, 怎么使⽤索引
⾯试官反问: %前置的情况,什么情况下会使⽤到索引?
可以⽤rever反转模糊查询的字段
如: lect * from student where name like ‘%三’
我们可以改造为:
cool是酷的意思吗lect * from student where rever(name) like rever(’%三’)
5.多表查询时 每个字段要指定表名做前缀:要是不这样写的话, 每个字段都要查多个表, 那样性能会下降
制作可乐鸡翅的步骤6.对于多表关联, 包含统计逻辑的脚本, 要是性能太差的话,
可以弄⼀个中间指标表 写存储过程初始化数据 在⽤定时器定时执⾏,
这样的话页⾯只要单表查询就可以了, 这样可以⼤⼤提升性能, 不过要多维护⼀个表和⼀个存储过程
7.不允许在where⼦句的字段上添加函数或者表达式,这样将导致索引失效
腊鱼错误的写法:
1.lect * from iw_account_log
铭记作文
where to_char ( trans_dt, ‘yyyy-mm-dd’) = ‘2007-04-04’;
2.lect qty from product where p_id + 12 = 168;
3.lect * from iw_account_log where substr(urname,1,5)=‘abcde’
正确的写法:
1.lect * 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.lect qty from product where p_id = 168 - 12;
3.lect * from iw_account_log where urname like ‘abcde%’
色优
8.当表连接时,⽤于连接的两个表的字段如果数据类型不⼀致,则必须在⼀边加上类型转换的函数
错误的写法(a.id是number类型,⽽b.operator_number是char类 型) :
lect count() from adm_ur a, adm_action_log b
where a.id = b.operator_number
and a.urname = ‘⼩钗’;
正确的写法:
lect count() from adm_ur a, adm_action_log b护眼手机壁纸
where to_char(a.id) = b.operator_number
and a.urname = ‘⼩钗’;
lect count from adm_ur a, adm_action_log b
where a.id = to_number(b.operator_number)
and a.urname = ‘⼩钗’;什么颜色对眼睛好
注意:
Mysql 的⽇期与字符是相同的,所以不需要做另外的转换
例:Select e.urname from employee e where e.birthday >= ‘1998-12-31 11:30:45’
9.⽤⼦查询代替表连接
10.将sql表连接的实现⽅式, 转为后台java拼装来实现
11.IS NULL不⾛索引,IS NOT NULL⾛索引
SELECT * FROM ur WHERE address IS NULL 不⾛索引SELECT * FROM ur WHERE address IS NOT NULL; ⾛索引
12.如果是联合索引, 必须符合最左原则, 否则索引⽆效
13.多表join 性能差 、like “%xxx” 效率低