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” 效率低