首页 > 数据库 >良心干货,常见的MySQL索引类型枚举!!!

良心干货,常见的MySQL索引类型枚举!!!

时间:2024-03-22 11:03:17浏览次数:22  
标签:查询 索引 枚举 干货 哈希 MySQL 主键 id

在MySQL中,索引是一种用于快速查询和检索数据的数据结构。它们类似于书籍的目录,可以帮助数据库系统更快地定位到特定的数据行,而不需要扫描整个数据表。索引可以显著提高查询性能,特别是在处理大量数据时。

MySQL支持多种类型的索引,每种索引都有其特定的使用场景和优势。以下是一些常见的MySQL索引类型:

  1. B-Tree索引:这是MySQL中最常用的索引类型,用于InnoDB、MyISAM等存储引擎。B-Tree(平衡树)索引能够保持数据的有序性,使得范围查询、排序等操作非常高效。

  2. 哈希索引:哈希索引基于哈希表实现,适用于等值查询。它们对于非等值查询和排序操作不太适用,因为哈希索引不存储数据的顺序信息。MySQL的MEMORY存储引擎支持哈希索引。

  3. 全文索引:全文索引主要用于文本搜索。MySQL的MyISAM和InnoDB存储引擎(从MySQL 5.6版本开始)支持全文索引。全文索引允许你在文本列上执行复杂的搜索查询,如自然语言查询、布尔查询等。

  4. 空间索引:空间索引用于地理空间数据类型,如点、线和多边形等。MySQL通过Spatial Extensions支持空间索引,这使得地理空间查询变得高效。空间索引通常用于GIS(地理信息系统)应用。

  5. 聚簇索引:在InnoDB存储引擎中,表总是按照主键的顺序存储的,这种存储方式称为聚簇索引。如果表没有定义主键,InnoDB会选择一个非空且唯一的索引代替。如果没有这样的索引,InnoDB会生成一个隐藏的聚簇索引。聚簇索引对于按主键查询非常高效。

  6. 复合索引:复合索引包含多个列的值。当你需要根据多个列进行查询时,复合索引可以提高查询性能。但是,复合索引的设计和使用需要仔细考虑,因为索引的列顺序和查询条件都会影响索引的效果。

创建索引时需要考虑的因素包括:

  • 查询的频率和类型:频繁查询的列和用于WHERE子句、JOIN操作或ORDER BY子句的列是创建索引的好候选。
  • 数据的唯一性:具有高唯一性的列(如主键或唯一约束)通常是索引的好候选。
  • 更新频率:频繁更新的列可能不适合创建索引,因为索引需要在数据更改时进行维护,这会增加写操作的开销。
  • 索引的开销:索引会占用额外的磁盘空间,并且在插入、删除和更新操作时需要维护,这可能会降低这些操作的性能。因此,在创建索引时需要权衡查询性能的提升和额外开销之间的关系。

以下是关于MySQL中索引的举例说明:

1. B-Tree索引

例子:

假设我们有一个用户表users,它包含数百万行数据,我们想要通过用户的email地址快速查找用户信息。我们可以在email列上创建一个B-Tree索引来加速查询。

CREATE INDEX idx_email ON users(email);

现在,当我们执行如下查询时:

SELECT * FROM users WHERE email = '[email protected]';

MySQL可以使用idx_email索引快速定位到包含指定email地址的数据行,而不是扫描整个表。

2. 哈希索引

注意: MySQL本身并不直接支持创建哈希索引,但某些存储引擎(如MEMORY)可能使用哈希索引进行等值查询。然而,由于哈希索引的局限性(不支持范围查询和排序),它们并不常用。通常,B-Tree索引在大多数情况下都是更好的选择。

例子:

假设我们使用MEMORY存储引擎创建了一个表,并且想要通过某个唯一标识符快速检索行:

CREATE TABLE users_memory (
    id INT NOT NULL,
    username VARCHAR(50),
    email VARCHAR(100),
    PRIMARY KEY (id) USING HASH
) ENGINE=MEMORY;

这里,PRIMARY KEY (id) USING HASH尝试指定一个哈希索引作为主键索引。但是,请注意,实际上MySQL的MEMORY存储引擎并不支持直接使用USING HASH语法来创建哈希索引。这个例子是为了说明目的而编写的,并不是有效的MySQL代码。

在真实场景中,你通常会看到使用B-Tree作为主键索引的MEMORY表。然而,MEMORY存储引擎确实在内部使用了哈希索引来加速等值查找,但这是对用户透明的。

3. 全文索引

例子:

假设我们有一个包含文章内容的articles表,我们想要允许用户通过关键词搜索文章。我们可以在文章内容列上创建一个全文索引来实现这一点。

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    FULLTEXT idx_content (content)
) ENGINE=InnoDB;

现在,我们可以使用MATCH()AGAINST()函数来执行全文搜索查询:

SELECT * FROM articles WHERE MATCH(content) AGAINST('MySQL index');

这将返回内容中包含“MySQL index”关键词的文章。

4. 空间索引

例子:

假设我们有一个包含地理位置信息的locations表,我们可以使用空间索引来加速地理空间查询。

CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    coordinates POINT NOT NULL,
    SPATIAL INDEX idx_coordinates (coordinates)
) ENGINE=InnoDB;

现在,我们可以使用空间函数来查询位于特定区域内的位置:

SELECT * FROM locations WHERE ST_Within(coordinates, ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'));

这将返回所有位于指定多边形区域内的位置。

5. 聚簇索引

例子:

在InnoDB存储引擎中,如果你为表定义了一个主键,InnoDB会自动使用该主键作为聚簇索引。假设我们有以下表结构:

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    birth_date DATE
);

在这个例子中,id列是主键,因此InnoDB会自动为它创建一个聚簇索引。这意味着表数据实际上是根据id列的值顺序存储的。这种存储方式可以提高按主键查询的效率。

6. 复合索引

例子:

假设我们有一个订单表orders,并且我们经常需要根据订单日期和客户ID来查询订单。我们可以在这两个列上创建一个复合索引来提高查询性能。

CREATE INDEX idx_order_date_customer_id ON orders(order_date, customer_id);

现在,当我们执行以下查询时:

SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31' AND customer_id = 123;

MySQL可以使用idx_order_date_customer_id索引来快速定位满足条件的订单。但是,请注意索引的列顺序对于索引的效率和使用非常重要。在这个例子中,索引是按照order_datecustomer_id的顺序创建的,因此它对于先按order_date过滤,再按customer_id过滤的查询非常有效。如果查询条件的顺序与此不同,索引可能不会被充分利用。

标签:查询,索引,枚举,干货,哈希,MySQL,主键,id
From: https://blog.csdn.net/qq_43536788/article/details/136914283

相关文章

  • 【测试开发学习历程】MySQL分组查询与子查询 + MySQL表的联结操作
    目录1 MySQL分组查询与子查询1.1数据分组查询1.2过滤分组1.3分组结果排序1.4select语句中子句的执行顺序1.5子查询2 MySQL表的联结操作2.1关系表2.2表联结2.3笛卡尔积2.4内部联结2.5外联结2.6自联结2.7组合查询1 MySQL分组查询与子查询1.1......
  • 浅谈MySQL中的外键、索引和性能优化
    当我们讨论MySQL中的外键、索引和优化时,我们通常指的是为了提高数据库查询效率、数据完整性和整体性能而采取的一系列措施。1.外键(ForeignKeys)定义:外键是一个字段,它在一个表中引用另一个表的主键。外键用于确保数据引用完整性和在两个表之间建立关系。举例:假设......
  • 结构体&&联合&&枚举(详解版)
    1.结构体    1.结构体的声明structtag{member-list;}variable-list;    2.结构体的特殊声明struct{inta;charb;floatc;}x;struct{inta;charb;floatc;}a[20],*p;                 上述代码属于匿名结构体类型......
  • 【测试开发学习历程】MySQL增删改操作 + 备份与还原 + 索引、视图、存储过程
    前言:SQL内容的连载,到这里就是最后一期啦!如果有小伙伴要其他内容的话,我会追加内容的。(前提是我有学过,或者能学会)接下来,我们就要开始python内容的学习了~~ 目录1 MySQL增删改操作1.1数据添加操作1.1.1插入完整的行1.1.2插入多行1.2数据更新操作1.3数据删除操......
  • PHP+MySQL开发组合:智慧同城便民信息小程序源码系统 带完整的安装代码包以及安装部署教
    当前,城市生活的节奏日益加快,人们对各类便民信息的需求也愈发迫切。无论是寻找家政服务、二手交易,还是发布租房、求职信息,一个高效、便捷的信息平台显得尤为重要。传统的信息发布方式往往存在信息更新不及时、查找困难等问题,无法满足现代都市人的需求。罗峰给大家分享一款智慧同......
  • MySQL必知必会
    #Mysql##Mysql事务###原则1.只有使用了INNODB引擎的数据库或表才支持事务2.原子性:具备回滚机制,只有全部完成和全部不完成两种状态。3.一致性:事务开启前和结束后数据库完整性没有被破坏。4.隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。防止事务同时执行......
  • 毕业设计课题:实验室课程管理系统,基于java+SSM+mysql
          一、前言介绍     如今互联网发展迅猛,大量的信息都是通过网络这一渠道来传播,所以利用网络渠道来传播知识是非常有前景的。线上管理系统的主要目的是对实验室课程信息进行更有效的管理,光靠现有的管理方式是远远不够的,因此开发实验室课程管理系统是有必要的......
  • 毕业设计课题:少儿编程管理系统,基于java+SSM+mysql
          一、前言介绍     21世纪,我国早在上世纪就已普及互联网信息,互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统,由从今传统的管理模式向互联网发展,如今开发自己的系统是理所当然的。那么开发少儿编程管理系统意义和用处有哪些呢? ......
  • MySQL 索引:索引为什么使用 B+树?
    Hash索引不支持顺序和范围查询;二叉查找树(BST):解决了排序的问题,极端情况下可能会退化成线性链表,查询效率急剧下降;平衡二叉树(AVL):通过旋转解决了平衡的问题,但是旋转操作效率太低; AVL树是严格的平衡二叉树,所有节点的左右子树高度差不能超过1红黑树:通过舍弃严格的平......
  • 8、MySql数据库连接
    fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyfromsqlalchemyimporttextapp=Flask(__name__)#主机IP地址HOSTNAME="127.0.0.1"#MySql的监听端口号,默认3306PORT=3306#用户名,密码,自己设置的USERNAME="root"PASSWORD="root&......