四时宝库

程序员的知识宝库

mysql索引概念(mysql索引的几种类型)

(1)索引的本质是什么?

索引的本质是一种数据结构,用于提高数据库在查询、排序和连接操作时的数据检索效率。从数据结构的角度来看,常见的索引实现方式如 B 树(包括 B+树),其目的是通过对数据进行有序组织和存储,减少数据库系统在查找特定数据时所需的磁盘 I/O 操作次数和比较次数。通过创建索引,数据库可以快速定位到与查询条件匹配的数据所在的位置,而无需对整个表进行顺序扫描。这就大大缩短了查询时间,特别是对于大型数据表,索引的作用尤为明显。简而言之,索引是对数据表中数据的一种高效组织和快速访问的机制。

(2)MySQL数据库中,数据是怎么进行检索的,MySQL 在检索表中的数据时,先按照索引“关键字”的值在索引中进行查找,如果能够查到,则可以直接定位到数据所在的起始页;如果没有查到,只能全表扫描查找数据了。

(3)一个数据库表只能创建一个索引吗?

答案是否定的。想象一下《现代汉语词典》,除了将汉语拼音编入“音节表”实现汉字的检索功能外,还将所有汉字的部首编入“部首检字表”实现汉字的检索功能,“部首检字表”是《现代汉语词典》的另一个“索引”。同样对于数据库表而言,一个数据库表可以创建多个索引。

(4)什么是前缀索引?

“部首检字表”的使用方法是:首先确定一个字的部首,结合笔画可以查找到该字所在的起始页。前缀索引是一种在数据库中对文本字段的前几个字符建立的索引。它只针对字段值的一部分进行索引,而不是对整个字段值进行索引。例如,对一个存储用户姓名的字段建立前缀索引,可以只索引姓名的前面几个字符。在确定前缀索引的长度时,需要找到一个平衡点。一方面,希望前缀足够长以保证较高的选择性,即在查询过程中不需要扫描很多行;另一方面,又不希望索引占用过多存储空间。通常可以通过计算不同前缀长度的选择性来确定合适的长度,使得前缀索引的选择性接近于索引的整个列,即前缀的基数接近于完整列的基数。具体方法是先计算全列的选择性

(通过执行

SELECT COUNT(DISTINCT column_name) / COUNT(*)

FROM table_name; ),

然后再计算不同前缀长度的选择性(执行

SELECT COUNT(DISTINCT LEFT(column_name, prefix_length)) / COUNT(*) FROM table_name; ),

调整前缀长度的值,直到计算结果约等于全列选择性。

例如,对于用户 身份证 字段,全列选择性为 1(说明该列的值都是唯一不重复的),通过测试不同的前缀长度,发现当 prefix_length 为 10 时,选择性也达到了 1,意味着在大量数据中,使用该字段查询时只需输入前十个字符,就能唯一定位到一条具体的记录。此时,就可以创建前缀索引

ALTER TABLE system_user ADD INDEX user_id_card_index(id_card(10)); 。

创建前缀索引的语法通常为:

ALTER TABLE table_name ADD INDEX index_name(column_name(prefix_length));

其中 table_name 是要添加索引的表名,index_name索引的名称, column_name 是要建立索引的列名, prefix_length 是指定的前缀长度。

总的来说,前缀索引是在索引性能和存储空间之间进行平衡的一种方式,适用于字段值较长且前几个字符具有较高区分度的情况。但在使用时需要根据具体的查询需求和数据分布进行权衡和测试,以确保索引的有效性和性能提升。

(5)索引可以是字段的组合吗?

当然可以。对于数据库而言,索引可以是字段的组合。数据库表的某个索引如果由多个关键字构成,此时该索引称为“复合索引”。无论索引的关键字是一个字段,还是多个字段。

(6)索引数据需要额外的存储空间吗?

当然需要。翻开词典后,几十页甚至上百页的内容存放的是“索引”数据。对于数据库表的索引而言,索引关键字经排序后存放在外存中。对于 MyISAM 数据库表而言,索引数据存放在外存MYI索引文件中。对于InnoDB数据库表而言,索引数据存放在外存InnoDB表空间文件中(可能是共享表空间文件,也可能是独享表空间文件)。为了提升数据的检索效率,无论 MyISAM 表的索引,还是InnoDB表的索引,索引关键字经排序(默认为升序排序)后存放在外存文件中。这也是为什么常说的适当建立索引对优化查询有帮助,索引并非越多越好。

(7)表中的哪些字段适合选作表的索引?什么是非聚蔟索引和聚簇索引?

适合选作表索引:

1. 经常用于查询、连接和排序操作的字段。

2. 唯一性较高的字段,例如主键。

3. 数据分布范围较广的字段,能够提高索引的选择性。(例如,姓名,电话适合做索引;性别 就不适合)

聚簇索引:

1. 表中的数据按照聚簇索引的顺序进行物理存储。

2. 一个表只能有一个聚簇索引。

3. 通常基于主键创建,如果没有定义主键,会选择一个不允许为 NULL 且唯一性较高的列作为聚簇索引。

4. 由于数据的物理存储顺序与索引顺序一致,聚簇索引对于范围查询和排序操作性能较好。

非聚簇索引:

1. 非聚簇索引的叶子节点不包含实际的数据行,而是存储了索引列的值以及对应的主键值(或者指向数据行的指针)。

2. 一个表可以有多个非聚簇索引。

3. 非聚簇索引需要通过主键值或者指针再去查找实际的数据行,因此在查询时可能需要额外的 I/O操作。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接