关于MySQL数据库中的索引

news/2024/4/18 8:16:47/文章来源:https://blog.csdn.net/weixin_41489136/article/details/127448890

索引

索引是一个单独的、存储在磁盘上的数据库结构,它包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个列中有一特定值的行。
索引是在存储引擎中实现的,因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。大多数存储引擎有更高的限制。MySQL中索引的存储类型有两种BTREE和HASH,具体和表的存储引擎相关;MyISAM和InnoDB存储引擎只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。

索引的优点有以下几条:

1)通过创建唯一索引可以保证数据库表中每一行数据的唯一性
2)可以大大加快数据的查询速度,这也是创建索引最主要的原因
3)在实现数据的参考完整性方面,可以加速表和表之间的连接
4)在使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序的时间

增加索引的不利方面:

1)创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加
2)索引需要占用磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸
3)当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

索引的分类

普通索引和唯一索引

普通索引是MySQL中基本索引类型,允许在定义索引的列中插入重复值和空值。
唯一索引,索引列的值必须唯一,但允许有空值。若是组合索引,则列值的组合必须唯一。
主键索引是一种特殊的唯一索引,不允许有空值。

单列索引和组合索引

单列索引即一个索引只包含单个列,一个表可以有多个单列索引。
组合索引指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合。

全文索引

全文索引类型为FULLTEXT,在定义索引的列上支持值得全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建。
MySQL中只有MyISAM存储引擎支持全文索引。

空间索引

空间索引是对空间数据类型的字段建立索引,MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING和POLYGON。
MySQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引。创建空间索引的列必须声明为NOT NULL,空间索引只能在存储引擎MyISAM的表中创建。

索引的设计原则

1)索引并非越多越好,一个表中如果有大量的索引,不仅占用磁盘空间,而且会影响INSERT、DELETE、UPDATE等语句的性能,因为在表中的数据更改的同时,索引也会进行调整后和更新
2)避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应创建索引,但要避免添加不必要的字段。
3)数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
4)在条件表达式中经常用到的不同值较多的列上建立索引,在不同值很少的列上不要建立索引。
5)当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列数据完整性,以提高查询速度。
6)在频繁进行排序或分组的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。

索引的创建

普通索引

最基本的索引类型,没有唯一性之类的限制,其作用只是加快对数据的访问速度
对第i列加普通索引:

CREATE TABLE 表名
(字段名1     字符类型1,...,字段名n     字符类型n,INDEX(字段名i)
);

在创建之后可以使用

SHOW CREATE TABLE 表名;

来查看表结构,使用explain语句查看索引是否正在使用:

mysql> explain select * from 表名 where 字段i='测试值';

explain语句返回结果解释:

参数解释
select_type指所使用的SELECT查询类型,其可能取值为SIMPLE、PRIMARY、UNION、SUBQUERY
table指数据库读取的数据表名,它们按读取的先后顺序排列
type指本数据表与其他数据表之间的关联关系,可能值有system、const、eq_ref、ref、range、index、ALL
possible_keys给出MySQL在搜索数据记录时可选用的各个索引
keyMySQL实际选用的索引
key_len索引按字节计算的长度,key_len数值越小,表示越快
ref给出关联关系中另一个数据表里的数据列的名字
rowsMySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数
Extra提供了与关联操作有关的信息

唯一索引

创建唯一索引的主要原因是减少查询索引列操作的执行时间,尤其对比较庞大的数据表。它与前面的普通索引类似,不同的是:索引列的值必须唯一,但允许有空值。若是组合索引,则列值的组合必须唯一。

CREATE TABLE 表名
(字段名1 数据类型1,...,字段名n 数据类型n,UNIQUE INDEX 索引名(字段i)
);

单列索引

CREATE TABLE 表名
(字段名1 数据类型1,...,字段名n 数据类型n,INDEX 索引名(字段名i(20))
);

其中索引长度为20

组合索引

CREATE TABLE 表名
(字段名1 数据类型1,...,字段名n 数据类型n,INDEX 索引名(字段名i,字段名j,字段名k)
);

组合索引可以起几个索引的作用,但是使用时并不是随便查询哪个字段可以使用索引,而是遵从最左前缀:利用索引中最左边的列集来匹配行。

全文索引

CREATE TABLE 表名
(字段名1 字符类型1,...,字段名n 字符类型n,FULLTEXT INDEX 索引名(字段名i);
);

需要用MyISAM引擎,若为InnoDB引擎创建索引会出错

空间索引

必须在MyISAM引擎下创建表,且控件类型的字段必须为非空

CREATE TABLE 表名
(字段名 GEOMETRY NOT NULL,...,字段名n 字符类型,SPATIAL INDEX 索引名(字段名i)
)ENGINE=MyISAM;

已存在的表创建索引

ALTER TABLE

ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY]
索引名 (索引长度) [ASC|DESC]

SHOW INDEX查看指定表中的索引:

SHOW IDDEX FROM 表名;

返回值参数解释

参数解释
Table创建索引的表
Non_unique1代表非唯一索引,0代表唯一索引
Key_name索引名称
Seq_in_index该字段在索引中的位置,单列索引该值为1,组合索引为每个字段在索引定义中的顺序
Column_name定义索引列的字段
Sub_part索引长度
Null该字段是否能为空值
Index_type索引类型

CREATE INDEX

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名
ON 表名 (字段名(索引长度),...) [ASC|DESC]
普通索引
CREATE INDEX 索引名 ON 表名(字段名);
唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(字段名(索引长度));
单列索引
CREATE INDEX 索引名 ON 表名(字段名(索引长度));
组合索引
CREATE INDEX 索引名 ON 表名(字段名i(索引长度i),字段名j(索引长度j));
全文索引
CREATE FULLTEX INDEX 索引名 ON 表名(字段名);
空间索引
CREATE SPATIAL INDEX 索引名 ON 表名(字段名);

删除索引

ALTER TABLE删除
ALTER TABLE 表名 DROP INDEX 索引名;
DROP INDEX删除
DROP INDEX 索引名 ON 表名;

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

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

相关文章

node.js+vue+Web的疫情大数据平台分析系统

以往的疫情防控管理事务处理主要使用的是传统的人工管理方式,这种管理方式存在着管理效率低、操作流程繁琐、保密性差等缺点,长期的人工管理模式会产生大量的文本文件与文本数据,这对事务的查询、更新以及维护带来不少困难。随着互联网时代的…

Google共码未来 与 C站 创造者的经历

本人仅参加一天活动 2022.9.14;吃喝拉撒全免费哈哈哈 大会主题:共码未来 looker、chromium、wouldnt、jetpack looker https://blog.csdn.net/WebEye_Marketing/article/details/116047404 chromium https://blog.csdn.net/arv002/article/details/1…

SEO和SEM的区别是什么,哪个效果更好一些

SEO指的是搜索引擎优化,SEM指的是搜索引擎影响,那么SEO和SEM的区别具体是什么?对于初创业的企业来说,哪个更好呢?下面,本文将介绍SEO和SEM的区别,帮助企业和公司网络人员理清这两者的优劣势。 S…

【力扣刷题】Day31——DP专题

文章目录七、子序列问题(线性DP and 区间DP)1、子序列(不连续)29.最长递增子序列(LIS)30. 最长公共子序列 (LCS)31.不相交的线2、子序列(连续)32. 最长连续递…

C语言中的指针

一。什么是指针? 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元&a…

一棋盘的麦子

14天阅读挑战赛 有一个古老的传说,一位国王的女儿不幸落水,水中有很多鳄鱼,国王情急之下下令: 来,就把女儿嫁给他。”很多人纷纷退让,一个勇敢的小伙子挺身而出,冒着生命危险把公 一看是个穷小子…

Java程序员快速掌握前端知识

Java程序员是一个需要终身学习的岗位,加之技术更新迭代越来越快,程序员们不得不坚持提升自己,上班可能接触到新事物,下班也要抓紧时间钻研,才能不被时代淘汰。 前端技术,Java程序员可以不精通,…

新手如何自学python?

对于初学者来说,视频教程相比于书籍更加直观有效,可以先看视频进行学习,然后再看书进行深刻学习~下面就给你分享下教程以及书籍~ 网站 1. 网易公开课 https://open.163.com/ 2. 腾讯课堂 https://ke.qq.com/ 3. 中国大学慕课 https://www.…

xxl-job反序列化漏洞分析复现

01 影响范围 Xxl-Job<2.1.2&#xff0c;需要利用Hessian触发。 02 环境搭建 下载地址&#xff1a;https://github.com/xuxueli/xxl-job/releases 修改配置文件 xxl-job-2.0.1/xxl-job-admin/src/main/resources/application.properties 修改数据库信息&#xff0c;以及…

动手写数据库:实现记录管理

在数据库中&#xff0c;数据以”记录“作为一个单元来存储&#xff0c;例如一个表的“一行”就对应一条记录。假设我们有一个表叫STUDENT&#xff0c;其中有name, age, sex, class等字段&#xff0c;那么一条记录的信息就由这四个字段对应的信息合成。一条记录如何存储并不是一…

FFmpeg入门详解之110:RTSP协议讲解

RTSP亲手搭建直播点播 测试工具&#xff1a;VLC 数据源&#xff1a; 文件或本地摄像头 测试功能&#xff1a;RTSP直播点播 播放地址&#xff1a;rtsp://127.0.0.1:8554/rtspa001 服务端&#xff1a;推流 客户端&#xff1a;拉流 RTSP&#xff08;Real Time Streaming Pro…

Windows定时截屏、后台自动截屏工具,带有密码保护功能 —— 定时执行专家

目录 一、软件简介 二、使用教程 1、软件下载 2、软件的安装方法 3、无察觉自动截屏&#xff08;例如&#xff1a;间隔每 10分钟&#xff0c;执行 1次&#xff09; 一、软件简介 《定时执行专家》是一款制作精良、功能强大、简单易用、毫秒级精度、专业级的定时任务执行软…

Windows Server安全日志与系统事件变更审计

了解用户何时变更计算机内部时钟上的时间和日期。如果系统时间已变更&#xff0c;记录的事件将反映此新时间&#xff0c;而不是事件发生的实际时间。对系统时间不正确的变更可对应用程序造成严重破坏。 您可在Windows 2003 / 2008 / 2012计算机的安全日志中找到有价值信息&…

SpringBoot——可真是迅速又便捷

刚工作那会用的还是tomcat、springMVC、hibernate、mybatis、html、jsp……搭个项目可真是麻烦&#xff0c;各种复杂的结构还得打个war包配置web.xml&#xff0c;启动tomcat……后来也没做网站开发了&#xff0c;最近又看了看springboot&#xff0c;比之前那种开发web项目简单多…

测试人生 | 转行测试开发,4年4“跳”年薪涨3倍,我的目标是星辰大海(附大厂面经)!

编者按&#xff1a;本文来自霍格沃兹测试学院优秀学员TesterC&#xff0c;**从运营岗位转行外包测试&#xff0c;再到测试开发&#xff0c;从待业在家到4年4“跳”进入 BAT 大厂&#xff0c;年薪涨了3倍&#xff01;**他是如何完成如此励志的华丽转身的&#xff1f; 应学院的邀…

C++5-explicit、const的用法、mutable、常成员函数构成重载、在主函数中修改m_i的值

一、explicit的使用 explicit作用&#xff1a; 明确确定构造函数只能构造对象 代码示例&#xff1a; class A { public:A(int i 0):m_i(i){cout<<"A"<<i<<endl;}//构造函数可以用作类型转换&#xff0c;将int转换成类对象//explicit A(int i …

网络原理 --- 传输层Ⅰ UDP协议

文章目录网络原理传输层UDP 协议总结网络原理 介绍TCP/IP协议中每一层里面的核心内容~ 应用层传输层网络层数据链路层物理层 传输层 传输层主要负责端到端之间的传输,重点关注的是起点和终点 核心的协议有两个: UDP: 无连接 ,不可靠传输,面向数据报,全双工TCP : 有连接,可…

1024程序员节来了,

在中国“硅谷”西三旗&#xff0c;高精尖人才聚集地&#xff0c;一个砖头扔下来&#xff0c;砸中的10个人中&#xff0c;有7个是程序员 如今&#xff0c;程序员已发展成社会的主流职业&#xff0c;有多主流呢&#xff1f; 街头的王大妈李大爷都在讨论&#xff1a; “我儿子程…

vite+vue3+ts项目搭建之集成qiankun让其成为子应用模板(vite+vue3+ts+qiankun项目)

前言 以下操作&#xff0c;是续接之前 第四步 ——即&#xff1a;vitevue3tspiniaelement-plus项目已完成搭建好&#xff0c;可以直接业务开发了 主应用技术栈&#xff1a;vue2webpackjs 集成qiankun(微前端) 1、安装vite-plugin-qiankun npm install vite-plugin-qiankun2、…

在Eclipse 中使用 Maven 创建雅加达 EE 应用程序

在本教程中&#xff0c;我将指导大家如何在 Eclipse 中创建新的雅加达 EE 应用程序支持 Maven。 首先&#xff0c;在 Eclipse 中&#xff0c;转到“文件”&#xff0c;选择“新建”&#xff0c;然后选择“Maven 项目”&#xff1a; 要使用 Maven 创建雅加达 EE 项目&#xff0…