MySQL学习(索引)

news2024/11/15 21:49:07

文章目录

  • 基本概念
  • 单列索引
    • 普通索引(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和geometry
     point:点,坐标值
     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.coloradmin.cn/o/2155972.html

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

相关文章

云手机的海外原生IP有什么用?

在全球数字化进程不断加快的背景下,企业对网络的依赖程度日益加深。云手机作为一项创新的工具,正逐步成为企业优化网络结构和全球业务拓展的必备。尤其是云手机所具备的海外原生IP功能,为企业进入国际市场提供了独特的竞争优势。 什么是海外原…

高等数学——微分学

1. 一元函数微分学 1.1. 导数概念 1.2. 导数运算 1.3. 导数与几何 2. 多元函数微分学 2.1. 多元函数的极限 2.1.1. 计算 直接代入法 无穷小乘有界 有理化型 等价无穷小型 ……总结 2.1.2. 是否存在 考试中,判断极限是否存在的问题,答案一般都是不存在。因为,证明一个…

视频怎么剪切掉一部分?6款视频剪切软件,零基础也能快速学会!

您是否也曾遇到了这样的一个问题:在录制完视频之后,发现视频中存在一些多余或者不想要的片段,想要将它剪切掉却不知道具体要怎么操作?别担心,几乎所有视频都会需要这样的调整才能更加出色。如果您是刚入门的视频剪辑初…

MATLAB中多张fig图合并为一个图

将下列两个图和为一个图 打开查看-----绘图浏览器 点击第一幅图中曲线右键复制,到第二幅图中粘贴即可完成

设计模式之组合模式例题

答案:C A 知识点:组合模式的意图:将对象组合成树型结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性

TMS320F28335的RS232 通信实验

TMS320F28335 内部含有非常多的通信接口,其中串口是通信接口中应用 非常广泛之一,开发板上集成了一个 RS232 模块,其中串口就是接在 F28335 芯 片的 SCIA 接口。 F28335 通过 SCIA 实现与 PC 机对话,F28335 的 SCIA 收到 PC 机发来的数据后 原封不动的返回给 PC 机显示,定…

分布式项目-开盒头条

开盒头条 前言 只懂得技术理论是远远不够的,还需要熟练掌握很多业务功能逻辑的实现,这样才能真正的提高自己的开发水平。因此,我新开了这个专栏,专门做项目,教给大家很多业务功能实现的逻辑以及在实现这些业务功能时…

双向链表-

链表特性:带头/不带头 循环/非循环 --->排列组合后,共有8种链表结构 一.双向链表的定义 前一个节点存了后一个节点的地址,后一个节点也存了前一个节点的地址,即循环链表 二.代码解析 //双向链表 //与非循环链表区别&#…

基于SpringBoot+Vue+MySQL的医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会,随着医疗服务需求的不断增长和医疗信息化的快速发展,提升医院管理效率和服务质量成为了医疗行业的核心需求。传统的医院管理模式面临着效率低下、资源分配不均、患者就医体验差等问题。为了应…

react hooks--useReducer

概述 很多人看到useReducer的第一反应应该是redux的某个替代品,其实并不是 ◼ useReducer仅仅是useState的一种替代方案:  在某些场景下,如果state的处理逻辑比较复杂,我们可以通过useReducer来对其进行拆分; 或…

分布式事务详细笔记:什么是分布式事务--Seata--XA模式--AT模式

目录 1.分布式事务 1.1.什么是分布式事务 1.2.认识Seata 1.3.部署TC服务 1.3.1.准备数据库表 1.3.2.准备配置文件 1.3.3.Docker部署 1.4.微服务集成Seata 1.4.1.引入依赖 1.4.2.改造配置 1.4.3.添加数据库表 1.5.XA模式 1.5.1.两阶段提交 1.5.2.Seata的XA模型 1…

【C++】C++入门概念(二)

引用 概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 比如:李逵,在家称为"铁牛",江湖上人称"黑旋…

C++从入门到起飞之——多态 全方位剖析!

🌈个人主页:秋风起,再归来~🔥系列专栏:C从入门到起飞 🔖克心守己,律己则安 目录 1. 多态的概念 2. 多态的定义及实现 2.1 多态的构成条件 2.1.1 实现多态还有两个必须重要条件&…

数据结构-树和二叉树

树 和 二叉树 1.树的概念 树 tree 是n(n>0)个节点的有限集 在任意的一个非空树中 (1)有且仅有一个特定的被称为 根(root) 的节点 (2)当n>1时, 其余的节点可分为m(m>0)个互不相交的有限集T1, T2, T3, .... …

Java 入门指南:JVM(Java虚拟机)—— Java 类加载器详解

类加载器 类加载器(Class Loader)是 Java 虚拟机(JVM)的一部分,它的作用是将类的字节码文件(.class 文件)从磁盘或其他来源加载到 JVM 中。类加载器负责查找和加载类的字节码文件,并…

HTML和CSS做一个无脚本的手风琴页面(保姆级)

一、前言 使用HTML和CSS做一个无脚本的手风琴页面。让知识以自己喜欢的方式进入脑子,适用于很多场景,比如以下: 【注:图片源自百度】 二、HTML框架 使用外部样式表,将CSS文件用link标签引入 整体框架如下图&#x…

基于微信小程序的游泳馆管理系统--论文源码调试讲解

2 关键技术介绍 2.1 SSM框架 开发信息管理系统的主流框架是SSM(Spring Spring MVC MyBatis),SSM框架web层使用Spring MVC框架,使传输前后端数据变得简单;对于业务层使用Spring作为轻量级控制反转和面向切面的容器框…

Leetcode面试经典150题-39.组合总数

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如…

基于Ambari搭建hadoop生态圈+Centos7安装教程

当我们学习玩搭建hadoop的时候,未免也会遇见很多繁琐的事情,比如很多错误,需要解决。在以后公司,也不可能让你一个一个搭建hadoop,成千上万的电脑,你在一个个搭建,一个个报错,而且每…

深度学习与应用:人体关键点检测

实验二 深度学习与应用:人体关键点检测 1、 实验目的 了解人体关键点检测基础流程熟悉YOLOV7-pose模型结构掌握 YOLOv7-pose 模型的训练、Fine-tuning 以及推理的能力掌握YOLOV7-pose模型对实际问题的应用能力,了解如何在特定的场景和任务中应用该模型…