Sql的优化方式

本文为查询与总结,如有侵权请告知,立即删除!

1.查询数据库的方式尽量使用索引,避免全表扫描,尽量只查询带有索引条件的字段
例如:如果一个user表id建立索引了而name没有建立索引
那么select id from user就比select name from user效率高很多
因为id已经存储在叶子结点了,已经建立索引了

2.查询数据尽量避免市容or来连接查询,使用or会造成数据范围内的扫描,也可说是全表扫描,会降低效率
例如:select id from user where name=‘张三’ or name=‘李四’;效率就较低,可以修改成:
select id from user where name=‘张三’ union select id from user where name=‘李四’;这样查询张三和查询李四这两次查询都会走索引
3.在连续数值的查询中能使用between就尽量使用,between是范围查询,尽量不要使用in/not in,都会导致全表扫描,而不走索引

4.where对字段进行表达式操作,会导致MySQL的引擎放弃索引,进行全表扫描
例如:select * from user where age/2 =10;其中age是建立索引了的,但是age/2就不会走索引,索引在where中不要进行表达式的操作

5.where 查询操作中不要对字段进行函数操作
例如:select name from user where SUBSTR(name,2,3) =’ tom’; name原来是建立索引了的,但是截取了字符串之后就没有索引了,还是会导致全表扫描

6.多表查询使用inner join , left join , right join 替代子查询,因为子查询会在内存中建立临时表,降低了效率

7.in() 和 exists() 的选择:in()适合B表比A表数据小的情况, exists()适合B表比A表数据大的情况(Oracle知识)

8.使用like进行数据表的查询中能使用单%,不要使用双%,会导致引擎放弃索引,采用全表扫描,%也尽量放在后面或不适用

9.sql在建立联合索引的时候遵循最左前缀的原则,即最左优先。在检索数据的时候从联合索引的最左边开始匹配,左边没有匹配到,则整个sql都不会使用索引。例如:
select * from user where u_one=‘1’ and u_two=‘2’;如果u_one没有建立索引,那么下一个字段建立索引了也不会走索引

10.查询数据时使用精确的数据类型匹配
例如:表中id 是varchar类型那么select id from user where id=‘3’;就要比select id from user where id=3;效率要高

11.选取最适合的字段属性,一般来说,数据库中的表越小,查询也就越快。索引将字段的宽度设置成最符合实际应用的就好

在可能的情况下。尽量吧字段设置成not null 这样在执行查询的时候,数据库就不用去比较null值了
12.数据量比较大的时候,合理的使用分区表。使用partition by 自居定义每个分区存放的数据。执行查询的时候,优化器会根据分区的过滤规则匹配哪些分区有我们所需要的的数据。

13.合理选择存储引擎innodb和myisam,默认是使用innodb的。
innodb:适合保证数据的完整性,并发性,擅长更新,删除
myisam:擅长插入和查询

14.在sql优化时,可以在调试的时候开启慢查询日志。
Slow_query_log=1开启/0结束,Long_query_time=N,超过该时间临界点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值