MySQL学习(索引)

文章目录

  • 基本概念
  • 单列索引
    • 普通索引(index)
    • 唯一索引(unique)
    • 主键索引
  • 组合索引
  • 全文索引(fulltext)
  • 空间索引(spatial)
  • MySQL存储引擎

基本概念

  • 通过某种算法,构建数据模型,用于提高数据库查询的效率

  • 索引的原理
    哈希(hash)索引
    索引值x—>f(x)—>地址
    哈希冲突:多个索引值对应一个地址
    优点:通过字段值计算hash值,定位数据速度快
    缺点:不能使用范围查询
    二叉树
    左子树小于根节点,右子树大于根节点
    缺点:可能产生不平衡,形成向右的斜线,类似链表结构
    平衡二叉树
    特点:与二叉树相比,左右子树的深度之差不超过1
    缺点:插入数据时需要旋转,范围查询时需要回旋,效率低
    B+TREE索引
    特点:所有数据都存储在叶子节点,使用双向链表存放,非叶子节点不存储数据,当范围查找时很方便

下面两幅图分别为B-TREE和B+TREE
在这里插入图片描述
在这里插入图片描述
MyISAM引擎叶节点存放的是数据地址
InnoDB引擎叶节点存放的是数据,效率高于MyISAM,但需要额外的磁盘空间

  • 创建索引的原则
    1. 更新频繁的列不设置索引
    2. 数据量小的表不设置索引
    3. 重复数据多的列(超过15%)不设置索引
    4. 先考虑对where和order by子句中经常出现的列建立索引
  • 索引的优点
    1. 加快数据检索速度
    2. 使用分组和排序进行数据查询时,可以减少排序和分组的时间
    3. 唯一索引,避免同一个字段出现重复的值
    4. 加速表和表之间的连接
  • 索引的缺点
    1. 创建索引和维护索引需要时间成本,并且随着数据量的增加而增加
    2. 索引需要占物理空间,除了数据表占用数据空间外,每一个索引还要占一定的物理空间
    3. 降低数据更新表的速度,因为索引需要动态维护
create database IF NOT EXISTS mydb_index;
use mydb_index;

单列索引

  • 一个索引只包含一个列,一个表中可以有多个单列索引
    包含普通索引、唯一索引和主键索引

普通索引(index)

  • 没有限制,允许在定义索引的列中插入重复值和空值
  • 创建索引
-- 创建方式1-创建表时创建
create table if not exists student(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date,phone_num varchar(20),score double,index index_name(name) -- 给name创建普通索引
);select * from student where name = 'zhangsan';
-- 创建方式2-创建表后创建create index index_gender on student(gender);
-- 创建方式3-修改表结构alter table student add index index_age(age);
  • 查看索引
-- 查看数据库所有索引
select * from mysql.innodb_index_stats a where a.database_name = 'mydb_index';
-- 查看表所有索引
show index from student;    -- 信息较少
select * from mysql.innodb_index_stats a where a.database_name = 'mydb_index' and a.table_name like 'student';    -- B+树索引
  • 删除索引
drop index index_name on student;
alter table student drop index index_age;

唯一索引(unique)

  • 在普通索引的基础上,增加唯一约束,允许有空值
-- 创建方式1-创建表时创建
create table if not exists student2(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date,phone_num varchar(20),score double,unique index_card_id(card_id) -- 给card_id创建唯一索引
);
-- 查看student2的索引
select * from mysql.innodb_index_stats a where a.database_name = 'mydb_index' and a.table_name like 'student2';
-- 创建方式2-创建表后创建
create unique index index_card_id on student2(card_id);
-- 创建方式3-修改表结构
alter table student2 add unique index_phone_num(phone_num);

主键索引

  • 在创建表时,主键列自动创建主键索引,唯一且不允许有空值

组合索引

  • 也叫复合索引,一个索引包含多个列,可以是普通索引也可以是唯一索引
  • 最左原则,从左往右,一个查询时只能使用组合索引中的最左列,索引列顺序无所谓
 -- 普通索引create index index_phone_name on student(phone_num, name);-- 唯一索引create unique index index_card_phone on student(card_id, phone_num);

全文索引(fulltext)

  • 专门用于搜索很长一篇文章时查询,基于相似度查询
/*适用的字段数据类型:varchar、text、char数据量较大时,先创建表放入数据再创建索引,相比于给全文索引的表插入数据要更快适用MySQL版本和引擎:MySQL5.6+,InnoDB和MyISAM、MySQL5.6-,MyISAM关键字:match和against对一个词语使用全文索引搜索,长度必须在最小搜索长度和最大搜索长度之间,查看语句为:show variables like '%ft%';
*/
  • 查看全文检索
show variables like '%ft%';
  • 创建全文索引(先创建表添加数据,再创建索引)
  1. 创建适合添加全文索引的表
                create table if not exists t_artice(id int primary key auto_increment,title varchar(255),content varchar(1000),writing_date date);
  1. 添加数据
 insert into t_artice values(null, 'MySQL', 'MySQL is a relational database management system', '2024-01-23');insert into t_artice values(null, 'Sigmoid', 'Sigmoid gives probabilistic meaning to the output of neurons', '2024-02-23');insert into t_artice values(null, 'GAN', 'The GAN network consists of a generator and a discriminator, which work against each other to get the generator that can generate the most realistic new sample image', '2024-03-23');insert into t_artice values(null, 'RNN', 'RNN network is a special kind of neural network that can learn sequence data', '2024-04-23');insert into t_artice values(null, 'LSTM', 'LSTM is a special type of RNN that is capable of learning long-term dependent information', '2024-05-23');insert into t_artice values(null, 'Transformer', 'Transformer essentially spatializes sequence data through location coding', '2024-06-23');insert into t_artice values(null, 'Mamba', 'Mamba is essentially an improvement of the SSM model, letting go of the assumptions of linearity and time invariance', '2024-07-23');        
  1. 创建全文索引(两种方式)
 alter table t_artice add fulltext index_content(content);create fulltext index index_content on t_artice(content);
  1. 查询(match后跟列名,against后跟查询的关键词)
select * from t_artice where match(content) against('gives');

空间索引(spatial)

  • 创建的列必须非空
/*对空间类型的字段建立的索引,4种空间数据类型:point、linestring、polygon和geometrypoint:点,坐标值linestring:线,由点连接而成polygon:多边形,由线组成geometry:几何,任何一种空间类型
*/
        create table if not exists shop_info(id int primary key auto_increment comment 'id',shop_name varchar(64) not null comment '店铺名称',geom_point geometry not null comment '店铺经纬度',spatial key geom_index(geom_point));

MySQL存储引擎

  • MySQL的存储引擎:是数据库底层软件组织,数据库管理系统使用数据引擎来存储、检索、更新和删除数据。不同存储引擎提供不同存储机制、索引技巧、锁定水平等功能。
    1. MyISAM:较高的插入、查询速度,但不支持事务处理。
    2. InnoDB:支持ACID事务、行级锁定和外键约束,具有事务安全性和崩溃修复能力。
  • 修改MySQL默认存储引擎:
    1. 在任务管理器关闭MySQL服务
    2. 修改my.ini文件中default-storage-engine=MyISAM为default-storage-engine=InnoDB
    3. 重启MySQL服务
    -- 查看存储引擎show engines;-- 查看当前默认引擎show variables like '%default_storage_engine%';-- 查看表使用的存储引擎show create table student;-- 创建表时指定存储引擎create table if not exists student3(id int, name varchar(20)) engine=MyISAM;-- 修改存储引擎alter table student3 engine=InnoDB;

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

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

相关文章

LeetCode 2374.边积分最高的节点:模拟

【LetMeFly】2374.边积分最高的节点:模拟 力扣题目链接:https://leetcode.cn/problems/node-with-highest-edge-score/ 给你一个有向图,图中有 n 个节点,节点编号从 0 到 n - 1 ,其中每个节点都 恰有一条 出边。 图…

k8s中pod的创建过程和阶段状态

管理k8s集群 kubectl k8s中有两种用户 一种是登录的 一种是/sbin/nologin linux可以用密码登录,也可以用证书登录 k8s只能用证书登录 谁拿到这个证书,谁就可以管理集群 在k8s中,所有节点都被网络组件calico设置了路由和通信 所以pod的ip是可以…

如何使用 maxwell 同步到 redis?

文章目录 1、MaxwellListener2、MxwObject1. 使用Maxwell捕获MySQL变更2. 将Maxwell的输出连接到消息系统3. 从消息系统读取数据并同步到Redis注意事项 1、MaxwellListener package com.atguigu.tingshu.album.listener;import com.alibaba.fastjson.JSON; import org.apache.…

mysql中的json查询

首先来构造数据 查询department里面name等于研发部的数据 查询语句跟普通的sql语句差不多,也就是字段名要用到path表达式 select * from user u where u.department->$.name 研发部 模糊查询 select * from user u where u.department->$.name like %研发%…

Go-知识recover

Go-知识recover 1. 介绍2. 工作机制2.1 recover 定义2.2 工作流程2.3 总结 3. 原理3.1 recover函数的真正逻辑3.2 恢复逻辑3.3 生效条件 4. 总结4.1 recover的返回值是什么?4.2 执行recover之后程序将从哪里继续运行?4.3 recover为什么一定要在defer中使…

无法删除选定的端口,不支持请求【笔记】

场景:在删除打印机端口时,提示:“无法删除选定的端口,不支持请求”,如下图所示。 以下以删除USB036端口为示例,操作步骤如下: 在注册表编辑器中,从以下注册表项中“计算机\HKEY_LO…

Spring中存储Bean的常见注解

目录 IoC & DI IOC(控制反转)详解 依赖注入的三种方式 IoC & DI IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器. 控制反转:也就是控制权反转. 什么的控制权发⽣了反转? 获得依赖对…

Python增强办公效率的11个实用代码段

如果你正在学习Python,那么你需要的话可以,点击这里👉Python重磅福利:入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享! 引言 在日常工作中,许多任务可以通过编程自动化来提高效率。本…

算法入门-贪心2

第八部分:贪心 561.数组拆分(简单) 题目:给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最…

Three.js 3D人物漫游项目(下)

本文目录 前言最终效果1、效果回顾2、编写人物模型动画执行类并调用2.1 代码2.2 代码解读2.3 实例化动画类并调用2.4 效果2.4.1 休息动画2.4.2 跑步动画2.4.3 走路动画2.4.4 舞蹈1动画2.4.5 舞蹈2动画3、键盘控制动画3.1 站立休息、走、跑、舞蹈1、舞蹈2代码3.1.1 效果3.2 跳跃…

基于丹摩智算平台-手把手拿下经典目标检测模型 Faster-Rcnn

文章目录 1. 前言1. 1 丹摩智算平台1.2 经典目标检测模型 Faster-Rcnn 2. 前置准备2.1 WindTerm(远程连接服务器)2.2 项目源码 3. 服务器平台配置3.1 创建实例3.2 远程链接 4. Faster-rcnn 的环境配置4.1 上传文件,解压4.2 安装所需环境 5. 数…

华为HarmonyOS地图服务 1 -- 如何实现地图呈现?

如何使用地图组件MapComponent和MapComponentController呈现地图,效果如下图所示。 MapComponent是地图组件,用于在您的页面中放置地图。MapComponentController是地图组件的主要功能入口类,用来操作地图,与地图有关的所有方法从此…

基于PaddlePaddle复现的PeleeNet

转自AI Studio,原文链接:基于PaddlePaddle复现的PeleeNet - 飞桨AI Studio PeleeNet: An efficient DenseNet architecture for mobile devices 1. 简介 这是一个PaddlePaddle实现的PeleeNet。 PeleeNet是一个高效的卷积神经网络(CNN&…

数通。。。

通信:需要介质才能通信电话离信号塔(基站)越远,信号越弱。信号在基站之间传递。你离路由器越远,信号越差。一个意思 比如想传一张图片,这张图片就是数据载荷 网关,分割两个网络。路由器可以是网…

【贪心算法】贪心算法二

贪心算法二 1.最长递增子序列2.递增的三元子序列3.最长连续递增序列 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.最长递增子序列 题目链…

AI免费UI页面生成

https://v0.dev/chat v0 - UI设计 cursor - 编写代码 参考:https://www.youtube.com/watch?vIyIVvAu1KZ4 界面和claude类似,右侧展示效果和代码 https://pagen.so/

用uniapp 及socket.io做一个简单聊天 升级 9

比这之前优化了以下功能 上线通知 群聊里适时显示在线人数 约请好友 通过好友通过socket 相应端自动变化 PC端可以拉取摄象头拍照 PC端可以录音发送 拉起摄象头发送录象 <template><view class""><scroll-view scroll-y"true" class&…

【Linux篇】常用命令及操作技巧(基础篇)

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明帮助命令常见的七个linux操作终端实用的技巧跟文件目录…

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级&#xff0c;手写实现一个微服务熔断限流器 服务雪崩熔断、限流、降级熔断降级限流 手写实现一个微服务熔断限流器架构设计代码实现整体逻辑ProtectorAspect#aroundMethod(ProceedingJoinPoint)具体实现1、获取接口对…

智慧农业——InsectMamba利用状态空间模型对害虫进行分类

介绍 论文地址&#xff1a;https://arxiv.org/abs/2404.03611 害虫分类是农业中的一个重要问题。准确识别有害害虫可减少对作物的损害&#xff0c;确保粮食安全和环境的可持续发展。然而&#xff0c;害虫及其自然环境的高度拟态性和物种多样性使得视觉特征的提取极具挑战性。…