mysql索引原理简单说明
本次使用的是mysql5.7.17
首先说下索引中的组合索引,即多个字段组合的索引就叫做组合索引,但是什么时候会生效,什么时候会失效,我不是很清楚
首先建个表造点数据看下情况,
1 2 3 4 5 6 7 8 9 10 | CREATE TABLE `bank` ( `id` INT( 11 ) PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `bank_end` VARCHAR( 255 ) DEFAULT NULL COMMENT '银行卡后四位' , `bank_name` VARCHAR( 255 ) COMMENT '银行名称' , `bank_funds` VARCHAR( 255 ) DEFAULT NULL COMMENT '银行卡余额' , `bank_use` VARCHAR( 255 ) COMMENT '该笔金额用途' , `update_resume_times` VARCHAR( 255 ) DEFAULT NULL COMMENT '余额变动最新时间' , `resume_user` VARCHAR( 255 ) DEFAULT NULL COMMENT '消费人' , `bank_resume_status` CHAR( 1 ) DEFAULT NULL ) |
使用存储过程整点数据
存储过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | DELIMITER $$ CREATE PROCEDURE generate_bank_data(IN num INT) BEGIN DECLARE i INT DEFAULT 0 ; DECLARE batch_size INT DEFAULT 1000 ; -- 每次插入的批次大小 DECLARE bank_names VARCHAR( 255 ); DECLARE bank_uses VARCHAR( 255 ); DECLARE resume_users VARCHAR( 255 ); DECLARE bank_end VARCHAR( 4 ); DECLARE bank_funds VARCHAR( 255 ); DECLARE update_time DATETIME; DECLARE resume_user VARCHAR( 255 ); DECLARE bank_resume_status CHAR( 1 ); -- 准备一些模拟数据的词汇 SET bank_names = '工商银行,农业银行,建设银行,招商银行,平安银行,交通银行,中信银行' ; SET bank_uses = '消费,提现,转账,存款,支付,还款' ; SET resume_users = '张三,李四,王五,赵六,钱七,孙八,周九' ; -- 开启事务 START TRANSACTION; -- 循环生成数据并逐条插入 WHILE i < num DO -- 生成随机数据 SET bank_end = LPAD(FLOOR( 1000 + (RAND() * 9000 )), 4 , '0' ); SET bank_funds = CONCAT( '¥' , ROUND( 1000 + (RAND() * 10000 ), 2 )); SET update_time = DATE_FORMAT(NOW() - INTERVAL (FLOOR(RAND() * 30 )) DAY, '%Y-%m-%d %H:%i:%s' ); SET resume_user = SUBSTRING_INDEX(SUBSTRING_INDEX(resume_users, ',' , FLOOR( 1 + (RAND() * 7 ))), ',' , - 1 ); SET bank_resume_status = IF(RAND() > 0.5 , '1' , '0' ); -- 插入一条数据 INSERT INTO bank (bank_name, bank_use, bank_end, bank_funds, update_resume_times, resume_user, bank_resume_status) VALUES ( SUBSTRING_INDEX(SUBSTRING_INDEX(bank_names, ',' , FLOOR( 1 + (RAND() * 7 ))), ',' , - 1 ), -- bank_name SUBSTRING_INDEX(SUBSTRING_INDEX(bank_uses, ',' , FLOOR( 1 + (RAND() * 6 ))), ',' , - 1 ), -- bank_use bank_end, -- bank_end bank_funds, -- bank_funds update_time, -- update_resume_times resume_user, -- resume_user bank_resume_status -- bank_resume_status ); -- 每次插入 `batch_size` 条数据 IF (i + 1 ) % batch_size = 0 OR i + 1 = num THEN COMMIT; START TRANSACTION; END IF; SET i = i + 1 ; END WHILE; -- 提交事务 COMMIT; END $$ DELIMITER ; |
调用
1 | CALL generate_bank_data( 50000 ); |
先来不同顺序的解释计划说明
这里可以看到都是走了索引,和字段的先后顺序无关
索引列顺序不正确
1 | 组合索引的字段顺序非常重要,MySQL 会尝试从索引的最左边开始匹配。如果查询条件没有按照组合索引的顺序来匹配字段,索引就不能有效地工作 |
or操作符会导致索引失效
1 | 当查询包含多个条件并使用 OR 操作符时,MySQL 会试图分别使用每个条件的索引,这可能导致它无法有效地结合这些条件,从而导致索引的失效。MySQL 通常会放弃使用组合索引,而选择进行全表扫描 |
对索引列使用函数表达式
1 | 索引的目的是加速检索数据,但如果对索引列使用了函数(如 UPPER(), LOWER())或者其他表达式,索引的值会在查询时被修改或计算,因此 MySQL 无法直接通过索引查找数据 |
这里做了数字转为字符串的操作,原先定义好的索引没法使用,这里在进行进一步的解释
在这里mysql会识别到使用这个字段并不是高效的查找,所以会进行舍弃
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2024-02-28 查询postman版本号
2023-02-28 Vue简单使用
2023-02-28 使用StringRedisTemplate实现redis分布式锁
2022-02-28 java.io.FileNotFoundException: class path resource [templates/] cannot be resolved to absolute file path because it does not reside in the file system
2022-02-28 idea整合简单的oauth2认证服务器和资源认证服务器
2022-02-28 idea整合mybatis实现简单分页(一)