开发者学堂课程【MySQL 高级应用 - 索引和锁:索引优化8】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8617
索引优化8
目录:
一、字符串不加单引号索引失效
二、少用 or ,用它来连接时会索引失效
三、回复总结
四、题目练习(符合索引)
一、字符串不加单引号索引失效
mysq l> se1ect * from staffs where name= ' 2000' ;
id |NANE | age | pos | add_time
3 | 2000 | 23 | dev | 2016-12-09 09:31 :34
1 row in set (0.00 sec)
mysql> se1ect* from staffs where name=2000 ;
id | NAME | age| pos | add_ .time
3| 2000| 23| devI 2016-12 -09 09:31 :34
51 row in set, 1 warning (0.00 sec)
Mysql可以查询出来,但是输入2000时, mysql 会在底层隐形的做一次转换,实现了数字 到 string 的类型转换,此时得出结论:不在索引列上做任何操作(计算、函数、(自动 or 手动)类型转换),会导致索引失效而全表扫描。
所以在 sql 书写当中 varchar 类型的东西决定不可以忘记单引号,不可以让隐含的类型转换发生。
二、少用 or ,用它来连接时会索引失效
Mysql>explain select * from staffs where name = ‘July’ or name = ‘z3’;
1 row in set (0.00 sec)
Mysql>select * from staffs where name =
‘July’ or name = ‘z3’;
2 rows in set
(0.00 sec)
此时执行发现,内容可执行,但过程略复杂
三、回复总结
1.全值匹配我最爱图
2.最佳左前缀法则
3.不在索引列上做任何操作(计算、函数、(自动ar手动)类型转换),会导致索引失效而转向全表扫描
4.存储引擎不能使用索引中范围条件右边的列
5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列--致)),减少 select*
6. mysql 在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
7. is null,is not null 也无法使用索引
8. like 以通配符开头 ('%abc... )mysq| 索引失效会变成全表扫描的操作
9.字符串不加单引号索引失败
10.少用 or,用它来链接时会索引失效
四、题目练习(符合索引)
Where语句 |
索引是否被使用 |
Where a = 3 |
Y,使用到a |
Where a = 3 and b = 5 |
Y,使用到a,b |
Where a = 4 and b = 5 and c = 4 |
Y,使用到a,b,c |
Where b = 3 或者 Where b = 3 and Where c = 4 或者 where c = 4 |
N |
Where a = 3 and c = 5 |
使用到a,c不可以 b中间断了 |
Where a = 3 and b > 4 and c = 5 |
使用到a和b C不能用在范围之后 B断了 |
Where a = 3 and b like ‘kk%’ and c = 4 |
a、b能用 C不能用 |