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会识别到使用这个字段并不是高效的查找,所以会进行舍弃

  

posted @   不忘初心2021  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 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实现简单分页(一)
点击右上角即可分享
微信分享提示