MySQL性能调优——函数、隐式类型转换、隐式字符编码对性能的影响

一、条件字段函数操作
select count(*) from table where month(字段名) = 7;

由于该字段上面有索引,所以放心的执行这条语句,但是却发现执行了特别久,为什么呢?

因为MySQL的规定,如果对字段做了函数运算,那么就用不上索引了,因为在索引上不知道往哪个方向走了。

但是优化器并不是放弃这个索引了,它会比较主键索引和当前索引的大小,选择走索引小的那个遍历,即选择最优的。

解决办法: 尽量让sql语句不使用函数,sql可以长一点,把所有可能的条件都写上。

二、隐式类型转换
select * from table where 字段=123456;

现在的这个字段数据类型是varchar()类型的,现在sql语句中写的是整型,这里会有一个类型转换。

那么,MySQL中的类型转换规则是什么呢?

字符串和数字做比较的话,是将字符串转换成数字。

对于优化器来说,相当于执行了:

select * from table where CAST(字段 AS signed int) = 123456;/*此字段上面有索引*/

到这里就知道它为什么慢了吧,这个它也是用函数了,所以优化器不会按照索引搜索了。

解决办法: 可以尝试在客户端就把这个转换问题给做好,可以用sql拼接的方法来解决。

三、隐式字符编码问题

在做连接查询的时候,如果两个表的字符集不同,一个是 utf8,一个是 utf8mb4,所以做表连接查询的时候用不上关联字段的索引。

其实内部也是自动用一个函数将字符集向上转换,MySQL规定,用到函数就不能走索引搜索。

解决办法: 将其中一个需要函数转换字符集的表直接把表给改掉,这样就没问题了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值