媒介:在数据库管理体系中,索引是进步查询性能的焦点技能之一,无论是在大数据量的查询场景中,照旧在复杂查询条件下,公道利用索引都能明显加速数据检索的速率,MySQL作为一种广泛利用的关系型数据库,其索引机制对于优化查询性能至关紧张。
✨✨✨这里是秋刀鱼不做梦的BLOG
✨✨✨想要相识更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客
在正式开始讲授之前,先让我们看一下本文大抵的讲授内容:
目次
1.索引简介
(1)索引是什么
(2)利用索引的缘故因由
2.索引利用的数据结构
(1)HASH
(2)二叉搜索树
(3)N叉树
(4)B+树
3.索引范例
(1)主键索引
(2)平凡索引
(3)唯一索引
(4)全文索引
(5)聚集索引
(6)非聚集索引
4.索引的利用
(1)自动创建
(2)手动创建
【1】手动创建主键索引
【2】手动创建唯一索引
【3】手动创建平凡索引
(3)创建复合索引
(4)检察索引
(5)删除索引
(1)删除主键索引
(2)删除其他索引
1.索引简介
在开始学习MySQL的索引之前,先让我们相识一下什么是MySQL中的索引。
(1)索引是什么
在数据库管理体系中,索引是一种用于加速数据查找的数据结构,它通过在数据表上创建额外的数据结构,使得数据库可以或许更加高效地查找数据行。
可以将索引比作是一本书的目次,它资助我们快速定位到特定的章节内容,对于数据库而言,索引雷同于册本中的目次,指引着数据库引擎怎样快速定位和访问特定的数据行。
比方,当我们查找一本字典中的某个字时,我们可以通过目次页按照笔画、部首或拼音的次序快速定位到目标字。(如图)
(2)利用索引的缘故因由
显而易见,利用索引的紧张目标是提拔数据检索的服从,在大多数数据库应用中,查询利用的频率通常远高于增、删、改等利用。
因此,索引的优化作用尤为突出,尤其是在处置惩罚大量数据时,它可以或许明显镌汰查询所需的时间,没有索引时,数据库只能举行全表扫描,查找目标数据。而有了索引后,数据库只需查找索引结构,从而大大镌汰了数据访问的本钱。
——这就是为什么我们必要在MySQL中添加索引,而且为什么利用它。
通过上述的简短先容之后,读者应该对索引有了肯定的相识了,那么接下来就让我们开始正式的学习MySQL中的索引吧!
2.索引利用的数据结构
在上文中我们已经说到,MySQL中的索引是一种数据结构,那么其到底是哪种数据结构呢?接下来让我们一起探索一下:
(1)HASH
我们知道哈希索引的时间复杂度是O(1),查询速率非常快,在理想环境下,哈希索引可以或许实现常数时间的查找。然而,哈希索引的范围性在于它不支持范围查询,比如,BETWEEN、>、<等利用都无法通过哈希索引高效实行,因此它并不实用于全部的查询场景。
——以是MySQL并没有将哈希作为默认的索引数据结构,缘故因由就在于它的这些范围性。
(2)二叉搜索树
二叉搜索树是一个经典的数据结构,此中每个节点的值都大于其左子树的全部节点,小于其右子树的全部节点,通过这种结构,我们可以在有序的数据会合实现高效的查找,然而,二叉搜索树在最坏环境下的时间复杂度为O(N),而且随着数据量的增长,树的高度大概会非常大,导致查询性能降落。
固然AVL树和红黑树等自平衡二叉树可以在肯定水平上缓解这一标题,但二叉树依然存在每次检索都必要访问多个节点,导致频仍的磁盘I/O利用,这些磁盘I/O利用在数据库体系中是性能瓶颈,因此二叉搜索树也不是MySQL中的索引的数据结构。
(3)N叉树
为了降服二叉树的标题,N叉树通过将每个节点的子节点数量增长到N(大于2)来有用低沉树的高度,当日这也意味着雷同数据量的环境下,N叉树的树高比二叉树要低,镌汰了每次查询时必要访问的节点数,从而镌汰了磁盘I/O的次数,提拔了查询服从。
但是只管N叉树在理论上可以或许有用地进步查询服从,MySQL也并未选择N叉树作为默认的索引数据结构,缘故因由是N叉树固然在镌汰树高方面有上风,但是尚有更好的数据结构。
(4)B+树
末了我们来说一下MySQL中默认索引数据结构,B+树,其作为MySQL的默认索引数据结构,在数据库体系中得到了广泛的应用。B+树是一种自平衡的多路查找树,它通过非叶子节点存储索引信息,叶子节点则存储实际的数据。这种结构的最大上风在于它能有用保持数据的有序性,而且支持范围查询,特别适当处置惩罚大量数据的检索。
根据上述所述,B+树就作为了MySQL中索引的数据结构的最佳选择。
3.索引范例
在相识完了MySQL中索引所利用的数据结构之后,让我们来学习一下在MySQL中到底又哪些索引范例:
(1)主键索引
主键索引是数据库中的特别索引范例,用于包管表中数据的唯一性和完备性,每个表只能有一个主键索引,通常是通过PRIMARY KEY束缚来创建,主键索引也是聚集索引,即数据表的数据行是按主键值次序存储的。
让我们看一个创建主键索引的例子:
- CREATE TABLE users (
- id INT PRIMARY KEY,
- name VARCHAR(100)
- );
复制代码 特点:
- 每个表只能有一个主键索引。
- 数据行按照主键值的次序存储(聚集存储)。
- 包管主键列数据的唯一性,不答应重复值。
- 不答应NULL值。
(2)平凡索引
平凡索引是最根本的索引范例,用于加速查询利用,它不要求列的值唯一,实用于没有唯一性要求的场景。
让我们看一个创建平凡索引的例子:
- CREATE INDEX idx_name ON users(name);
复制代码 特点:
- 用于加速查询。
- 答应列中有重复值。
- 可以包罗NULL值。
- 实用于单列查询。
(3)唯一索引
唯一索引与平凡索引雷同,但它包管了索引列中的数据值唯一,唯一索引常用于确保数据列的唯一性,如用户邮箱、身份证号等。
让我们看一个创建唯一索引的例子:
- CREATE UNIQUE INDEX idx_unique_email ON users(email);
复制代码 特点:
- 包管索引列中的数据唯一,不答应重复值。
- 答应一个NULL值(取决于数据库实现)。
- 可以用于多个列的组合,确保组合列的唯一性。
(4)全文索引
全文索引是专门用于加速对大文本字段举行查询的索引范例,通常用于TEXT范例或VARCHAR范例的字段,全文索引支持含糊匹配,可以对长文本内容举行高效的全文检索,通过MATCH ... AGAINST语句来实行全文搜索。
让我们看一个创建全文索引的例子:
- CREATE FULLTEXT INDEX idx_fulltext_content ON articles(content);
复制代码 特点:
- 用于加速对大文本字段(如TEXT)的全文搜索。
- 支持含糊查询和自然语言查询。
- 不实用于小字段或通例查询。
- 在MySQL中,只有MyISAM和InnoDB(8.0及以上)支持全文索引。
(5)聚集索引
聚集索引是数据库中唯一的索引范例,数据表的实际数据存储次序与聚集索引的次序雷同,每个表只能有一个聚集索引,由于数据行只能有一个排序次序,通常,主键索引即为聚集索引,假如没有主键,数据库会选择其他唯一的列作为聚集索引。
让我们看一个创建聚集索引的例子:
- CREATE TABLE users (
- id INT PRIMARY KEY,
- name VARCHAR(100)
- );
复制代码 ——实在我们发现主键索引就是聚集索引!!!
特点:
- 每个表只能有一个聚集索引。
- 数据行按照索引次序存储。
- 索引创建时,表的数据会重新排序。
- 聚集索引查询范围数据时服从较高,但插入、删除数据时大概会有额外开销。
(6)非聚集索引
非聚集索引是指索引的次序与数据存储的次序无关。与聚集索引差别,非聚集索引将索引数据和实际数据行分开存储。非聚集索引通常用于加速对单列或多列的查询,可以有多个非聚集索引。
让我们看一个创建非聚集索引的例子:
- CREATE INDEX idx_name ON users(name);
复制代码 特点:
- 可以在一个表上创建多个非聚集索引。
- 索引存储与数据存储次序无关。
- 查询服从较高,但插入、删除和更新时必要额外维护索引。
- 对于常用查询字段,非聚集索引可以进步查询性能。
以上就是MySQL中的常见的索引范例了!
4.索引的利用
相识完了索引的范例之后,那么我们怎样在MySQL中利用索引呢?接下来就让我们学习一下在MySQL中怎样利用索引:
(1)自动创建
当我们为一张表加主键束缚(Primary key),外键束缚(Foreign Key),唯一束缚(Unique)的时间,这时MySQL会为对应的的列自动创建一个索引,假如表不指定任何束缚时,MySQL会自动为每一列天生一个索引并用 ROW_ID 举行标识,这就是所谓的MySQL中的自动创建索引。
(2)手动创建
有了自动创建索引,那就肯定有手动创建索引啦,接下来让我们分别学习一下怎样手动创建主键索引,唯一索引平静凡索引:
【1】手动创建主键索引
方式一:创建表时直接在列界说中设置主键:
- CREATE TABLE t_test_pk (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20)
- );
复制代码 特点:
- 轻巧:主键和自增属性直接写在列界说中,语法直观。
- 自动增长:AUTO_INCREMENT 联合 PRIMARY KEY,可用于天生唯一标识符。
- 常用场景:实用于单列主键需求,计划清楚明白。
方式二:创建表时单独指定主键
- CREATE TABLE t_test_pk1 (
- id BIGINT AUTO_INCREMENT,
- name VARCHAR(20),
- PRIMARY KEY (id)
- );
复制代码 特点:
- 分离界说:主键的界说单独通过 PRIMARY KEY 指定,反面列的界说绑定。
- 机动性高:适当更复杂的场景,如连合主键:
- 实用场景:当表结构复杂,必要后期更改主键界说时保举利用这种方式
方式三:修改表后设置主键
创建表时未界说主键:
- CREATE TABLE t_test_pk2 (
- id BIGINT,
- name VARCHAR(20)
- );
复制代码 修改表,添加主键:
- ALTER TABLE t_test_pk2 ADD PRIMARY KEY (id);
- ALTER TABLE t_test_pk2 MODIFY id BIGINT AUTO_INCREMENT;
复制代码 特点:
- 后期调解:实用于初始创建时未界说主键的表。
- 分步调设置:
- ADD PRIMARY KEY 将某列设为主键。
- MODIFY 修改列属性为自增。
- 实用场景:表已经存在,且必要后续添加主键时利用。
以上就是在MySQL中手动创建主键索引的全部方式了!
【2】手动创建唯一索引
相识完了怎样手动创建主键索引之后,在让我们看一下怎样去手动创建唯一索引:
方式一:创建表时直接在列界说中设置唯一键
- CREATE TABLE t_test_uk (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20) UNIQUE
- );
复制代码 特点:
- 轻巧直观:唯一束缚直接在列界说中声明,语法清楚。
- 实用场景:实用于为单列设置唯一束缚,代码轻巧。
方式二:创建表时单独指定唯一束缚
- CREATE TABLE t_test_uk1 (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20),
- UNIQUE (name)
- );
复制代码 特点:
- 分离界说:唯一束缚与列界说分开,易于修改和调解。
- 实用场景:实用于多个唯一束缚或后期调解束缚的环境。
方式三:修改表后设置唯一束缚
- CREATE TABLE t_test_uk2 (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20)
- );
- ALTER TABLE t_test_uk2 ADD UNIQUE (name);
复制代码 特点:
- 后期调解:实用于在表创建后必要添加唯一束缚的场景。
- 机动性高:可以在已有表中添加或修改唯一束缚。
以上就是在MySQL中手动创建唯一索引的全部方式了!
【3】手动创建平凡索引
末了让我们看一下怎样手动创建平凡索引:
方式一:创建表时指定索引列
- CREATE TABLE t_test_index (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20) UNIQUE,
- sno VARCHAR(10),
- INDEX (sno)
- );
复制代码 特点:
- 轻巧:在表创建时直接为特定列添加索引,语法简朴明白。
- 实用场景:实用于表结构计划时直接思量索引的环境。
方式二:修改表中的列为平凡索引
- CREATE TABLE t_test_index1 (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20),
- sno VARCHAR(10)
- );
- ALTER TABLE t_test_index1 ADD INDEX (sno);
复制代码 特点:
- 机动性高:可以在表创建后添加索引,实用于已经存在的表。
- 实用场景:实用于已存在的表,必要根据查询需求后续添加索引的环境。
方式三:单独创建索引并指定索引名
- CREATE TABLE t_test_index2 (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20),
- sno VARCHAR(10)
- );
- CREATE INDEX index_name ON t_test_index2(sno);
复制代码 特点:
- 自界说索引名:可以为索引指定自界说的名字,方便后续管理和引用。
- 实用场景:当必要为表中的列创建索引,而且渴望指定索引名时利用。
以上就是在MySQL中手动创建平凡索引的全部方式了!
(3)创建复合索引
在相识完了手动创建主键索引、唯一索引平静凡索引之后,过细的读者大概会发问,岂非只能将一列设置为索引吗?答案是——不是的,我们可以将多列设置为复合索引。
而创建语法与创建平凡索引雷同,只不外指定多个列,列与列之间用逗号隔开:
方式一:创建表时指定复合索引列
- CREATE TABLE t_test_index4 (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20),
- sno VARCHAR(10),
- class_id BIGINT,
- INDEX (sno, class_id)
- );
复制代码 特点:
- 轻巧:在表创建时直接为多个列指定复合索引,语法轻巧。
- 实用场景:实用于在表计划时就必要为多个列创建复合索引的环境。
方式二:修改表中的列为复合索引
- CREATE TABLE t_test_index5 (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20),
- sno VARCHAR(10),
- class_id BIGINT
- );
- ALTER TABLE t_test_index5 ADD INDEX (sno, class_id);
复制代码 特点:
- 机动性高:可以在表创建后根据必要添加复合索引。
- 实用场景:实用于已经存在的表,在后期必要根据查询需求添加复合索引
方式三:单独创建索引并指定索引名
- CREATE TABLE t_test_index6 (
- id BIGINT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20),
- sno VARCHAR(10),
- class_id BIGINT
- );
- CREATE INDEX index_name ON t_test_index6 (sno, class_id);
复制代码 特点:
- 自界说索引名:可以为复合索引指定自界说的名字,方便后续管理和引用。
- 实用场景:当必要为多个列创建复合索引,而且渴望指定索引名时利用。
以上就是在MySQL中创建复合索引的三种方式了!!!
(4)检察索引
在相识完了创建索引之后,接下来让我们学习一下怎样在MySQL中检察索引,其有两种方式:
第一种:利用 SHOW INDEX 下令
表明:
- 该下令可以检察指定表的全部索引信息。
- 返回结果包罗索引名称、列名、唯一性、索引范例等。
第二种:利用 SHOW CREATE TABLE 下令
表明:
- 此下令会体现表的完备创建语句,包罗表中的全部索引。
- 返回结果中的 KEY 或 INDEX 部门体现了表中界说的索引。
以上就是在MySQL中检察索引的方式了!
(5)删除索引
末了让我们看一下在MySQL中怎样去删除索引,一共两种方式,一种删除主键索引,一种删除其他索引(非主键):
(1)删除主键索引
- ALTER TABLE 表名 DROP PRIMARY KEY;
复制代码 利用场景:
- 删除主键:假如你必要修改表的计划,大概表中的主键列不再实用,可以通过此语句删除主键。比方,主键列数据范例不适当或想要将主键列改为其他列。
- 复合主键:假如表利用了多个列作为主键(复合主键),可以删除整个复合主键。
例子:
- ALTER TABLE users DROP PRIMARY KEY;
复制代码 表明:这条语句会删除 users 表中的主键。
(2)删除其他索引
- ALTER TABLE 表名 DROP INDEX 索引名;
复制代码 利用场景:
- 删除不再必要的索引:假如某个索引不再用于优化查询,可以删除它。删除无用的索引有助于镌汰存储空间的利用,并进步写入利用(如 INSERT、UPDATE)的服从。
- 更换索引:在某些环境下,大概会创建一个新的索引来更换现有索引。删除旧的索引是优化表结构的一部门。
例子:
- ALTER TABLE employees DROP INDEX idx_name;
复制代码 表明:这条语句删除了 employees 表中名为 idx_name 的索引。
以上就是删除索引的方式了!!!
以上就是本篇文章全部内容~~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|