mysql相关面试题

文章详细列举了MySQL索引可能失效的多种场景,如不满足最左匹配原则、使用SELECT*、ORDERBY、计算或函数、字段类型不匹配、LIKE操作符在左侧、使用OR关键字等。同时,提出了SQL性能调优的方法,包括建立索引、避免OR操作、使用VARCHAR、利用临时表、批量处理以及限制返回行数等。
摘要由CSDN通过智能技术生成
  1. mysql索引失效的几种场景?

1.1 不满足最左匹配原则

查询条件中,只要有最左边的索引字段,就会走索引;和where条件字段顺序无关,即使中间断了层也能走索引。

1.2 使用了select *

sql中使用了select *,从执行结果看,走了全表扫描,没有用到任何索引,查询效率非常低。

如果select语句中的查询列都是索引列,那么就走了覆盖索引,查询效率相对高些。

1.3 order by导致索引失效

实际开发过程中经常会使用到order by,为了提高order by的查询效率,建议把order by字段和select字段添加联合索引。但是如果实际需求经常变更,不能总是修改联合索引。可以通过给order by字段增加索引,先通过子查询查询到id,然后再手动回表查询所需要的字段。

1.4索引列上有计算或使用了函数

会对索引列进行一次重新计算。

1.5字段类型不同可能导致索引失效

varchar类型字段作为索引列的查询条件,如果该字段传参是int类型导致索引失效;

int类型字段作为查询条件,它会自动将该字段的参数进行隐式转换,把字符串换成int类型。

1.6 like左边包含了%

当like语句中的%出现在查询条件的左边时,索引会失效;但是如果我们使用覆盖索引就不会失效。

1.7 列对比

如果把两个单独建了索引的列用来做对比时索引会失效;

走覆盖索引的话是可以走索引的。

1.8 使用or关键字

or关键字前后两个字段都增加了索引,8.0版本以上会走索引,之前版本都不会走索引。

1.9 使用!=,<>,is null,is not null操作符

mysql5.7版本<>不等于会导致索引失效;但是mysql8.0还是会走索引。

不走索引场景解析:其实它是可以走索引的,如果返回结果集大于20%,那么它不会走索引。

1.10 范围查询数量过多导致索引失效

在我们开发过程中如果遇到范围条件,范围查询尽可能精确一点。

  1. SQL性能调优

2.1 为 WHERE 及 ORDER BY 涉及的列上建立索引

2.2 慎用 OR、 IN 、NOT IN、左模糊like

很多时候用exists 代替in 是一个好的选择
可以使用 UNION ALL代替OR

2.3 尽可能的使用 varchar, nvarchar 代替 char, nchar

varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间;

2.4 使用“临时表”暂存中间结果

2.5 用批量插入或批量更新

2.6 将不需要的记录在 GROUP BY 之前过滤掉

2.7 当只要一行数据时使用 LIMIT 1

2.8 禁止在数据库中存储图片,文件等大的二进制数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值