当面试官问你mysql优化时..

用like模糊查询不要用 ‘%’ 开头

数据库引擎会放弃索引进行全表扫描,如果不是必要,尽量别这么干

select id from user where name like '%codeMan%'    

不要动不动就select *

如果你要的只是用户名,为啥你要用*呢,不要返回用不到的任何字段,万一用户的属性有几十行,你只是想要个用户名,何必呢

select * from user 	// ×
select user_name from user // √

别动不动就全表扫描

考虑在where和order by涉及的列加索引

不要在where对字段进行null判断

数据库引擎会放弃索引进行全表扫描,如果不是必要,尽量别这么干
换句话说,你可以用0来代替null

不要在where子句用!或者>、<操作符

数据库引擎会放弃索引进行全表扫描

不要在where里面写字段表达式

数据库引擎会放弃索引进行全表扫描

select id from user where money / 10 = 10

你不能这样写么?

select id from user where money = 10 * 10

都给我弄到 “ = ” 右边去

不要在where子句用函数操作

select id form user where substring(user_name,1,4)='code' //×

给我这样写

select id from user where user_name like 'code%'

不要用in和not in

数据库引擎会放弃索引进行全表扫描,如果是连续数值,你可以用between;如果是子查询,你可以用exists,很多时候用exists代替in是一个好选择

不要在where子句使用or

数据库引擎会放弃索引进行全表扫描

select id from user where money = 50 or money = 100 //×

给我这样写

select id from user where money = 50 union all select id from user where money = 100

如果索引是复合索引,必须使用该索引中的第一个字段作为条件

这样才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致

索引的正确建立

数据量小的表不需要建立索引
不经常用的列不需要加索引
对于重复多的数据,不要去建索引。

SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,比如表中有个字段sex,只有男和女,有必要去建索引吗?没有,这样反而适得其反。

索引是不是越多约好?

数据变更需要维护索引,因此更多的索引意味着更多的维护成本。
更多的索引意味着更多的存储空间。
索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率, 因为 insert 或 update 时有可能会重建索引

能用数字型字段表示尽量用数字型字段

尽量用varchar代替char

varchar是变长字段,可以节省存储空间,搜索效率高

关于游标

尽量不要使用游标,效率较差

ps:
关于索引的深入,可以深入浅出看看这两篇文章,都是转载自极客的一位老师写的,觉得写的很好~
索引1
索引2

原创文章 14 获赞 52 访问量 1425

猜你喜欢

转载自blog.csdn.net/weixin_44233929/article/details/105813826