MySQL----索引

一、索引的概念

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

 二、索引的作用

1、优点

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

  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能。

2、缺点

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

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

而 InnoDB 引擎的表数据文件本身就是索引文件。(索引文件和数据文件是同一个)

(2)在插入和修改数据时要花费更多的时间、消耗更多性能,因为索引也要随之变动。

三、创建索引的规则

  1. 表的主键、外键必须要有索引
  2. 记录超过300行的表应该有索引
  3. 经常与其他表进行连接的表,在连接字段上应该建立索引
  4. 唯一性太差的字段不适合建立索引
  5. 更新太频繁的字段不适合创建索引
  6. 经常出现在where子句中的字段,特别是大表的字段,应该建立索引
  7. 索引应建立在选择性高的字段上
  8. 索引应该建立在小字段上,对于大的文本字段甚至超长字段,不适合建索引

总结: MySQL 的优化 哪些字段/场景适合创建索引,哪些不适合
1、小字段
2、唯一性强的字段
3、更新不频繁,但查询率很高的字段
4、表记录超过300+行
5、主键、外键、唯一键

 四、索引的分类和创建

 1、普通索引

 针对所有的字段,没有特殊的需求和规则

方法一:直接创建 

create index 索引名 on 表名 (列名[(length)]);

#(列名(length)):length是可选项。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“_index”结尾。

 

 方法二:修改表方式创建

alter table 表名 add index 索引名(列名);

 方法三:创建表的时候指定索引

create table 表名(字段1 数据类型,字段2 数据类型[,...],index 索引名(列名));

 

 2、唯一索引

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

方法一:直接创建唯一索引

create unique index 索引名 on 表名(列名);

 方法二:修改表方式创建

alter table 表名 add unique 索引名(列名);

 方法三:创建表的时候指定

create table 表名(字段1 数据类型,字段2 数据类型[,...],unique 索引名(列名));

 3、主键索引

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

方法一:创建表的时候指定

create table 表名 ([...],primary key (列名));

 方法二:修改表方式创建

alter table 表名 add primary key(列名);

 4、组合索引(单列索引与多列索引)

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

create table 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,index 索引名 (列名1,列名2,列名3));

 注:组合索引创建的字段顺序是其触发索引的查询顺序

例:

 5、全文索引(FULLTEXT)

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

#直接创建索引

CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

#例:select * from member;
create fulltext index remark_index on member (remark);

#修改表方式创建

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

#创建表的时候指定索引

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

#数据类型可以为 CHAR、VARCHAR 或者 TEXT

#使用全文索引查询

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

#例:select * from member where match(remark) against('this is vip');
or select * from member where remark='this is vip';

 五、查看索引

 show index from 表名;      #能查看索引的字段和细节,建议以纵向形式查看
 show index from 表名\G     #建议使用\G以纵向形式查看
 
 show keys from 表名;
 show keys from 表名\G

 show create table 表名;    #只能查看索引的字段和名称

 Table    表的名称

  • Non_unique    如果索引内容唯一,则为 0;如果可以不唯一,则为 1。
  • Key_name    索引的名称。
  • Seq_in_index    索引中的列序号,从 1 开始。 limit 2,3
  • Column_name    列名称。
  • Collation    列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
  • Cardinality    索引中唯一值数目的估计值。
  • Sub_part    如果列只是被部分地编入索引,则为被编入索引的字符的数目(zhangsan)。如果整列被编入索引,则为 NULL。
  • Packed    指示关键字如何被压缩。如果没有被压缩,则为 NULL。
  • Null    如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
  • Index_type    用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
  • Comment    备注。

六、删除索引 

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

1、删除主键索引(删除主键) 

 alter table 表名 drop primary key;  

 2、删除其他索引

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

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

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

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

相关文章

Kubernetes对象深入学习之五:TypeMeta无效之谜

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习之五》系列的第五篇,从前文的分析也能看出,代表对象类型的schema.ObjectKind,于…

Shell编程之流程控制

目录 if判断 case语句 for循环 while循环 if判断 语法: if [ 条件判断表达式 ] then 程序 elif [ 条件判断表达式 ] then 程序 else 程序 fi 注意: [ 条件判断表达式 ],中括号和条件判断表达式之间必须有空格。if,elif…

无涯教程-机器学习 - 矩阵图函数

相关性是有关两个变量之间变化的指示,在前面的章节中,无涯教程讨论了Pearson的相关系数以及相关的重要性,可以绘制相关矩阵以显示哪个变量相对于另一个变量具有较高或较低的相关性。 在以下示例中,Python脚本将为Pima印度糖尿病数…

Servlet学习总结(Request请求与转发,Response响应,Servlet生命周期、体系结构、执行流程等...)

Override 是Java中的注解(Annotation),它用于告诉编译器该方法是覆盖(重写)父类中的方法。当我们使用Override注解时,编译器会检查当前方法是否正确地覆盖了父类中的方法,如果没有覆盖成功&…

Elasticsearch 集成---Spark Streaming 框架集成

一.Spark Streaming 框架介绍 Spark Streaming 是 Spark core API 的扩展,支持实时数据流的处理,并且具有可扩展, 高吞吐量,容错的特点。 数据可以从许多来源获取,如 Kafka , Flume , Kin…

Scala集合继承体系图

Scala集合简介 1) Scala 的集合有三大类:序列 Seq、集Set、映射 Map,所有的集合都扩展自 Iterable特质。 2) 对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两个包 不可变集合…

[C++网络协议] I/O复用

具有代表性的并发服务器端实现模型和方法: 多进程服务器:通过创建多个进程提供服务。 多路复用服务器:通过捆绑并统一管理I/O对象提供服务。✔ 多线程服务器:通过生成与客户端等量的线程提供服务。 目录 1. I/O复用 2. select函…

Vue:关于声明式导航中的 跳转、高亮、以及两个类名的定制

声明式导航-导航链接 文章目录 声明式导航-导航链接router-link的两大特点(能跳转、能高亮)声明式导航-两个类名定制两个高亮类名 实现导航高亮,实现方式其实,css,JavaScript , Vue ,都可以实现。其实关于路由导航&…

Android Studio 的github 工程克隆

上文介绍了Android Studio 里的"Git 建立和简单操作。本文介绍从github 上的工程fork 和clone到本地,然后学习和改进。 本文参考 https://learntodroid.com/how-to-use-git-and-github-in-android-studio/ 克隆clone Github 仓库: 先 Fork 你选择…

stm32之25.FLASH闪存

打开标准库 源码--- int main(void) {uint32_t d;Led_init();key_init();/* 初始化串口1波特率为115200bps,若发送/接收数据有乱码,请检查PLL */usart1_init(115200);printf("this is flash test\r\n");/* 解锁FLASH(闪存&#xf…

跨境做独立站,如何低成本引流?你的流量密码在这

大家都知道,海外的消费习惯与国内不同,独立站一向是海外消费者的最喜欢的购物方式之一,这也吸引了许多跨境商家开设独立站。 独立站不同于其他的第三方平台,其他平台可以靠平台自身流量来获得转化,而独立站本身没有流…

java八股文面试[多线程]——ThreadLocal底层原理和使用场景

源码分析: ThreadLocal中定义了ThreadLocalMap静态内部类,该内部类中又定义了Entry内部类。 ThreadLocalMap定了 Entry数组。 Set方法: Get方法: Thread中定义了两个ThreaLocalMap成员变量: Spring使用ThreadLocal解…

虚拟机Ubuntu20.04 网络连接器图标开机不显示怎么办

执行以下指令: sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start

nginx压缩ttf文件 mine.types的作用

最近在运维过程中,前端提到发现在linux上下载某ttl文件(字体文件)太大,传输过程比较慢,于是就想着使用nginx的gzip进行压缩,经过不断尝试,终于发现在nginx的配置目录/etc/nginx/mine.types 文件…

【UIPickerView-UIDatePicker-应用程序对象 Objective-C语言】

一、今天我们来学习三个东西 1.UIPickerView-UIDatePicker-应用程序对象 1.首先,来看数据选择控件 数据选择控件, 大家对这个数据选择控件,是怎么理解的, 1)数据选择控件,首先,是不是得有数据, 2)然后呢,你还得让用户能够选择, 3)最后,你还得是一个控件儿 那…

国产ETLCloud VS 开源Kettle ETL对比分析

ETLCloud VS Kettle ETLCloud和kettle是目前国内使用最广泛的两款免费ETL工具,本文将从多个角色对ETLCloud和kettle进行对比,方便用户快速了解到两款产品的差异并根据自已的需求选择相应的工具。 ETLCloud提供了对kettle流程的迁移功能,所以…

文件上传漏洞-upload靶场5-12关

文件上传漏洞-upload靶场5-12关通关笔记(windows环境漏洞) 简介 ​ 在前两篇文章中,已经说了分析上传漏的思路,在本篇文章中,将带领大家熟悉winodws系统存在的一些上传漏洞。 upload 第五关 (大小写绕过…

gRPC-Gateway 快速实战

今天来分享一波 gRPC-Gateway , 之前咱们有分享过什么是 gRPC 及其使用方式,可以看看这些关于 gRPC 的历史文章: gRPC介绍 gRPC 客户端调用服务端需要连接池吗? gRPC的拦截器 gRPC的认证 分享一下 gRPC- HTTP网关 I 今天主要是分…

AI:05 - 基于深度学习的道路交通信号灯的检测与识别

随着人工智能的快速发展,基于深度学习的视觉算法在道路交通领域中起到了重要作用。本文将探讨如何利用深度学习技术实现道路交通信号灯的检测与识别,通过多处代码实例展示技术深度。 道路交通信号灯是指示交通参与者行驶和停止的重要信号。准确地检测和识别交通信号灯对于智…

最大子数组和【贪心算法】

最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 class Solution {public int maxSubArray(int[] nums) {//记录最大结果&…
最新文章