MySQL从入门到高级 --- 10.索引

news2024/11/17 3:55:39

文章目录

    • 第十章:
      • 10.索引
        • 10.1 分类
        • 10.2 创建索引
          • 10.2.1 单列索引 - 普通索引
          • 10.2.2 查看索引
          • 10.2.3 删除索引
          • 10.2.4 单列索引 - 唯一索引
          • 10.2.5 单列索引 - 主键索引
          • 10.2.6 组合索引
        • 10.3 全文索引
          • 10.3.1 概述
          • 10.3.2 使用
        • 10.4 空间索引
          • 10.4.1 操作
        • 10.5 原理
          • 10.5.1 相关算法
            • Hash算法
            • 二叉树
            • 平衡二叉树
            • BTREE树
            • B-Trees树
            • B+Trees树
        • 10.6 MyISAM引擎使用B+Tree
        • 10.7 InnoDB引擎使用B+Tree
        • 10.8 索引特点
        • 10.9 使用原则

第十章:

10.索引

  • 索引通过某种算法,构建出一个数据模型,用来快速查找在某个列中有一特定值的行,若表中查询的列有一个索引,MySQL能快速到达一个位置去搜索数据文件,而不必查看所有数据,将会节省很多时间
10.1 分类
  • Hash索引

  • B+Tree索引

Hash

在这里插入图片描述

B+Tree

在这里插入图片描述

功能划分

在这里插入图片描述

  • 单列索引:一个索引包含单个列,但一个表中可有多个单列索引

  • 普通索引:允许在定义索引的列中插入重复值和空值,没太多限制

10.2 创建索引
10.2.1 单列索引 - 普通索引

语法

-- 法1 创建表时直接指定
create database mydb12;
use mydb12;
create table stu(
    sid int primary key,
    name varchar(20),
    gender varchar(20),
    age int,
    score double,
    index index_name(name) -- name列创建索引
);

-- 法2 直接创建
-- create index indexname on tablename(columnname);
create index index_gender on stu(gender);

-- 法3 修改表结构
-- alter table tablename add index index_name(columnname);
alter table stu add index index_age(age);

在这里插入图片描述

10.2.2 查看索引

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

10.2.3 删除索引

语法

drop index 索引号 on 表名

alter table 表名 drop index 索引名

drop index index_gender on stu;
alter table stu drop index index_name;
10.2.4 单列索引 - 唯一索引
  • 索引列的值必须唯一,但允许有空值

语法

-- 法1 创建表时直接指定
create table stu2(
    sid int primary key,
    id varchar(20),
    name varchar(20),
    gender varchar(20),
    age int,
    score double,
    unique index_id(id) -- id列创建索引
);

-- 法2 直接创建
-- create unique index index_name on tablename(columnname);
create unique index index_gender on stu2(gender);

-- 法3 修改表结构
-- alter table tablename add unique index_name(columnname);
alter table stu2 add unique index_age(age);
10.2.5 单列索引 - 主键索引
  • 一种特殊的唯一索引,在创建表时,会自动在主键列上建立一个索引

在这里插入图片描述

10.2.6 组合索引
  • 也被称为复合索引,在建立索引时使用多个字段。使用复合最左原则

语法

create index indexname on table_name(column(length, column2(length));

create index index_age_score on stu2(age,score);

操作:

select * from stu2 where score = 88; -- 1
select * from stu2 where age = 20 ; -- 2
select * from stu2 where age = 20 and score = 88; -- 3
select * from stu2 where score = 88 and age = 20; -- 4
-- 2、3、4因为条件里必须包含索引前面的字段才能进行匹配,可用到索引index_age_score
-- 3、4相比where条件顺序不一样,在mysql中它们等价
10.3 全文索引
10.3.1 概述

关键字:fulltext

作用:查找文本中的关键字

使用like + %可实现模糊匹配,在大量数据里,全文索引比它快很多倍,不是一个量级,但全文索引精度可能存在问题

变量

  • 最小搜索长度

  • 最大搜索长度

搜索时,词语需在最小搜索长度和最大搜索长度的区间内

-- 查看这两个变量的默认值
show variables like '%ft%';
10.3.2 使用

关键字:match、against

语法:match(col1, col2, …) against(expr [search_modifier])

create table article(
    id int primary key auto_increment,
    title varchar(255),
    content varchar(999),
    writing date,
    fulltext(content) -- 创建全文索引
);

-- 添加全文索引
create fulltext index index_content on article(content);

-- 修改表结构添加全文索引
alter table article add fulltext index_content(content);
drop table article;
insert into article values(null,'zoo', 'yesterday one zoo animal hav dog and cat', '2004-01-26');
insert into article values(null,'food', 'you one food hav milk you you and bread', '2004-02-16');

insert into article values(null,"hair", "yesterday you one hair hav you short you",'2004-05-27');

select * from article where match(content) against('yo'); -- 无
select * from article where match(content) against('you'); -- 有 
select * from article where content like '%you%';
10.4 空间索引
  • 空间索引是对空间数据类型的字段建立的索引

  • 创建空间索引的列,必须将其声明NOT NULL

  • 使用SPATIAL关键字进行扩展,使能够用于创建正规索引类型的语法创建空间索引

数据类型

  • GEOMETRY

  • POINT

  • LINESTRING

  • POLYGON

10.4.1 操作

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

10.5 原理

索引本身很大,不可能全部存储在内存中,索引往往以索引文件的形式存储磁盘上。查找过程要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高很大,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

10.5.1 相关算法

Data Structure Visualization (usfca.edu)

Hash算法

在这里插入图片描述

  • 优点:通过字段值计算的hash值,定位数据快

  • 缺点:不能进行范围查找,散列表中的值是无序的,无法进行大小比较

二叉树

在这里插入图片描述

  • 特征:分为左子树、右子树和根节点,左子树比根节点值小,右子树比根节点值大

  • 缺点:有可能产生不平衡

平衡二叉树

在这里插入图片描述

特征

  • 左子树和右子树都是平衡二叉树

  • 左子树比中间值小, 右子树比中间值大

  • 左子树和右子树的深度之差的绝对值不超过1

缺点

  • 插入操作要旋转

  • 支持范围查询,但回旋查询效率较低

  • 树高度越高,查询效率会越慢

BTREE树
  • 目前大多数数据库系统及文件系统都采用B-Tree或B+Tree作为索引结构,Btree结构可有效解决之前相关算法所遇到的问题
B-Trees树

在这里插入图片描述

B+Trees树

在这里插入图片描述

10.6 MyISAM引擎使用B+Tree

在这里插入图片描述

10.7 InnoDB引擎使用B+Tree
  • 叶节点的data域存放数据,比MyISAM效率高一点,但比较占硬盘内存大小

在这里插入图片描述

10.8 索引特点

优点

  • 加快查询数据的速度

  • 显著减少查询时分组和排序的时间

  • 创建唯一索引,能保证数据库每一行数据的唯一

  • 实现数据的参考完整性方面,可加速表与表之间的连接

缺点

  • 随着数据量的增加,消耗时间也会增加

  • 需要占磁盘空间

  • 对数据表中数据进行增删改时,索引也要动态维护,降低了维护的速度

10.9 使用原则
  • 更新频繁的列不设索引

  • 数据量小的表不使用索引

  • 重复数据多的字段不设索引

  • 有限考虑对where和order by所涉及的列上建立索引

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

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

相关文章

Java进阶:详解与实战Java Stream API

Java进阶:详解与实战Java Stream API 🌟 Java进阶:详解与实战Java Stream API 🌟摘要引言一、Java Stream API介绍📚1. 什么是Java Stream API?2. Java Stream API支持的功能3. 使用Java Stream API的优势…

视频播放器-Kodi

一、前言 Kodi 是一款开源免费的多媒体播放软件。Kodi 是由非营利性技术联盟 Kodi 基金会开发的免费开源媒体播放器应用程序。 Kodi是一款免费和开源(遵循GPL协议)的多媒体播放器和娱乐中心软件,由XBMC基金会开发。Kodi的主要功能是管理和播…

mac brew 命令详解

brew 是 macOS 系统中 Homebrew 的命令行工具,用于在 macOS 上安装、更新和管理各种软件包。以下是对 brew 命令的详细介绍,按照功能和使用频率进行分点和归纳: 1. 安装和卸载软件包 安装软件包:使用 install 命令,后…

Golang | Leetcode Golang题解之第113题路径总和II

题目: 题解: type pair struct {node *TreeNodeleft int }func pathSum(root *TreeNode, targetSum int) (ans [][]int) {if root nil {return}parent : map[*TreeNode]*TreeNode{}getPath : func(node *TreeNode) (path []int) {for ; node ! nil; no…

五分钟”手撕“异常

目录 一、什么是异常 二、异常的体系和分类 三、异常的处理 1.抛出异常 2.异常的捕获 异常声明throws: try-catch处理 四、finally finally一定会被执行吗? 五、throw和throws区别 六、异常处理的流程 七、自定义异常 一、什么是异常 顾名…

每日练习——同余方程以及格雷码

同余方程 题目描述 运行代码 #include<iostream> #define ll long long using namespace std; ll exgcd(ll a, ll b, ll& x, ll& y) {if (!b)return x 1, y 0, a;ll d exgcd(b, a % b, y, x);y - a / b * x;return d; } int main() {ll a, b, x, y;cin >…

nodeJs上

文章目录 使用node执行js脚本文件流程示例读文件写文件 node构建web服务器流程根据不同请求路径返回不同数据核心模块模块系统ip地址和端口号的概念响应内容类型Content-type 初步实现Apache功能第三方模块 使用node执行js脚本文件 流程 1.创建js脚本文件 2.打开终端&#xf…

5月21号作业

思维导图 代码实现 TCP域套接字服务器 #include <header.h> #include <math.h>int main(int argc, const char *argv[]) {//为通信创建一个端点int sfdsocket(AF_UNIX,SOCK_STREAM,0);//参数1&#xff1a;说明使用的三ipv4通信域//参数2&#xff1a;说明使用的三…

你真的了解HTTPS协议吗

前言 在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。使用 HTTPS 通信机制可以有效地防止这些问题。本文即将带大家来了解这些。 任何事物都有两面性&#xff0c;为了满足HTTP协议的快&#xff0c;但导致了它有如下的不足&#xff1a; 通信采用明文&#xff08;不加…

【Linux-INPUT输入的子系统】

Linux-INPUT输入的子系统 ■ input 子系统简介■ input 驱动编写流程■ ■ input 子系统简介 input 子系统就是管理输入的子系统&#xff0c; input 子系统分为 input 驱动层、 input 核心层、 input 事件处理层&#xff0c;最终给用户空间提供可访问的设备节点 ■ input 驱…

模仿高效网络进行目标检测——知识蒸馏

摘要 链接&#xff1a;https://openaccess.thecvf.com/content_cvpr_2017/papers/Li_Mimicking_Very_Efficient_CVPR_2017_paper.pdf 当前的基于卷积神经网络&#xff08;CNN&#xff09;的目标检测器需要从预训练的ImageNet分类模型中初始化&#xff0c;这通常非常耗时。在本…

【除自身以外数组的乘积】python

目录 思路&#xff1a; 代码&#xff1a; 思路&#xff1a; 直接计算前缀乘积&#xff0c;后缀乘积&#xff0c;然后相乘即可 开始我还在想&#xff0c;遍历一次i&#xff0c;怎么能同时计算前缀乘积和后缀乘积&#xff0c;事实上分开计算比较方便。。 代码&#xff1a; cl…

数据集002:眼疾识别数据集 (含数据集下载链接)

说明 病理性近视&#xff08;Pathologic Myopia&#xff0c;PM&#xff09;的医疗类数据集&#xff0c;包含1200个受试者的眼底视网膜图片&#xff0c;训练、验证和测试数据集各400张。 说明&#xff1a; 如今近视已经成为困扰人们健康的一项全球性负担&#xff0c;在近视人…

CMS Full GC流程以及调优配置

个人博客 CMS Full GC流程以及调优配置 | iwts’s blog CMS CMS 收集器是以实现最短 STW 时间为目标的收集器&#xff0c;所以对于偏业务的后台开发而言&#xff0c;基本上都无脑选CMS了。 多线程收集器&#xff0c;工作在老年代&#xff0c;采用标记清除算法。比较特殊&am…

Three.js 研究:3、创建一个高科技圆环

打开Alpha混合 修改环形颜色&#xff0c;更改发光的颜色&#xff0c;更改发光的强度为2 更改世界环境灯光

基于集成经验模态分解的心电信号降噪和基于希尔伯特变换的R峰检测(MATLAB R2018)

近年来&#xff0c;心脏病已成为危害人类健康最常见的疾病。为了有效预防心脏疾病的发生&#xff0c;往往需要更加准确地采集与诊断心电信号&#xff0c;以便于更好地反映心脏情况。心电信号作为人体生理信号&#xff0c;对于识别心脏异常和心脏疾病具有重要的参考价值。心电信…

Docker 常用命令大全!!

Docker 常用命令 一、启动类1. 启动 docker2. 关闭 docker3. 重新启动 docker4. docker 设置自启动5. 查看 docker 运行状态6. 查看 docker 版本号等信息7. docker 帮助 二、 镜像类1. 查看镜像2. 搜索镜像3. 拉取镜像4. 运行镜像5. 删除镜像6. 加载镜像7. 保存镜像 三、容器类…

电机转速计算(基于码盘和IO外部中断)

目录 概述 1 硬件介绍 1.1 整体硬件结构 1.2 模块功能介绍 2 测速框架介绍 2.1 测速原理 2.2 软件框架结构 3 使用STM32Cube配置Project 3.1 准备环境 3.2 配置参数 3.3 生成Project 4 功能实现 4.1 电机控制代码 4.2 测试代码 4.3 速度计算 5 测试 5.1 编写测…

0基础认识C语言

为了给0基础一个舒服的学习路径&#xff0c;就有了这个专栏希望带大家一起进步。 话不多说&#xff0c;开始正题。 一、C语言的一段小历史 C语言的设计要追溯到20世纪60年代末和70年代初&#xff0c;在那个时代美国有这么一号人叫做丹尼斯.里奇&#xff0c;他和同事肯.汤普逊…

pyqt 浮动窗口QDockwidget

pyqt 浮动窗口QDockwidget QDockwidget效果代码 QDockwidget QDockWidget 是 PyQt中的一个控件&#xff0c;它提供了一个可以停靠在主窗口边缘或者浮动在屏幕上的窗口小部件&#xff08;widget&#xff09;。QDockWidget 允许用户自定义其界面&#xff0c;并提供了灵活的停靠和…