MySQL数据库的索引

目录

1、索引的概念

2、索引的作用 

优点

缺点

3、创建索引的原则依据

4、索引的分类和创建 

​编辑 4.1普通索引

直接创建索引

修改表方式创建索引 

创建表时添加索引 

 删除索引

4.2唯一索引

直接创建唯一索引 

修改表方式创建 

创建表时指定索引 

4.3主键索引(和创建主键的方式一样) 

修改表方式创建

创建表时指定 

4.4 组合索引(单列索引与多列索引) 

直接创建索引

修改表的方式创建索引 

创建表的时候指定索引 

4.5 全文索引 

直接创建索引

修改表的方式创建索引

创建表时指定索引 

全文索引查询

5、查看索引 

 6、删除索引

6.1 删除主键索引 

6.2 删除非主键索引


1、索引的概念

  • 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于c语言的链表通过指针指向数据记录的内存地址)
  • 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地然后访问相应的数据,因此能加快数据库的查询速度。
  • 索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
  • 索引是表中一列或者若干列值排序的方法。
  • 建立索引的目的是加快对表中记录的查找或排序。

2、索引的作用 

优点

  • 设置了合适的索引之后,数据库利用各种快速定技术,能够大大加快查询速度,这是创建索引的最主要的原因。
  • 当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
  • 可以降低数据库的I/O成本,并且索引还可以降低数据库的排序成本。
  • 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
  • 可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序的时间。
  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能

缺点

索引需要占用额外的磁盘空间。

  • 对于MyISAM引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。 而InnoDB引擎的表数据文件本身就是索引文件。

在插入和修改数据时要花费更多的时间,因为索引也要随之变动。

3、创建索引的原则依据

索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。

  • 表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是主表的主键,查询时可以快速定位。
  • 记录数超过300行的表应该有索引。如果没有索引,每次查询都需要把表遍历一遍,会严重影响数据库的性能。
  • 经常与其他表进行连接的表,在连接字段上应该建立索引
  • 唯一性太差的字段不适合建立索引
  • 更新太频繁地字段不适合创建索引
  • 经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引
  • 在经常进行GROUP BY、ORDER BY的字段上建立索引
  • 索引应该建在选择性高的字段上。(即重复性低的字段)
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

4、索引的分类和创建 

创建一个member表

create table member(id int(10) ,name varchar(10) ,cardid int(18) ,phone int(11) ,address varchar(50),remark text);

 4.1普通索引

最基本的索引类型,没有唯一性之类的限制。

直接创建索引

CREATE INDEX 索引名 ON 表名 (列名(length));
  • (列名(length)):length是可选项,下同。如果忽略length 的值,则使用整个列的值作为索引。如果指定,使用列的前length个字符来创建索引,这样有利于减小索引文件的大小。在不损失精确性的情况下,长度越短越好。
  • 索引名建议以“_index"结尾。

 

修改表方式创建索引 

 ALTER TABLE 表名 ADD INDEX 索引名(列名);

创建表时添加索引 

 CREATE TABLE 表名(字段1数据类型,字段2数据类型[,...],INDEX 索引名 (列名));

 

​drop index 索引名 on 表名; #直接删除索引
​alter table 表名 DROP index 索引名; #以修改表的方式删除索引

4.2唯一索引

与普通索引类似,但区别是唯一索引列的每个值都唯一。 唯一索引 允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。

直接创建唯一索引 

 CREATE UNIQUE INDEX 索引名 ON 表名(字段名);

修改表方式创建 

 ALTER TABLE 表名 ADD UNIQUE 索引名(字段名);

创建表时指定索引 

 CREATE TABLE 表名(字段1 数据类型,字段2 数据类型[...],UNIQUE 索引名(字段名));

4.3主键索引(和创建主键的方式一样) 

主键索引是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

修改表方式创建

 ALTER TABLE 表名 add primary key(字段名);

创建表时指定 

create table 表名(字段1 XXX, 字段2 XXX, ...primary key(字段));

4.4 组合索引(单列索引与多列索引) 

可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select 语句的where条件是依次从左往右执行的,所以在使用select 语句查询时where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

直接创建索引

 CREATE INDEX 索引名 on 表名(字段1,字段2,字段3);

修改表的方式创建索引 

 alter table 表名 add index 索引名(字段1,字段2, ..., 字段n);

创建表的时候指定索引 

CREATE TABLE 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型, INDEX 索引名(字段1,字段2,字段3));

查询索引使用select查询注意where的最左原则。查询字段的顺序要和组合索引保持一致,才能生效。

4.5 全文索引 

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在MySQL5.6版本以前FULLTEXT索引仅可用于MyISAM引擎,在5.6版本之后innodb 引擎也支持FULLTEXT 索引。全文索引可以在CHAR、 VARCHAR 或者TEXT 类型(其余类型不可以)的列上创建。每个表一般只创建一个全文索引。

直接创建索引

create fulltext index 索引名 on 表名 (字段);

模糊查询只能匹配一个单词不能按照字母进行匹配

修改表的方式创建索引

alter table 表名 add fulltext 索引名 (字段);

创建表时指定索引 

create table 表名 (字段.... , fulltext 索引名 (字段));

全文索引查询

模糊查询只能匹配一个单词不能按照字母进行匹配

5、查看索引 

#能查看索引的字段和细节
show index from 表名;  
show keys from 表名;
#只能查看索引的字段和名称
show create table 表名;

字段    含义
Table    表的名称
Non_unique    如果索引不能包括重复词,则为0;如果可以,则为1
Key_name    索引的名称
seq_in_index    索引中的列序号,从1开始
column_name    列名称
collation    列以什么方式存储在索引中。在 MySQL中,有值'A'(升序)或 NULL(无分类)
Cardinality    索引中唯一值数目的估计值
sub_part    如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL
Packed    指示关键字如何被压缩。如果没有被压缩,则为NULL
Null    如果列含有NULL,则含有YES。如果没有,则该列含有NO
lndex_type    用过的索引方法(BTREE,FULLTEXT,HASH,RTREE)
comment    备注

 6、删除索引

除了删除主键索引,删除其他索引的方式是一样的。

6.1 删除主键索引 

alter table 表名 drop primary key;

6.2 删除非主键索引

drop index 索引名 on 表名;     #直接删除索引​
alter table 表名 drop index 索引名;   #修改表的方式删除索引

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

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

相关文章

Lamdba表达式

Lamdba表达式 Lambda是一个匿名函数,我们可以将Lambda表达式理解为一段可以传递的代码(将代码像数据一样 传递)。使用它可以写出简洁、灵活的代码。作为一种更紧凑的代码风格,使java语言表达能力得到提 升。 Lambda表达式在java语…

Android Kotlin(六)协程的并发问题

书接上回:Android Kotlin知识汇总(三)Kotlin 协程 协程的并发问题 在一个协程中,循环创建10个子协程且单独运行各自Default线程中,并让每个子协程对变量 i 进行1000次自增操作。示例如下: fun main() …

Golang基础知识(笔记迁移)

golang 变量作用域 局部作用域:代码块、函数内的全局作用域:顶层作用域,代码块外的就是全局,如果变量名大写,则改变量整个程序都可以使用。 类型断言 golang的类型断言在变量后加上.(type),如果类型断言…

69、FIFO缓存发送数据(先入先出)

本文件用于设备数据收发缓冲使用,本fifo采用申请2片内存区,交替使用,写0时1读,写1时0读,避免同时使用相同内存块 fifo区域采用头尾相连的方式循环覆盖,分别记录读和写的位置,相等则数据为空,否则…

脚本实现Ubuntu设置屏幕无人操作,自动黑屏

使用 xrandr 命令可以实现对屏幕的控制,包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏,非待机,并黑屏后点击触摸屏可以唤醒屏幕,可以借助 xrandr 命令来实现。 首先,…

亚远景科技-ASPICE如何适配汽车电子电气产品特征与行业发展

随着当今汽车工业的蜕变,我们正迎来一个被誉为“软件定义汽车”的新时代。在这个时代,软件不仅是汽车的灵魂,更是其主导力量,它通过无形的代码赋予汽车各种突破性的特性与功能。昔日以硬件为重心的汽车行业,如今正在加…

计算机二级真题讲解每日一题:《format格式化》

描述 在右侧答题模板中修改代码,删除代码中的横线,填写代码,完成如下功能。 接收用户输入的一个小于 20的正整数,在屏幕上逐行递增显示从 01 到该正整数,数字显示的宽度为 2,不足位置补 0,后面追…

比一比gitee、gitlab、github

gitee、gitlab、github,哪个是目前国内大型公司使用最多的呢?共同点:三者都是基于git的代码托管工具,都支持版本管理。 gitee:适合国内开发者,更友好的本地化服务,形成了一个适合中国宝宝学习的…

计算机网络:分层体系结构

计算机网络:分层体系结构 基本分层概述各层次的任务物理层数据链路层网络层运输层应用层 数据传递过程分层体系常见概念实体协议服务 基本分层概述 为了使不同体系结构的计算机网络都能互联,国际标准化组织于 1977 年成立了专门机构研究该问题。不久他们…

算法体系-15 第十五节:贪心算法(下)

一 、贪心算法的解题套路实战 贪心的算法和排序和堆有关 1.1 描述 一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间 你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。 返回最多的宣讲场次…

centos docker 安装es

在CentOS上通过Docker安装Elasticsearch的步骤如下: 步骤1:安装Docker 在 CentOS 上安装 Docker 的步骤大致如下: 第一步:准备工作 确保你的 CentOS 系统已经更新到了最新状态: sudo yum update -y第二步&#xf…

【C++】1597. 买文具

问题:1597. 买文具 类型:基本运算、整数运算 题目描述: 花花去文具店买了 1 支笔和 1块橡皮,已知笔 x 元/ 支,橡皮 y元 / 块,花花付给了老板 n 元,请问老板应该找给花花多少钱? 输…

以前端角度来看序列化

1. what? why? 序列化:将数据结构或对象状态 转换成一个可以存储或传输的格式 的过程 意味着可以将复杂的数据结构转换成简单的字节流或字符串,以便于存储或传输 反序列化:将这些数据恢复成原始形式的过程,是序列化的逆过程 从…

pycharm安装插件

pycharm安装插件显示网络错误/无法安装 输入以下网址 https://plugins.jetbrains.com/ 然后重启pycharm就可以安装软件了

Spring Cloud Alibaba Sentinel 使用详解

一、Sentinel 介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景: Sentinel 承接了阿里巴…

现代游戏引擎架构

一、并行编程 1.1 为什么需要并行编程 游戏的渲染计算对算力要求很高,所以我们需要把操作系统的资源利用到极致。 但是摩尔定律已经不在适用了,硬件的发展目前已经达到瓶颈。所以我们需要通过数量来提高计算效率。 1.2 并行编程基础 进程与线程&#…

MacOS - GCC 版本升级解决方案

Mac 中自带的 GCC 版本是 4.2.1,由于版本太低,在很多操作的时候会报错。因此需要对其进行升级,这里使用 Homebrew 来下载最新的 GCC。 安装 Homebrew MacOS 的终端中输入如下的命令来安装 Homebrew $ /usr/bin/ruby -e "$(curl -fsSL …

sqlite3 交叉编译

#1.下载源码并解压 源码路径如下,下载autoconf版本 SQLite Download Page 解压 tar -zxvf sqlite-autoconf-3450200.tar.gz cd sqlite-autoconf-3450200 mkdir build # 2. 配置源代码 # 假设你已经安装了交叉编译工具链,如gcc-arm-linux-gnueabih…

Tkinter 一文读懂

Tkinter 简介 Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件包的 Python 接口封装,它是 Python 官方推荐的 GUI 工具包,属于 Python 自带的标准库模块,当您安装好 Python 后,就可…

基于python+vue的BBS论坛系统flask-django-nodejs-php

本系统为用户而设计制作BBS论坛系统,旨在实现BBS论坛智能化、现代化管理。本BBS论坛自动化系统的开发和研制的最终目的是将BBS论坛的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条件。使BBS论坛系统数字化、…