MySQL索引优化解决方案--索引介绍(1)

什么是索引

MySQL官方对于索引的定义:索引是帮助MySQL高效过去数据的数据结构。

MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。而这种数据结构就是索引。

简单理解为“排好序的可以快速查找数据的数据结构”

索引数据结构

下图就是一种可能是二叉树(btree)的索引方式

在这里插入图片描述
二叉树数据结构的弊端:当极端情况下,数据递增插入时,会一直向右插入,形成链表,查询效率会降低。例如:

在这里插入图片描述
where id = 13 查找数据?
正常查找数据从上往下查找数据,假如查找“13 小明”这条数据,正常需要6次遍历。如果我们提前建立好了二叉树,我们查找“13 小明”这条数据只需要3次遍历

MySQL中常用的索引数据结构有BTree索引(Myisam普通索引),B+Tree索引(Innodb普通索引),Hash索引(Memory存储引擎)等等

索引的优势和劣势

优势:提高数据检索的效率,降低数据库的IO成本。通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

劣势:索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。每次更新添加了的索引列的字段,都会去调整因为更新带来的键值变化后的索引的信息。

索引使用场景

哪些情况需要创建索引:

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该创建索引(where 后面的语句)
  3. 查询中与其他表关联的字段,外键关系建立索引
  4. 多字段查询下倾向创建组合索引
  5. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
  6. 查询中统计或者分组字段

哪些情况不推荐建立索引

  1. 表记录太少
  2. 经常增删改的表
  3. where 条件里用不到的字段不建立索引

索引分类(MySQL的索引类型)

索引类型功能说明
普通索引最基本的索引,它没有任何限制
唯一索引某一行企用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的
主键索引它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码
全文索引对于需要全局搜索的数据,进行全文索引

1.普通索引
创建普通索引:alter table 表名 add index(字段) 或者 alter table 表名 add index 索引名称(字段)
删除普通索引:drop index 索引名称 on 表名

# 为money表的username字段增加索引
ALTER TABLE money ADD INDEX( username);

# 从money表中删除username索引
drop index username on money;

# 普通索引中有种特殊情况,复合索引(使用多字段创建索引)
alter table user add index xm(xing, ming);

# 删除复合索引
drop index xm on user;

2.唯一索引
创建唯一索引:alter table 表名 add UNIQUE(字段) 或者 create unique index 索引名 on 表名(字段)
删除唯一索引:drop index 索引名 on 表名

# 为money表的email字段增加唯一索引
ALTER TABLE money ADD UNIQUE(email);

# 或者为索引另取一个名字
alter table money add unique email_idx(email)

# 从money表删除唯一索引email字段
drop index email on money;

3.全文索引
创建全文索引:alter table 表 add FULLTEXT(字段);
删除全文索引:drop index 索引名称 on 表名;

# 为money表的content字段增加全文索引
ALTER TABLE money ADD FULLTEXT(content );

# 删除全文索引
drop index content on money;

4.主键索引
创建主键索引:alter table 表名 add PRIMARY KEY(字段);
删除主键索引:alter table 表名 drop primary key

示例:

# 为money表的id字段增加主键索引
ALTER TABLE money ADD PRIMARY KEY(id );

# 从money表中删除主键索引
alter table money drop primary key;

5.创建表时也可以声明索引

# 创建表时可在创建表语句后加上对应的类型即可声明索引:
PRIMARY KEY(字段)
INDEX [索引名] (字段)
FULLTEXT [索引名] (字段)
UNIQUE[索引名] (字段)
# 注:中括号中的索引名,代表可选

整体示例如下:

CREATE TABLE test (
	id INT NOT NULL ,
	username VARCHAR(20) NOT NULL ,
	password INT NOT NULL ,
	content INT NOT NULL ,
	PRIMARY KEY ( id ),
	INDEX pw ( password),
	UNIQUE ( username ),
	FULLTEXT ( content )
) ENGINE = InnoDB;

其他案列

#随表建立索引
create table customer(
	id int(10) auto_increment,
	customer_no varchar(20),
	customer_name varchar(20),
	primary key(id) ,
	unique idx_customer_no(customer_no),
	key idx_customer_name(customer_name),
	key idex_customer_no_name(customer_no,customer_name)
);

drop table if exists customer;
create table customer(
	id int(10) ,
	customer_no varchar(20),
	customer_name varchar(20)
);

#创建主键索引
alter table customer add primary key(id);
#删除主键索引
alter table customer drop primary key;

#创建唯一索引
alter table customer add unique idx_customer_no(customer_no);
#删除唯一索引
drop index idx_customer_no on customer;

#创建单值索引
alter table customer add index idx_customer_name(customer_name);
#删除单值索引
drop index idx_customer_name on customer;

#创建复合索引
alter table customer add index idx_customer_no_name(customer_no,customer_name);
#删除复合索引
drop  index idx_customer_no_name on customer;

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

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

相关文章

使用ChatGPT提升编程效率:程序员的最佳实践分享

在这个信息技术飞速发展的时代,编程已经成为了越来越多人的必备技能。无论你是初学者,还是经验丰富的开发者,都可能会遇到编程中的各种问题和挑战。幸运的是,AI 技术的进步让我们有了新的解决工具——ChatGPT。作为一名科技博客博…

51单片机STC89C52RC——9.1 DS1302涓流充电计时芯片

目录 目的/效果 一,STC单片机模块 二,DS1302计时器 2.1 特性/板子位置 2.1.1 特性 2.1.2 板子上的位置 2.2 针脚定义 2.3 数据传输 2.3.1 读数据 2.3.2 写数据 2.4 BCD码 2.5 可编程涓流充电器 2.6 时钟动态设置 三,创建Keil项目…

Leetcode 102.目标和

给定一个正整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums [2, 1] ,可以在 2 之前添加 ‘’ ,在 1 之前添加 ‘-’ &…

2024最新pd激活码 Parallels Desktop 19 激活秘钥分享

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机,并于其中装设不同的操作系统,如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时,您可在 …

【UE5.3】笔记2--资源导入

资源导入 方式一:内置资源--初学者内容包 方式二:虚幻商城 搜索免费资源: 添加到工程之后 搜素:虚幻学习工具包,需要注意的是支持的引擎版本 当然商城里包含了大量的免费的资源,初期学习不想投入太多可以…

OpenCL在移动端GPU计算中的应用与实践

一、引言 移动端芯片性能的不断提升为在手机上进行计算密集型任务,如计算机图形学和深度学习模型推理,提供了可能。在Android设备上,GPU,尤其是高通Adreno和华为Mali,因其卓越的浮点运算能力,成为了异构计…

OZON跨境卖家爆款产品有哪些

OZON跨境卖家爆款产品有哪些?国内的Ozon跨境卖家做这几个品,不爆都难! Top1 太阳镜 Очки солнцезащитные 商品id:1556874194 月销量:1095 OZON跨境卖家爆款产品工具:D。DDqbt。COm/…

【Docker】Docker简介_运行原理

1、简介 1.1基本概念 容器:容器是Docker的基本部署单元。它是一个轻量级的、独立的运行时环境,包含应用程序及其相关依赖。容器利用Linux内核的命名空间和控制组技术,实现了隔离性和资源管理,使得应用程序在不同的容器中运行不会…

2024 最新运营小工具 API 推荐,助力高效工作

在当今数字化运营的时代,各种高效便捷的 API 服务成为了企业和个人提升运营效率、获取精准数据的得力助手。无论是进行市场调研、拓展业务,还是优化网络资源配置,都离不开这些强大的工具。本文将为您详细介绍一系列实用的运营小工具 API 服务…

使用API有效率地管理Dynadot域名,为文件夹更名

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十八)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 28 节) P28《27.网络连接-Http请求数据》 案例: 这里不懂后端假设服务器的前端小伙伴就需要课程源码资料了…

华三交换机的软件版本升级操作

升级操作很常见,掌握方法是关键 实验环境:1台华三S6520-EI交换机,版本从2432P03升级成2432P05。 整体思路: 1.先查验软件版本 2.官网下载对于设备型号的软件版本 3.配置交换机地址使得与电脑进行通信,使用TFTP/FTP工…

宿主机无法通过ip连接wsl2解决方案

文章目录 原因排查网络模式win11防火墙关闭wsl ubuntu防火墙 如果之前能连接现在连接不上可以参考该方案 原因排查 网络模式win11防火墙(win11新增了Hyper-V防火墙)wsl2 ubuntu防火墙 网络模式 wsl2的默认网络模式是NAT&#xff0c;建议修改为镜像模式。在C:\Users\<User…

深圳,不止是“搞钱之都”

深圳又结结实实火了一把。 “建议深圳人吃饭不要谈工作”&#xff0c;这条微博话题热度飙升&#xff0c;超过五百多万人围观&#xff0c;引来无数网友吐槽“深圳人饭局的真实写照”。 从高档粤菜包间到路边小摊&#xff0c;从茶餐厅到烧烤摊&#xff0c;深圳人吃饭似乎总绕不…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

华为---VRRP基本配置(一)

10、VRRP 10.1 VRRP基本配置 10.1.1 原理概述 随着Internet的发展&#xff0c;人们对网络可靠性的要求越来越高。对于用户来说&#xff0c;能够时刻与外部网络保持通信非常重要&#xff0c;但内部网络中的所有主机通常只能设置一个网关IP地址&#xff0c;通过该出口网关实现…

前端打包配置+nginx配置实现部署及部署地址带特定前缀的几种方式

前端打包后要部署到服务器&#xff0c;在浏览器中可以通过url访问到我们开发的系统&#xff0c;通过nginx代理在工作中是一种很常用的方式。 这里以本地为例&#xff0c;把本地电脑当作一个服务器&#xff0c;实现普通部署、带特定前缀等 前端使用vue-clivue作为例子 以下内容…

电脑突然提示dll文件丢失,怎么选择正确的恢复方法?

电脑突然提示dll文件丢失&#xff1f;其实当你的电脑使用久了&#xff0c;出现这种dll文件丢失是非常的正常的&#xff0c;毕竟你总会有不恰当的操作吧&#xff1f;这些操作都是会导致dll文件丢失的。丢失了&#xff0c;我们直接进行相关的修复就好了&#xff0c;还是比较简单的…

Qt开发 | Qt控件 | QTabWidget基本用法 | QListWidget应用详解 | QScrollArea应用详解

文章目录 一、QTabWidget基本用法二、QListWidget应用详解1.列表模式1.1 基本操作1.2 添加自定义item1.3 如何添加右键菜单1.4 QListWidget如何删除item 2.图标模式 三、QScrollArea应用详解 一、QTabWidget基本用法 QTabWidget 是 Qt 框架中的一个类&#xff0c;它提供了一个选…

C++学习/复习18----迭代器/反向迭代器及在list/vector中的应用、list与vector模拟实现复习

迭代器是一个对象&#xff0c;可以循环访问 C 标准库容器中的元素&#xff0c;并提供对各个元素的访问。 C 标准库容器全都提供迭代器&#xff0c;以便算法可以采用标准方式访问其元素&#xff0c;而不必考虑用于存储元素的容器类型。 一、反向迭代器类 基于普通迭代器构建反…