MySQL-SQL语句优化

1、避免使用select * from tableName,语句中需指定具体字段。

select * 进行查询时,无法使用到覆盖索引,就会造成回表查询。指定具体字段,不仅可以减少表结构变动带来的影响,还可以节省资源、减少CPU和IO以及网络开销。

反例:
select * from user;
正例:
select id,name from user;

2、避免数据类型的隐式转换

限定要查询的数据,避免返回多余的行,需要什么数据,就去查什么数据,避免返回不必要的数据,节省开销,且隐式转换会导致索引失效。

假设建表时 id 为 int 类型,查询 id = 3 的数据

反例:
select id,name from user where id = '3';
正例:
select id,name from user where id = 3;

3、禁止在 where 子句中对字段进行表达式操作或函数转换

若该字段已创建索引,该操作会放弃索引并进行全表扫描。

假设 user 表的 sal 字段,加了索引,对其进行数据查询

反例:
select id,name from user where sal - 1000 = 3000;
正例:
select id,name from user where sal = 40000;

4、优化 like 语句

模糊查询使用 like 时,like很可能让索引失效。
把 % 放前面或者将 % 包裹关键字,均不会走索引查询
无前置 %,只有后置 % 才会走索引查询

反例:
-- % 放前面
select id,name from user where name like '%zhangsan';
-- 使用 % 包裹
select id,name from user where name like '%zhangsan%';

正例:
-- 无前置 %,只有后置 %
select id,name from user where name like 'zhangsan%';

5、使用联合索引时注意索引列的顺序,遵循最左匹配原则

当创建一个联合索引的时候,如(index1,index2,index3),相当于创建了(index1)、(index1,index2)和(index1,index2,index3)三个索引,即最左匹配原则,联合索引不满足最左原则,索引一般会失效。

假设有一个联合索引 (age, sal),age 在前,sal 在后。

反例:
select age, sal from user where sal = 3000;

正例:
-- 符合最左匹配原则
select age, sal from user where age = 25 and sal = 3000;
-- 符合最左匹配原则
select age, sal from user where age = 25;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值