【WEEK7】 【DAY1】索引【中文版】

2024.4.8 Monday

目录

  • 7.索引
    • 7.1.内涵
    • 7.2.索引的作用
    • 7.3.索引的分类
      • 7.3.1.主键索引(PRIMARY KEY)
        • 7.3.1.1.主键 : 某一个属性组能唯一标识一条记录
        • 7.3.1.2.特点 :
      • 7.3.2.唯一索引(UNIQUE KEY)
        • 7.3.2.1.作用 : 避免同一个表中某数据列中的值重复
        • 7.3.2.2.与主键索引的区别:
      • 7.3.3.常规索引(KEY/INDEX)
        • 7.3.3.1.作用 : 快速定位特定数据
        • 7.3.3.2.注意 :
      • 7.3.4.全文索引(FULLTEXT)
        • 7.3.4.1.百度搜索:全文索引
        • 7.3.4.2.作用 : 快速定位特定数据
        • 7.3.4.3.注意 :
        • 7.3.4.4.版本声明等
        • 7.3.4.5.索引的使用
        • 7.3.4.6.例
        • 7.3.4.7.使用全文索引
        • 7.3.4.8.测试索引
    • 7.4.索引准则
    • 7.5.索引的数据结构

7.索引

7.1.内涵

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
提取句子主干,就可以得到索引的本质:索引是数据结构。
https://blog.codinglabs.org/articles/theory-of-mysql-index.html

7.2.索引的作用

  1. 提高查询速度
  2. 确保数据的唯一性
  3. 可以加速表和表之间的连接 , 实现表与表之间的参照完整性
  4. 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间
  5. 全文检索字段进行搜索优化

7.3.索引的分类

7.3.1.主键索引(PRIMARY KEY)

唯一的标识,主键不可重复,只能有一个列作为主键

7.3.1.1.主键 : 某一个属性组能唯一标识一条记录
7.3.1.2.特点 :
  • 最常见的索引类型
  • 确保数据记录的唯一性
  • 确定特定数据记录在数据库中的位置

7.3.2.唯一索引(UNIQUE KEY)

7.3.2.1.作用 : 避免同一个表中某数据列中的值重复
7.3.2.2.与主键索引的区别:
  • 主键索引只能有一个
  • 唯一索引可能有多个
CREATE TABLE `Grade`(
  `GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,
  `GradeName` VARCHAR(32) NOT NULL UNIQUE
   -- 或 UNIQUE KEY `GradeID` (`GradeID`)
)

7.3.3.常规索引(KEY/INDEX)

7.3.3.1.作用 : 快速定位特定数据
7.3.3.2.注意 :
  • index 和 key 关键字都可以设置常规索引
  • 应加在查询找条件的字段
  • 不宜添加太多常规索引,影响数据的插入,删除和修改操作
CREATE TABLE `result`(
   -- 省略一些代码
  INDEX/KEY `ind` (`studentNo`,`subjectNo`) -- 创建表时添加
)
-- 创建后添加
ALTER TABLE `result` ADD INDEX `ind`(`studentNo`,`subjectNo`);

7.3.4.全文索引(FULLTEXT)

7.3.4.1.百度搜索:全文索引
7.3.4.2.作用 : 快速定位特定数据
7.3.4.3.注意 :
  • 只能用于MyISAM类型的数据表
  • 只能用于CHAR , VARCHAR , TEXT数据列类型
  • 适合大型数据集
7.3.4.4.版本声明等
/*
开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况

MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。
测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。
*/
7.3.4.5.索引的使用
/*
#方法一:创建表时
    CREATE TABLE 表名 (
               字段名1 数据类型 [完整性约束条件…],
               字段名2 数据类型 [完整性约束条件…],
               [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
               [索引名] (字段名[(长度)] [ASC |DESC])
               );


#方法二:CREATE在已存在的表上创建索引
       CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
                    ON 表名 (字段名[(长度)] [ASC |DESC]) ;


#方法三:ALTER TABLE在已存在的表上创建索引
       ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                            索引名 (字段名[(长度)] [ASC |DESC]) ;
                           
                           
#删除索引:DROP INDEX 索引名 ON 表名字;
#删除主键索引: ALTER TABLE 表名 DROP PRIMARY KEY;


#显示索引信息: SHOW INDEX FROM student;
*/
7.3.4.6.例
  1. 显示所有的索引信息
-- 索引 --
/* 索引的使用
1. 在创建表的时候给字段增加索引
2. 表创建完毕后,增减索引
*/
-- 显示所有的索引信息
use `school`
SHOW INDEX FROM student
  1. 增加一个全文索引(索引名)列名
-- 增加一个全文索引(索引名)列名
ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`StudentName`)	-- 前面是索引的名字,括号内是字段名
-- 增加后再运行一次SHOW INDEX FROM student,发现索引多了一行

在这里插入图片描述

  1. EXPLAIN 分析sql语句执行性能
-- EXPLAIN 分析sql语句执行性能
EXPLAIN SELECT * FROM student;	-- 非全文索引

在这里插入图片描述

SELECT * FROM student WHERE studentNo = '1000';

在这里插入图片描述

7.3.4.7.使用全文索引
/*使用全文索引*/
-- 全文搜索通过 MATCH() 函数完成。
-- 搜索字符串作为 against() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH() 返回一个相关性值。即,在搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。
SELECT * FROM student WHERE MATCH(studentName) AGAINST('吴')

在这里插入图片描述

7.3.4.8.测试索引
  1. 建表
-- 被存到数据库`school`里了
CREATE TABLE `app_user` (
	`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(50) DEFAULT'' COMMENT'用户昵称',
	`email` VARCHAR(50) NOT NULL COMMENT'用户邮箱',
	`phone` VARCHAR(20) DEFAULT'' COMMENT'手机号',
	`gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(0:男;1:女)',
	`password` VARCHAR(100) NOT NULL COMMENT '密码',
	`age` TINYINT(4) DEFAULT'0'  COMMENT '年龄',
	-- `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,	-- 这行(包含了默认值的)在mysql5.5里不能运行
	`create_time` DATETIME DEFAULT'1999-01-01 01:01:01' COMMENT '试一下',
	`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT = 'app用户表'
  1. 插入数据
DROP FUNCTION IF EXISTS mock_data
-- 插入100万数据.
delimiter $$	-- 写函数之前必须要写,标志
-- set global log_bin_trust_function_creators=TRUE;

CREATE FUNCTION mock_data ()
RETURNS INT
BEGIN
-- declare声明
	DECLARE num INT DEFAULT 1000000;
	DECLARE i INT DEFAULT 0;
	
-- 	循环运算
	WHILE i<num DO
		-- 	插入语句
		INSERT INTO `app_user`(`name`,`email`,`phone`,`gender`,`password`,`age`)
		VALUES(CONCAT('用户',i),'19224305@qq.com',CONCAT('18',FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100));
-- 		UUID()是通用唯一识别码(Universally Unique Identifier)的缩写
		SET i=i+1;
	END WHILE;
	RETURN i;
	
END;
SELECT mock_data(); -- 执行此函数 生成一百万条数据。执行该函数需要等待一段时间

在这里插入图片描述

  1. 查询第9999条数据
  • 无索引时
SELECT * FROM app_user WHERE `name` = '用户9999';	-- > 时间: 0.344s
EXPLAIN SELECT * FROM app_user WHERE `name` = '用户9999';		-- > 为991749
  • 有索引时
-- 创建索引
-- 命名新建的索引id_表名_字段名
-- CREATE INDEX 索引名 ON 表(字段)
CREATE INDEX id_app_user_name ON app_user(`name`);

-- 创建索引后检索时间减少了
SELECT * FROM app_user WHERE `name` = '用户9999';	-- > 时间: 0s
EXPLAIN SELECT * FROM app_user WHERE `name` = '用户9999';	-- > rows为1

7.4.索引准则

7.4.1.索引不是越多越好
7.4.2.不要对经常变动的数据加索引
7.4.3.小数据量的表建议不要加索引
7.4.4.索引一般应加在查找条件的字段

7.5.索引的数据结构

-- 我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)

-- 不同的存储引擎支持的索引类型也不一样
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事务,支持表级别锁定,不支持 B-tree、HashFull-text 等索引;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一部分 Vue讲解(代码版)

1.第一个vue实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

获得乙级风力发电设计资质需要哪些注册工程师资格?

要获得乙级风力发电设计资质&#xff0c;通常需要以下注册工程师资格&#xff1a; 注册电气&#xff08;发输电&#xff09;工程师&#xff1a;他们负责风力发电项目的电气系统设计、优化、设备选型和配置&#xff0c;确保电力供应的安全性和可靠性。他们的专业知识对于保证风…

SpringBoot的旅游管理系统+论文+ppt+免费远程调试

项目介绍: 基于SpringBoot旅游网站 旅游管理系统 本旅游管理系统采用的数据库是Mysql&#xff0c;使用SpringBoot框架开发。在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 &#xff08;1&…

吴恩达深度学习笔记:深层神经网络(Deep Neural Networks)4.5-4.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第四周&#xff1a;深层神经网络(Deep Neural Networks)4.5 为什么使用深层表示&#xff1f;&#xff08;Why deep representations?&#xff09; 第一门课&#xff1a;神经网络和深度学习 (…

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …

官宣定档“2024上海国际半导体产业展会”定于11月份在沪召开

2024上海国际半导体产业展览会 2024 Shanghai Semiconductor Expo 时间:2024年11月18-20日 地点:上海新国际博览中心 前言 近年来&#xff0c;上海半导体产业呈现出快速发展的态势。一方面&#xff0c;得益于国家政策的大力支持&#xff0c;上海半导体产业得到了迅猛的发展。…

计算机组成结构2

概念 存储系统 解决成本-速度-容量之前的矛盾问题 寄存器–cache–内存–硬盘–外存储 局部性原理 时间局部&#xff1a;相邻的时间访问同一个数据空间局部&#xff1a;相邻的空间地址会被连续访问 cache cpu与主存之间&#xff0c;命中cache后就不需要访问主存&#xff0c;…

景联文科技:为AI大模型提供高质海量训练数据

在全球AI浪潮的推动下&#xff0c;大量训练数据已成为AI算法模型发展和演进中的关键一环。 艾瑞咨询数据显示&#xff0c;包括数据采集、数据处理&#xff08;标注&#xff09;、数据存储、数据挖掘等模块在内的AI基础数据服务市场&#xff0c;将在未来数年内持续增长。 预计到…

跟着GPT学设计模式之适配器模式

题图来自APOD 你好&#xff0c;这里是codetrend专栏“跟着GPT学设计模式”。 说明 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换为客户端所期望的另一个接口。适配器模式允许不兼容的接口协同工作&#xff0c…

面向跳转编程JOP问题及挑战

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击?什么是ROP攻击?区别与联系? 2、什么是JOP攻击?间接分支跳转指令? 3、JOP攻击的缓解技术?控制流完整性保护? 4、BTI下的JOP如何缓解?什么是目标着陆台? 5、BTI的架构细节?硬件原理?间接分支类型?指…

数据库(mysql)-基本查询语句(DQL)

查询语句 这边查询是给予一定表格,这边先做个解释 教师表包括(name(姓名),gender(性别),salary(工资),title(职位),subject_id(课程的编号),comm(奖金)) 学生表包括(姓名(name),gender(性别),job(职位),生日(birth)) 模版 SELECT 字段名 FROM 查询表 WHERE 查询语句 或与非…

Laravel 项目如何运行

如有一个 Laravel 项目&#xff0c;在配置好 PHP 版本和运行环境后&#xff0c;可以直接在项目下直接运行&#xff1a; php artisan serve 来启动你的项目。 通过浏览器查看 当项目运行后&#xff0c;默认的启动端口为 8000&#xff0c;可以通过浏览器来进行查看运行的 Larav…

c++的学习之路:17、stack、queue与priority_queue

摘要 本文主要是介绍一下stack、queue、priority_queue的使用以及模拟实现&#xff0c;文章末附上代码以及思维导图。 目录 摘要 一、stack的介绍和使用 1、stack的介绍 2、stack的使用 3、stack的模拟实现 二、queue的介绍和使用 1、queue的介绍 2、queue的使用 3、…

leetcode刷题日记之接雨水问题

题目描述 解题思路 这个题目相当于一个桶的容量是多少&#xff0c;这取决于最短的模板的高度&#xff0c;&#xff0c;对于位置来讲&#xff0c;第i个位置所能承载的最大的容量为左右两侧最低的高度减去该位置的高度&#xff0c;如果两侧的最低位置小于height【i】&#xff0c…

TSINGSEE青犀边缘计算AI智能分析网关V4客流统计算法的配置步骤及使用

TSINGSEE青犀AI智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为、烟火等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常见的…

Python学习从0到1 day21 第二阶段 面向对象 ④ 类型注解

仗剑红尘已是癫&#xff0c;有酒平步上青天 —— 24.4.7 一、变量的类型注解 学习目标 1.理解为什么使用类型注解 2.掌握变量的类型注解语法 为什么使用类型注解 tip&#xff1a;CTRLP&#xff0c;可以提示函数中传入的参数 当我们需要使用pycharm的自动补全功能&#xff0c;又…

Java | Leetcode Java题解之第18题四数之和

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> quadruplets new ArrayList<List<Integer>>();if (nums null || nums.length < 4) {return…

(表征学习论文阅读)A Simple Framework for Contrastive Learning of Visual Representations

Chen T, Kornblith S, Norouzi M, et al. A simple framework for contrastive learning of visual representations[C]//International conference on machine learning. PMLR, 2020: 1597-1607. 1. 前言 本文作者为了了解对比学习是如何学习到有效的表征&#xff0c;对本文所…

Disk Drill Enterprise for Mac v5.5.1515数据恢复软件中文版

Disk Drill 是 Mac 操作系统固有的Mac数据恢复软件&#xff1a;使用 Recovery Vault 轻松保护文件免遭意外删除&#xff0c;并从 Mac 磁盘恢复丢失的数据。支持大多数存储设备&#xff0c;文件类型和文件系统。 软件下载&#xff1a;Disk Drill Enterprise for Mac v5.5.1515激…

【YOLOV8】项目目录重点部分介绍和性能评估指标

目录 一 项目目录重点部分介绍 二 性能评估指标 一 项目目录重点部分介绍 1 ultralytics