Mysql索引失效

本文介绍了MySQL建表时如何避免隐式转换导致索引失效的问题,包括数值与字符类型比较、索引作为函数的一部分以及不同编码下的关联操作。
摘要由CSDN通过智能技术生成

mysql建表语句

CREATE TABLE `edu_teacher` (
  `id` char(19) NOT NULL COMMENT '讲师ID',
  `name` varchar(20) NOT NULL COMMENT '讲师姓名',
  `intro` varchar(500) NOT NULL DEFAULT '' COMMENT '讲师简介',
  `career` varchar(500) DEFAULT NULL COMMENT '讲师资历,一句话说明讲师',
  `level` int(10) unsigned NOT NULL COMMENT '头衔 1高级讲师 2首席讲师',
  `avatar` varchar(255) DEFAULT NULL COMMENT '讲师头像',
  `sort` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
  `is_deleted` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除, 0(false)未删除',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='讲师';

mysql表数据

EXPLAIN详解见:MySQL-Explain详解_mysql explain-CSDN博客

1、隐式转换导致索引失效

分析下面两个查询语句:

EXPLAIN select * from edu_teacher where name = 101

EXPLAIN select * from edu_teacher where name = "101"

        两个查询语句中一个走了索引,一个没有通过索引,是因为存在字段的隐式转换(name字段的类型为varchar类型),未走索引的查询同时进行了全表扫描。

  • 当操作符左右两边的数据类型不一致时,会发生隐式转换
  • 当 where 查询操作符左边为数值类型时发生了隐式转换,那么对效率影响不大,但还是不推荐这么做。
  • 当 where 查询操作符左边为字符类型时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。
  • 字符串转换为数值类型时,非数字开头的字符串会转化为0,以数字开头的字符串会截取从第一个字符到第一个非数字内容为止的值为转化结果。

2、当索引为函数的一部分时会失效

分析下面两个查询语句:

EXPLAIN select * from edu_teacher where DATE(gmt_create) = "2020-09-03";

EXPLAIN select * from edu_teacher where gmt_create = "2020-09-03";

        因为索引作为函数的一部分时,索引的值就会改变。因此,会使得索引失效。索引必须是独立的列:即不能作为表达式的一部分,也不能作为函数的一部分。

3、当发生隐式编码转换的时候,就会造成做引的失效

        两个表进行关联操作,关联的字段是索引字段,但是两个表的编码是不一样的,比如两个表的编码字符集分别是 utf8mb4、utf8, utf8mb4 是 utf8 的超集,所以会自动将 utf8 转成 utf8mb4。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值