无名 发表于 2022-5-8 16:31:06

【梅开三度】Mysql语句优化的原则——让你写sql更加顺手2

7.如果使用数字作为字符,则数字需要加引号,否则mysql会自动在列上加数据类型转换函数

不使用索引

where mobile=18534874321

使用索引

where mobile=’18534874321’

8.字段加运算符不会使用索引。所以尽量把运算放在数值上

不使用索引:

SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT + 3000 >5000;

使用索引:

SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT > 2000 ;

9.使用组合索引时,必须要包括第一个列。

例如

alter table test add index(a,b,c):

不使用索引:

where b=1, c=2

where b=1

where c=2

使用索引:

where a=1, b=1, c=2

where a=1, b=1

where a=1, c=2

10.尽量避免使用is null或is not null

不使用索引:

SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;

使用索引:

SELECT … FROM DEPARTMENT WHERE DEPT_CODE >0;

11.不等于(!=)不会使用索引

不使用索引:

SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT !=0;

使用索引:

SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT >0;

12.ORDER BY 子句只在以下的条件下使用索引:

ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.

ORDER BY中不能既有ASC也有DESC

例如:

alter table t1 add index(a,b);

alter table t1 add index(c);

不使用索引:

select * from t1 order by a,c; 不在一个索引中

select * from t1 order by b; 没有出现组合索引的第一列

select * from t1 order by a asc, b desc; 混合ASC和DESC

select * from t1 where a=1 order by c; where和order by用的不是同一个索引,where使用索引,order by不使用。

使用索引:

select * from t1 order by a,b;

select * from t1 order where a=1 order by b;

select * from t1 order where a=1 order by a,b;

select * from t1 order by a desc, b desc;

select * from t1 where c=1 order by c;

13.索引不是越多越好。mysql需要资源来维护索引,任何数据的变更(增删改)都会连带修改索引的值。所以,需要平衡考虑索引带来的查询加速和增删改减速。
http://cdn.u1.huluxia.com/g4/M01/11/E4/rBAAdmBLwgSAEqr5AAGHcWSt2X4917.jpg
页: [1]
查看完整版本: 【梅开三度】Mysql语句优化的原则——让你写sql更加顺手2