目录
MySql索引理解与使用
- 1.前言
- 2.MyISAM和InnoDB 实现B+Tree的不同
- 3.常见的索引
- 3.1按照Navicat创建MySQL索类型
- 3.1.1普通索引(Normal Index)
- 3.1.2唯一索引(Unique Index)
- 3.1.3全文索引(Fulltext Index)
- 3.1.4空间索引(Spatial Index)
- 3.2 按照底层存储方式
- 3.2.1 聚蔟索引(聚集索引)
- 3.2.1 非聚蔟索引(非聚集索引)
- 3.3 按照数据结构维度划分
- 3.3.1 BTree索引
- 3.3.2 哈希索引
- 3.3.3 全文索引
- 4.创建索引
- 4.1通过Navicat可视化设计表创建
- 4.2通过SQL语句创建
- 参考
文章所属专区 超链接
1.前言
MySQL 索引是一种数据结构,用于加快数据库查询的速度和性能,它可以大大提高MySQL的检索速度,相当于一本字典中的目录,使得他可以按照拼音 部首 笔画等方式快速检索,索引也是一样的作用,其本质是一个排序好的数据结构。
索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,
无论是 Innodb 还是MyIsam,都使用了 B+树作为索引结构
2.MyISAM和InnoDB 实现B+Tree的不同
- 在MyISAM引擎中,索引文件和数据文件是分离的,称为非聚蔟索引
- 在InnoDB 引擎中,数据文件本身就是索引文件,称为聚蔟索引
下面的内容整理自《Java 工程师修炼之道》
MyISAM 引擎中,B+Tree 叶节点的 data 域存放的是数据记录的地址。在索引检索的时候,首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引(非聚集索引)”。InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。这被称为“聚簇索引(聚集索引)”,而其余的索引都作为 辅助索引 ,辅助索引的 data 域存储相应记录主键的值而不是地址,这也是和 MyISAM 不同的地方。在根据主索引搜索时,直接找到 key 所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
3.常见的索引
3.1按照Navicat创建MySQL索类型
3.1.1普通索引(Normal Index)
普通索引是最常见的索引类型,用于加快搜索速度。它可以在一个或多个列上创建,并且允许重复的值。
3.1.2唯一索引(Unique Index)
唯一索引要求索引列的值是唯一的,不允许重复。它可以用于确保数据的唯一性,并且在加速查找时也起到了作用。
3.1.3全文索引(Fulltext Index)
全文索引用于在文本类型的列上进行全文搜索。它可以提供更高效的文本搜索功能,适用于处理较大的文本数据。
3.1.4空间索引(Spatial Index)
空间索引用于处理具有空间属性的数据,例如地理位置信息。它可以加速空间数据的查询,如范围查询和交叉查询。
3.2 按照底层存储方式
3.2.1 聚蔟索引(聚集索引)
索引结构和数据一起存放的索引,InnoDB 中的主键索引就属于聚簇索引。
3.2.1 非聚蔟索引(非聚集索引)
索引结构和数据分开存放的索引,二级索引(辅助索引)就属于非聚簇索引。
3.3 按照数据结构维度划分
3.3.1 BTree索引
Mysql里默认和最常用的索引类型,只有叶子结点存储value,非叶子结点只有指针和key
3.3.2 哈希索引
类似键值对的形式,一次即可定位。
3.3.3 全文索引
对文本的内容进行分词,进行搜索。目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
4.创建索引
4.1通过Navicat可视化设计表创建
注意:InnoDB默认使用B-Tree索引,而MyISAM默认不支持Hash索引,只支持B-Tree索引。
4.2通过SQL语句创建
使用 CREATE INDEX 语句可以创建普通索引
CREATE INDEX index_name
ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], …);
ALTER TABLE 创建索引的语法
ALTER TABLE table_name
ADD INDEX index_name (column1 [ASC|DESC], column2 [ASC|DESC], …);
创建表的时候,你可以在 CREATE TABLE 语句中直接指定索引
CREATE TABLE table_name (
column1 data_type,
column2 data_type,
…,
INDEX index_name (column1 [ASC|DESC], column2 [ASC|DESC], …)
);
参考
菜鸟教程-MySQL 索引
https://blog.csdn.net/Lg632/article/details/103156500
MySQL索引详解
mysql的索引方法btree和hash的区别
给个三连吧 谢谢谢谢谢谢了