1、引入索引的问题

在图书馆查找一本书的过程,可类比数据库查询场景。在一般软件系统中,对数据库操作以查询为主,数据量较大时,优化查询是关键,索引便是优化查询的重要手段 。

2、索引是什么

索引是一种特殊文件,包含对数据表所有记录的引用指针,类似书的目录,能加快查询速度 。
其核心特点:

  • 是帮助 MySQL 高效获取数据的数据结构
  • 存储在文件系统中
  • 文件存储形式与存储引擎有关
  • 有特定的文件结构

3、索引为什么选择 B + 树

(1)可选数据结构及特点

可作为索引的数据结构有 hash表二叉树b树b + 树 ,不同结构特点如下:

hash 表缺点
  1. 存储需将所有数据文件加载到内存,浪费空间
  2. 等值查询快,但实际工作中范围查询更多,hash 不适用

(2)B + 树优势(结合场景选择,文档未详细展开,可理解为综合适配数据库查询需求 )

B + 树在范围查询、数据存储效率、树结构高度(影响查询次数 )等方面表现更优,适合作为 MySQL 索引结构 。

4、测试索引(完整流程)

(1)创建数据库

在 MySQL 中创建 test_indexdb 数据库,操作:

mysql> create database test_indexdb;  
Query OK, 1 row affected (0.01 sec)  

(2)创建数据表

在 test_indexdb 中创建 test_index 表,操作:

mysql> use test_indexdb;  
Database changed  
mysql> create table test_index(title varchar(20));  
Query OK, 0 rows affected (0.01 sec)  

(3)插入测试数据(C 程序实现)

编写 C 程序向表中插入 1 万条字符串数据,代码:

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <string.h>  
#include <mysql/mysql.h>  int main()  
{  MYSQL mysql_conn;  MYSQL *mysql = mysql_init(&mysql_conn);  if (mysql == NULL)  {  printf("init err\n");  exit(1);  }  mysql = mysql_real_connect(mysql,"localhost","root","Abc_111111","test_indexdb",3306,NULL,0);  if (mysql == NULL)  {  printf("connect err\n");  exit(1);  }  char sql_buff[128] = {0};  for( int i = 0;i < 10000; i++ )  {  sprintf(sql_buff,"insert into test_index values('test-%d')",i);  if (mysql_query(mysql,sql_buff) != 0 )  {  printf("insert into err\n");  break;  }  }  mysql_close(mysql);  
}  

编译与运行

# 编译(链接 MySQL 客户端库)  
stu@stu-virtual-machine:~/mysql_dir$ gcc -o test_index test_index.c -lmysqlclient  # 运行程序插入数据  
stu@stu-virtual-machine:~/mysql_dir$ ./test_index  
# 执行时大约需要10秒时间  

(4)查询验证(对比索引效果)

① 开启运行时间监测
set profiling=1;  
② 查找数据(无索引时)

查找 title='test-9999' 的数据,语句:

select * from test_index where title='test-9999';  
③ 查看执行时间
show profiles;  
④ 创建索引

为 test_index 表的 title 列创建索引,语句:

create index title_index on test_index(title(20));  
⑤ 再次查询并查看时间

执行查询语句:

select * from test_index where title='test-9999';  

查看执行时间:

show profiles;  
⑥ 结果对比(示例,以实际执行为准 )
mysql> show profiles;  
+----------+------------+----------------------------------------------------+  
| Query_ID | Duration   | Query                                              |  
+----------+------------+----------------------------------------------------+  
| 1        | 0.00681275 | select * from test_index where title='test-9999'   |  
| 2        | 0.00067400 | show create table test_index                       |  
| 3        | 0.08281450 | create index t_index on test_index(title(20))      |  
| 4        | 0.00071700 | select * from test_index where title='test-9999'   |  
| 5        | 0.00045275 | show create table test_index                       |  
| 6        | 0.00930825 | drop index t_index on test_index                   |  
| 7        | 0.00841750 | select * from test_index where title='test-9999'   |  
| 8        | 0.05149600 | create index t_index on test_index(title(20))      |  
| 9        | 0.00043150 | select * from test_index where title='test-9999'   |  
+----------+------------+----------------------------------------------------+  

可观察到,创建索引后查询时长(如 Query_ID=4、9 )明显缩短。

⑦ 删除索引

若需删除创建的索引,语句:

drop index t_index on test_index;  

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS以及ArcGIS Pro如何去除在线地图制作者名单

问题&#xff1a;ArcGIS和ArcGIS Pro提供了许多在线地图服务&#xff0c;但是这些地图会自动生成制作者名单&#xff0c;如下图所示&#xff1a; 在线地图加载方式可参考&#xff1a;如何在ArcGIS和ArcGIS Pro中添加在线底图 这在出图时有时会造成图的部分信息遮挡或出图不美观…

InfluxDB 与 Golang 框架集成:Gin 实战指南(二)

四、实际应用案例4.1 案例背景某智能工厂部署了大量的物联网设备&#xff0c;如传感器、智能仪表等&#xff0c;用于实时监测生产线上设备的运行状态、环境参数&#xff08;如温度、湿度&#xff09;以及生产过程中的各项指标&#xff08;如产量、次品率&#xff09;。这些设备…

Linux系统磁盘未分配的空间释放并分配给 / 根目录的详细操作【openEuler系统】

选择 Fix 修正 GPT 表 输入 Fix 并按回车&#xff0c;parted 会自动&#xff1a; 扩展 GPT 表的 结束位置 到磁盘末尾。释放未被使用的空间&#xff08;1048576000 个 512B 块&#xff0c;约 500GB&#xff09;。 验证修正结果 修正后&#xff0c;再次运行&#xff1a; parted …

王道考研-数据结构-01

数据结构-01视频链接&#xff1a;https://www.bilibili.com/video/BV1b7411N798?spm_id_from333.788.videopod.sections&vd_source940d88d085dc79e5d2d1c6c13ec7caf7&p2 数据结构到底在学什么? 数据结构这门课他要学习的就是怎么用程序代码把现实世界的问题给信息化&…

k8s云原生rook-ceph pvc快照与恢复(上)

#作者&#xff1a;Unstopabler 文章目录前言部署rook-ceph on kubernets条件Ceph快照概述什么是PVC安装快照控制器和CRD1.安装crds资源2.安装控制器3.安装快照类前言 Rook 是一个开源的云原生存储编排器&#xff0c;为各种存储解决方案提供平台、框架和支持&#xff0c;以便与…

springcloud04——网关gateway、熔断器 sentinel

目录 注册中心 nacos | eurekaServer |zookeeper(dubbo) 配置中心 nacos | config Server 远程服务调用 httpClient | RestTemplate | OpenFeign 负载均衡服务 ribbon | loadbalancer 网关 zuul | gateway 熔断器 hystrix | sentinel 网关 sentinel 流控 压测工具 1…

XSS跨站脚本攻击详解

一、XSS攻击简介跨站脚本攻击的英文全称是Cross-Site Scripting&#xff0c;为了与CSS有所区别&#xff0c;因此缩写为“XSS”由于同源策略的存在&#xff0c;攻击者或者恶意网站的JavaScript代码没有办法直接获取用户在其它网站的信息&#xff0c;但是如果攻击者有办法把恶意的…

Linux /proc/目录详解

文章目录前言文件说明注意事项前言 在 Linux 系统中&#xff0c;/proc 目录是一个特殊的虚拟文件系统&#xff0c;它提供了对系统内核和进程的访问。/proc 目录中的文件和目录不是真实存在的&#xff0c;它们是在运行时由内核动态生成的&#xff0c;用于提供系统和进程的相关信…

北斗变形监测在地质灾害监测中的应用

内容概要 北斗形变监测系统在地质灾害监测领域发挥着核心作用&#xff0c;该系统基于北斗卫星导航技术&#xff0c;实现对地表变形的精确追踪。通过毫米级精度定位能力&#xff0c;北斗形变监测技术为滑坡等灾害提供关键数据支撑&#xff0c;尤其在偏远地区应用中&#xff0c;单…

2025新征程杯全国54校园足球锦标赛在北京世园公园隆重开幕

2025年8月1日&#xff0c;备受瞩目的2025新征程杯全国54校园足球锦标赛&#xff08;北京&#xff09;在北京世园公园盛大拉开帷幕。开幕式上&#xff0c;中国关心下一代健康体育基金会副秘书长、中国青少年研究会理事、全国 54 校园足球人才培养计划创始人何占强主任表示&#…

分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测

分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测 目录分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测分类效果基本介绍程序设计分类效果 基本介绍 1.Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测&#xff0c;运…

机器学习——逻辑回归(LogisticRegression)的核心参数:以约会数据集为例

理解 LogisticRegression 的核心参数&#xff1a;以约会数据集为例 逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习中一种基础且重要的分类算法&#xff0c;特别适用于解决二分类和多分类问题。本文将基于 sklearn.linear_model.LogisticRegression 的用法&a…

深入解析 Apache Flink FLIP-511:优化 Kafka Sink 事务处理,减轻 Broker 负载

一、 背景与核心问题&#xff1a;Kafka Sink 事务的痛点 Flink Kafka Sink 在 Exactly-Once 模式下依赖 Kafka 事务来确保数据写入的原子性&#xff0c;并与 Flink 检查点对齐。然而&#xff0c;非优雅关闭&#xff08;如任务失败、非 stop-with-savepoint 的停止&#xff09;会…

设计模式:组合模式 Composite

目录前言问题解决方案结构代码前言 组合是一种结构型设计模式&#xff0c;你可以使用它将对象组合成树状结构&#xff0c;并且能像使用独立对象一样使用它们。 问题 如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如&#xff0c; 你有两…

嵌入式 C 语言入门:函数封装与参数传递学习笔记 —— 从定义到内存机制

前言 大家好&#xff0c;这里是 Hello_Embed。在前一篇笔记中&#xff0c;我们用循环实现了 LED 闪烁&#xff0c;其中重复使用了两段几乎一样的延时代码&#xff1a; for(i 0; i < 100000000; i); // 延时这种重复不仅让代码冗余&#xff0c;还不利于后续修改&#xff08…

第一个大语言模型的微调

模型推理 现在,我们的模型应该能够针对输入的任何短句生成类似尤达大师风格的句子作为回应。 该模型要求其输入格式规范。我们需要构建一个 “消息” 列表 —— 在这个案例中,就是来自用户的消息 —— 并通过提示表明轮到模型进行输出,以促使其做出回答。 add_generation…

Linux内核驱动开发核心问题全解

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry Linux内核驱动开发核心问题全解 本文系统梳理了 Linux 驱动开发、内核同步、中断处理、内存管理、进程通信、系统启动等典型…

【C++篇】C++11入门:踏入C++新世界的大门

文章目录C11简介列表初始化1. {}初始化2. initializer_list容器initializer_list的使用场景声明1. auto2. decltype3. nullptrSTL中的变化1. 新容器array容器forward_list容器unordered_map和unordered_set容器2. 新接口C11简介 C98/03&#xff1a;在2003年C标准委员会曾经提交…

Java 日期时间处理:分类、用途与性能分析

Java提供了多种日期时间处理API&#xff0c;随着版本演进不断改进。以下是主要日期时间类的分类、用途和性能分析&#xff1a;一、Java日期时间API分类1. 传统日期时间API (Java 1.0/1.1)java.util.Date - 表示特定的瞬间&#xff0c;精确到毫秒java.util.Calendar - 抽象类&am…

[Linux]学习笔记系列 --GCC

文章目录属性__cleanup__attribute_malloc__ 用于标记函数返回一个新分配的内存块__attribute_alloc_size__ 用于指定分配的内存大小__attribute__((const)) 标记为纯函数(pure function)__attribute__((__externally_visible__)) 使其在编译器优化过程中保持对外部模块的可见性…