Mysql索引

MySQL索引

索引的概念

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

索引的作用

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

索引的副作用

  • 索引需要占用额外的磁盘空间。
  • 对于MySAM引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。
  • 而 InnoDB 引擎的表数据文件本身就是索引文件。
  • 在插入和修改时间时要花费更多的时间,因此索引也要随之变动。

创建索引的原则依据

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

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

索引的分类和创建

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

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

在这里插入图片描述
在这里插入图片描述

修改表方式创建
ALTER TABLE 表名 ADD INDEX 索引名 (列名);

在这里插入图片描述

创建表的时候指定索引
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

在这里插入图片描述

唯一索引

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

直接创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名);

在这里插入图片描述

修改表方法创建

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

在这里插入图片描述

创建表的时候指定

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

在这里插入图片描述

主键索引

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

直接创建唯一索引:

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

在这里插入图片描述

修改表方式创建

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

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

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

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

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

在这里插入图片描述
在这里插入图片描述

全文索引(FULLTEXT)

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

直接创建索引

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

在这里插入图片描述

修改表方式创建

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

创建表的时候指定索引

CREATE TABLE 表名 (字段1 数据类型[,…],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT

使用全文索引查询

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

在这里插入图片描述

查看索引

show index from 表名;
show index from 表名\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;

在这里插入图片描述
各字段的含义如下
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。
Index_type:用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment:备注。

删除索引

直接删除索引

DROP INDEX 索引名 ON 表名;
在这里插入图片描述

●修改表方式删除索引
ALTER TABLE 表名 DROP INDEX 索引名;

●删除主键索引
ALTER TABLE 表名 DROP PRIMARY KEY;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值