MySQL索引失效

本文介绍了MySQL环境下,针对sys_user表的创建和测试数据插入,然后讨论了多种可能导致索引失效的场景,包括模糊查询、数据类型不匹配、使用函数、NULL值处理、字段运算、最左匹配原则违反等,并举例展示了这些场景。通过理解这些情况,可以更好地优化数据库查询性能。

环境:mysql-5.7.28

环境准备

-- 查看版本
select version();

-- 创建sys_user表
CREATE TABLE `sys_user`  (
  `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `telephone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `mail` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `age` int(3) NOT NULL,
  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `status` int(2) NULL DEFAULT NULL,
  `operator_time` date NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_username_telephone_mail`(`username`, `telephone`, `mail`) USING BTREE,
  INDEX `idx_password`(`password`) USING BTREE,
  INDEX `idx_age`(`age`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- 插入测试数据
insert into `sys_user` 
(`id`, `username`, `telephone`, `mail`, `age`, `password`, `remark`, `status`, `operator_time`) 
values 
('000001', '张三', '12345678901', '12345678@qq.com', 18, '123456', NULL, 1, '1970-01-01'),
('111111', '李四', '12345678902', '123456789@qq.com', 19, 'abcdef', NULL, 2, '1970-01-01'),
('222222', '王五', '12345678903', '1234567890@qq.com', 20, '000000', NULL, 3, '1970-01-01'),
('333333', '赵六', '12345678904', '1234567891@qq.com', 21, '', NULL, NULL, '1970-01-01'),
('444444', '孙七', '12345678905', '1234567892@qq.com', 22, '123456', NULL, 5, '1970-01-01'),
('555555', '周八', '12345678906', '1234567893@qq.com', 22, 'abcdef', NULL, 5, '1970-01-01'),
('666666', '吴九', '12345678907', '1234567894@qq.com', 22, '000000', NULL, 5, '1970-01-01'),
('777777', '郑十', '12345678908', '1234567895@qq.com', 22, 'qwerty', NULL, 5, '1970-01-01');

索引失效场景

模糊查询

% 在前面

explain select * from sys_user where id like '%1%'
explain select * from sys_user where id like '%1'

在这里插入图片描述

数据类型不一致

错误的数据类型,如varchar字段使用了int

explain select * from sys_user where id = 111111

索引字段使用了函数

索引字段使用内部函数

explain select * from sys_user where length(id) = 2

null

非空字段,is null / is not null 都不走索引

explain select * from sys_user where id is null
explain select * from sys_user where id is not null

字段允许为空,is not null 不走索引

explain select * from sys_user where password is not null

索引字段有运算

索引字段进行(+,-,*,/,!, !=, )等运算

explain select * from sys_user where age + 1 = 20 
explain select * from sys_user where age != 20 

最左匹配原则

多列索引 (idx_username_telephone_mail) 没有匹配到最左边username的索引字段会导致索引失效,当遇到范围查询(>、<、between、like)就会停止匹配

explain select * from sys_user where mail = '12345678@qq.com'
explain select * from sys_user where telephone = '12345678901'
explain select * from sys_user where telephone = '12345678901' and mail = '12345678@qq.com' 

全表扫描快于索引

explain select * from sys_user where age = 22

not in

explain select * from sys_user where age not in (19,20)

or

or连接的字段没有索引

explain select * from sys_user where id = '000001' or status = 1
【电能质量扰动】基于ML和DWT的电能质量扰动分类方法研究(Matlab实现)内容概要:本文研究了一种基于机器学习(ML)和离散小波变换(DWT)的电能质量扰动分类方法,并提供了Matlab实现方案。首先利用DWT对电能质量信号进行多尺度分解,提取信号的时频域特征,有效捕捉电压暂降、暂升、中断、谐波、闪变等常见扰动的关键信息;随后结合机器学习分类器(如SVM、BP神经网络等)对提取的特征进行训练与分类,实现对不同类型扰动的自动识别与准确区分。该方法充分发挥DWT在信号去噪与特征提取方面的优势,结合ML强大的模式识别能力,提升了分类精度与鲁棒性,具有较强的实用价值。; 适合人群:电气工程、自动化、电力系统及其自动化等相关专业的研究生、科研人员及从事电能质量监测与分析的工程技术人员;具备一定的信号处理基础和Matlab编程能力者更佳。; 使用场景及目标:①应用于智能电网中的电能质量在线监测系统,实现扰动类型的自动识别;②作为高校或科研机构在信号处理、模式识别、电力系统分析等课程的教学案例或科研实验平台;③目标是提高电能质量扰动分类的准确性与效率,为后续的电能治理与设备保护提供决策依据。; 阅读建议:建议读者结合Matlab代码深入理解DWT的实现过程与特征提取步骤,重点关注小波基选择、分解层数设定及特征向量构造对分类性能的影响,并尝试对比不同机器学习模型的分类效果,以全面掌握该方法的核心技术要点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值