图解mysql——索引篇(索引失效、count(*)和count(1)区别)

索引失效

一共有六种情况

  • 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;
  • 当我们在查询条件中对索引列使用函数,就会导致索引失效。
  • 当我们在查询条件中对索引列进行表达式计算,也是无法走索引的。
  • MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换是通过 CAST 函数实现的,等同于对索引列使用了函数,所以就会导致索引失效。
  • 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
  • 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效

MySQL 使用 like “%x“,索引一定会失效吗?

在 MySQL 中,使用 like 语句,如果模式字符串不以通配符(% 或 _)开头,则可以使用索引来优化查询。例如,使用以下查询:

SELECT * FROM table WHERE column LIKE 'abc%';

如果在 column 列上有一个以 B-tree 索引为基础的索引,则 MySQL 可以使用该索引来加速查询。

然而,如果在 like 子句中的模式字符串以通配符(% 或 _)开头,则 MySQL 无法使用索引来优化查询,因为模式字符串中的开头通配符会导致索引失效,这被称为“前缀模糊匹配”。

例如,使用以下查询:

SELECT * FROM table WHERE column LIKE '%abc';

即使在 column 列上有一个以 B-tree 索引为基础的索引,MySQL 也无法使用该索引来加速查询,因为该查询中的通配符开头会导致索引失效,MySQL 必须扫描整个表以找到匹配项。

总的来说,使用 like “%x” 索引并不一定会失效,取决于查询中是否使用了通配符以及通配符出现的位置。如果在查询中使用通配符且通配符在开头,则索引会失效。如果没有使用通配符或者通配符在结尾,则 MySQL 可以使用索引来加速查询。

count(*) 和 count(1) 有什么区别?哪个性能最好?

在这里插入图片描述
区别:
count()该函数作用是统计符合查询条件的记录中,函数指定的参数不为 NULL 的记录有多少个。

count(1):
因为 count 函数的参数是 1,不是字段,所以不需要读取记录中的字段值。参数 1 很明显并不是 NULL,因此 server 层每从 InnoDB 读取到一条记录,就将 count 变量加 1。

count(*)
对于 selete * 这条语句来说是这个意思,但是在 count() 中并不是这个意思。
count(*) 其实等于 count(0),也就是说,当你使用 count(
) 时,MySQL 会将 * 参数转化为参数 0 来处理。
count(*) 执行过程跟 count(1) 执行过程基本一样的,性能没有什么差异。

总结

count()这个函数里面的参数时变量名的话就是不为NULL的数量,参数为1或者*时就是全部记录。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值