2.5MySQL的优化

1. 添加索引

   

1). 什么时候考虑添加索引?

   

数据量大; 频繁查询;

   

   

2). 针对什么样的字段添加索引?

   

where 后面的条件; 针对数据波动范围大;

   

   

3). 数据库表的索引是否越多越好 ? 太多会有什么影响?

   

不是; 太多了, 会对insert , update 的效率产影响.

   

   

4). 索引的使用规则?

   

explain 指令来查看查询计划.

   

   

   

   

2. select 语句中 尽量不适用 select * from..., 使用具体的字段代替 select name , age from ...;

   

---> select * , * 代表所有的列, 不同的表, 列也不同, 需要解析列, 会查找所有的字段. 效率低.

   

   

3. where 和 having, where子句中不能跟组函数. 当使用where 和 having 都可以使用时, 尽量使用where.

   

1). select deptno, avg(sal) from emp where deptno = 10 group by deptno; ---> 先过滤,后分组, 分组的对象数据少, 效率高.

   

2). select deptno, avg(sal) from emp group by deptno having deptno = 10; ---> 先分组后过滤.

   

4. 如果需要查询多张表, 可以使用子查询, 也可以使用多表查询时, 理论上,尽量使用多表查询 ---> 因为性能高.

   

因为子查询, 对数据操作两次或多次, 而多表查询则只操作一次, 所以效率高---------> 不考虑笛卡尔积的情况下.

   

但是,如果表中的数据太多, 多表产生的笛卡尔积太大, 会影响多表查询的效率.

   

5. 尽量不使用集合运算.

   

参与运算的集合越多, 运行效率越低. UNION(并集) , UNION ALL(全并集) , INTERCEPT(交集) , MINUS(差集)

   

6. 尽量不适用in操作符.

   

ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采

   

用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程

   

在业务密集的SQL当中尽量不采用IN操作符,用 EXISTS 方案代替。

   

7. 强烈不建议使用 not in 操作符.

   

此操作是强列不推荐使用的,因为它不能应用表的索引 ; 可以使用not exists来替代.

   

8. IS NULL 或IS NOT NULL操作(判断字段是否为空)

   

判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的 ;

   

用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>''等。不允许字段为空,

   

9. LIKE的模糊查询如果用的不好也会降低性能.

   

LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,

   

如LIKE '%5400%' 这种查询不会引用索引,而LIKE '5400%'则会使用索引

   

10. 避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能.

   

   

11. 在WHERE 语句中,尽量避免对索引字段进行计算操作

   

   

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值