mysql索引学习案例

news2024/10/6 13:31:02

简单的学习一下mysql普通索引

这是一个小的案例

一、创建表SQL

CREATE TABLE `group_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `group_seq` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '拼单号',
  `group_status` int(8) NOT NULL COMMENT '100 待提货, 200 已提货, 300 已取消',
  `purchase_user_id` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '下单商家',        
  `user_id` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '下单人',        
  `product_id` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '商品id',        
  `saler_user_id` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '商品所属人',        
  `payable_money` bigint(16) NOT NULL COMMENT '应付金额',
  `piece_amount` int(16) NOT NULL COMMENT '件数',        
  `pick_code` varchar(16) COLLATE utf8mb4_bin NOT NULL COMMENT '自提码',
  `verify_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '核销状态  0失效, 1 生效', 
  `remark` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注',
  `order_time` datetime NOT NULL COMMENT '下单',                
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_group_seq` (`group_seq`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=COMPACT COMMENT='拼单';

二、造数据

-- 删除存储过程
DROP PROCEDURE IF EXISTS generate_group_order_data;
DELIMITER //

-- 创建存储过程
CREATE PROCEDURE generate_group_order_data()
BEGIN
    DECLARE i INT DEFAULT 0;

    -- Disable autocommit for the duration of the procedure
    SET autocommit = 0;

    -- Start the transaction
    START TRANSACTION;
	-- 800000 就是80w条数据,这里自己选择创建多少,数据太少也展现不出来索引的作用
    WHILE i < 800000 DO
        INSERT INTO group_order (
            group_seq, group_status, purchase_user_id, user_id, product_id, saler_user_id,
            payable_money, piece_amount, pick_code, verify_status, remark, order_time,
            create_time, update_time
        ) VALUES (
            UUID(), FLOOR(1 + RAND() * 300), UUID(), UUID(), UUID(), UUID(),
            FLOOR(100 + RAND() * 9900), FLOOR(1 + RAND() * 100), LPAD(FLOOR(RAND() * 10000), 4, '0'),
            FLOOR(RAND() * 2), NULL, NOW() - INTERVAL FLOOR(RAND() * 365) DAY,
            NOW(), NOW()
        );

        SET i = i + 1;
    END WHILE;

    -- Commit the transaction
    COMMIT;

    -- Re-enable autocommit
    SET autocommit = 1;
END //

DELIMITER ;

-- 调用存储过程以生成数据
CALL generate_group_order_data();

三、GO


3.1 查询数据总条数
SELECT COUNT(1) FROM group_order;

在这里插入图片描述

这里数据是101w


3.2 使用唯一索引查询数据
SELECT * FROM group_order 
WHERE group_seq ='d6b9ebf0-8427-11ee-9600-988fe06b9059'
order by update_time desc limit 0,20;

在这里插入图片描述
在这里插入图片描述

可以看到查询速度在0.018s,速度还可以


3.3 不使用索引查询数据
EXPLAIN SELECT * FROM group_order 
WHERE group_status = 41
order by update_time desc limit 0,20;	

在这里插入图片描述


在这里插入图片描述

这里时间为1.938s,客户都等崩溃了


3.4 使用两个条件查询数据

一个条件有索引,一个条件没索引

3.4.1 索引条件在后

这里无索引条件在前,有索引条件在后

EXPLAIN SELECT * FROM group_order 
WHERE group_status = 41  
AND group_seq='d6b9ebf0-8427-11ee-9600-988fe06b9059' 
order by update_time desc limit 0,20;			

在这里插入图片描述
在这里插入图片描述

3.4.2 索引条件在前

这里索引条件在前,无索引条件在后

EXPLAIN SELECT * FROM group_order 
WHERE group_seq='d6b9ebf0-8427-11ee-9600-988fe06b9059'  
AND group_status = 41
order by update_time desc limit 0,20;					

在这里插入图片描述
在这里插入图片描述


3.5 给group_status添加普通索引
-- 添加group_status字段的普通索引
CREATE INDEX idx_group_status ON group_order(group_status);

3.5 查看表中的索引
-- 查询指定表中的索引
SHOW INDEX FROM group_order;

在这里插入图片描述


3.6 使用刚刚创建的索引字段进行查询
EXPLAIN SELECT * FROM group_order 
WHERE group_status = 41 
order by update_time desc limit 0,20;		

在这里插入图片描述
在这里插入图片描述

这里因为数据量比较大,在第一次查询时使用了0.55s,其余结果均为0.025s左右

四、释义

  1. 这里选择使用了 group_status 来当索引,只是为了演示,一般状态字段不建议做索引
  2. 图片中Extra:Using index condition

Using index condition: 这表示MySQL正在利用索引中的一部分条件来执行查询。具体来说,这通常发生在使用了覆盖索引(covering index)的情况,即查询的所有列都包含在索引中,而无需进一步查找实际的数据行。

  1. 图片中Extra:Using filesort

Using filesort: 这表示MySQL需要对结果进行排序,并且这个排序操作是通过创建一个临时文件来完成的。这通常发生在无法使用索引满足ORDER BY的排序顺序时,或者在MySQL版本较旧的情况下。


PS 感谢观看

世上只有一种英雄主义,就是在认清生活真相之后依然热爱生活。— 罗曼罗兰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1217496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux_虚拟机常用目录汇总

根目录&#xff08;cd /&#xff09;&#xff1a;/ 表示根目录&#xff0c;cd和 / 之间有个空格&#xff01; 用户目录&#xff08;cd ~&#xff09;&#xff1a;~ 表示用户目录&#xff0c;也称为家目录。cd 和 ~ 之间有个空格&#xff01; 当前路径&#xff1a;执行 pwd 指令…

component 动态组件的用法

一&#xff1a;前言 <component></component> 标签是Vue框架自定义的标签&#xff0c;它的用途就是可以动态绑定我们的组件&#xff0c;根据数据的不同需求来更换使用不同的组件。 在最上方的图片中&#xff0c;就是使用的 Element Plus 的 Tags 组件&#xff0c;根…

接口自动化测试如何实现?5个步骤轻松拿捏!

最近接到一个接口自动化测试的case&#xff0c;并展开了一些调研工作&#xff0c;最后发现&#xff0c;使用pytest测试框架并以数据驱动的方式执行测试用例&#xff0c;可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。当然…

物联网AI MicroPython学习之语法 I2C总线

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; I2C 介绍 模块功能: I2C Master设备驱动 接口说明 I2C - 构建硬件I2C对象 函数原型&#xff1a;I2C(id, scl, sda, freq)参数说明&#xff1a; 参数类型必选参数&#xff1f;说明idintYI2C外设&#xff…

linux三次握手、四次挥手

TCP协议是一个安全的、面向连接的、流式传输协议&#xff0c;所谓的面向连接就是三次握手&#xff0c;对于程序猿来说只需要在客户端调用connect()函数&#xff0c;三次握手就自动进行了。先通过下图看一下TCP协议的格式&#xff0c;然后再介绍三次握手的具体流程。 1.tcp协议…

python正则匹配示例

需要再如下图的txt中把 1100开头的订单号 提取出来&#xff0c;这个时候需要用到正则表达式 import rewith open(source.txt, r) as file:lines file.readlines()target \1100 target_lines [] for line in lines:if line.find(target) ! -1: print("match string…

java的Exception.getMessage为null

之前捕获异常后调用异常的getMessage写日志&#xff0c;日志写的竟然是null&#xff0c;不可思议。发现要调用异常的getCause().getMessage()才能得到异常信息 刻意把密码改错&#xff0c;让异常直达界面&#xff0c;免得有问题时候只能猜

LeetCode算法题解|LeetCode738. 单调递增的数字、LeetCode968. 监控二叉树

一、LeetCode738. 单调递增的数字 题目链接&#xff1a;738. 单调递增的数字 题目描述&#xff1a; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c…

Backblaze 2023 Q3硬盘故障质量报告解读

作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告&#xff0c;给大家提供了一份真实应用场景下的稳定性分析参考数据。2023年度之前发布的两次报告&#xff0c;请参考&#xff1a; Backblaze发布2…

Vue-Pinia

目录 Pinia状态管理库 使用步骤 1、安装Pinia 2、在vue应用实例中使用pinia 3、在src/stores/token.js中定义stores 4、在组件中使用store axios请求拦截器 代码实现 Pinia状态管理库 Pinia是Vue的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态 一般在登录时…

第一百七十五回 如何创建放射形状渐变背景

文章目录 1. 概念介绍2. 实现方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在 上一章回中介绍了"如何创建扇形渐变背景"相关的内容&#xff0c;本章回中将介绍" 如何创建放射形状渐变背景"。闲话休提&#xff0c;让我们一起Talk Flutter吧…

根据店铺ID或店铺昵称或店铺链接获取阿里巴巴店铺所有商品数据接口|阿里巴巴店铺整店商品数据接口|阿里巴巴API接口

阿里巴巴店铺所有商品数据接口是阿里巴巴开放平台提供的API接口之一&#xff0c;它可以帮助开发者获取到店铺内所有商品的信息&#xff0c;包括商品的ID、标题、价格、图片、链接等。通过该接口&#xff0c;开发者可以快速地获取到大量的商品数据&#xff0c;并进行进一步的数据…

数字化时代,数据就是资产

2011年&#xff0c;麦肯锡发布报告&#xff0c;认为“大数据Big Data已成为当今竞争、创新、生产效率提升的关键基础”。一时间&#xff0c;大数据&#xff0c;成为业内热点。数据&#xff0c;大家都懂&#xff1b;大&#xff0c;有什么区别&#xff1f; 而不管大的是什么&…

centos的root密码忘记或失效的解决办法

目录 前言1 单机维护模式2 利用具有管理员权限的用户切换到root用户3 救援模式 前言 在Linux系统中&#xff0c;root用户是最高权限的用户&#xff0c;可以执行任何命令和操作。但是&#xff0c;如果我们忘记了root用户的密码&#xff0c;或者需要修改root用户的密码&#xff…

STM32中断看这一篇就够了

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 1. 前言…

ElasticStack日志分析平台-ES 集群、Kibana与Kafka

一、Elasticsearch 1、介绍&#xff1a; Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;Logstash 和 Beats 收集的数据可以存储在 Elasticsearch 中进行搜索和分析。 Elasticsearch为所有类型的数据提供近乎实时的搜索和分析&#xff1a;一旦数据被索引&#…

CUDA学习笔记8——GPU硬件资源

简单来说就是为了充分利用GPU&#xff0c;不要让分出去的CUDA核心摸鱼闲置&#xff1b;GPU每次干活&#xff0c;都是以最小的组分配的&#xff0c;因此分派任务的时候就尽量充分发挥每个小组里CUDA核心的作用。这里的每个小组就是一个SM&#xff08;stream multi-processor&…

所见即所得的动画效果:Animate.css

我们可以在集成Animate.css来改善界面的用户体验&#xff0c;省掉大量手写css动画的时间。 官网&#xff1a;Animate.css 使用 1、安装依赖 npm install animate.css --save2、引入依赖 import animate.css;3、在项目中使用 在class类名上animate__animated是必须的&#x…

hash路由模式

hash模式 hash模式是一种把前端路由的路径用井号 # 拼接在浏览器 URL 后面的模式。 一个完整的 URL 包括&#xff1a;协议、域名、端口、虚拟目录、文件名、参数、锚。 https://www.wangyuegyq.top/utils/index.html?name123&phone123#home协议&#xff1a;https域名&am…

3. hdfs概述与高可用原理

简述 HDFS&#xff08;Hadoop Distributed File System&#xff09;是一种Hadoop分布式文件系统&#xff0c;具备高度容错特性&#xff0c;支持高吞吐量数据访问&#xff0c;可以在处理海量数据&#xff08;TB或PB级别以上&#xff09;的同时最大可能的降低成本。 HDFS适用于…