首页 > 数据库 >mysql索引概念以及索引底层数据结构

mysql索引概念以及索引底层数据结构

时间:2024-12-05 15:33:43浏览次数:11  
标签:age MySQL stmt 查询 索引 connection mysql 数据结构

一、什么是 MySQL 索引

索引是数据库管理系统中一种用于提高数据检索效率的数据结构。通过在表的一个或多个列上创建索引,可以显著加快数据查询的速度,但会增加插入、删除和更新操作的开销。

MySQL 中索引的核心作用是快速定位数据位置,减少磁盘 I/O 操作,从而提高查询效率。索引在 MySQL 中有以下几种主要类型:

  1. 主键索引 (Primary Key Index)
    唯一标识表中的一条记录,不允许为 NULL。

  2. 唯一索引 (Unique Index)
    保证索引列中的值唯一,但允许存在 NULL。

  3. 普通索引 (Index)
    用于加速查询,但无唯一性约束。

  4. 全文索引 (Fulltext Index)
    专用于全文搜索。

  5. 复合索引 (Composite Index)
    在多个列上创建的索引。


二、索引的底层数据结构

MySQL 的索引底层主要采用以下两种数据结构:

  1. B+树
    B+树是 MySQL 默认的索引数据结构,尤其是 InnoDB 引擎使用的主索引(聚簇索引)和二级索引(非聚簇索引)均基于 B+树。

    B+树的特点

    • 所有数据存储在叶子节点,内部节点仅存储索引值和指向子节点的指针。
    • 叶子节点通过双向链表相连,支持范围查询。
    • 插入和删除操作会保持树的平衡,具有良好的稳定性。

    B+树索引工作流程

    • 查询从根节点开始,逐层搜索直到叶子节点。
    • 利用树的高度和分支因子,使得查询复杂度接近 (O(\log N))。

    聚簇索引 (Clustered Index)
    数据存储和索引紧密耦合,主键索引即为聚簇索引。

    非聚簇索引 (Non-clustered Index)
    索引存储和数据存储分离,叶子节点保存指向主键的引用。

  2. 哈希索引 (Hash Index)
    通过哈希函数将键值映射为固定长度的哈希码,适用于等值查询,但不支持范围查询。


三、B+树索引与哈希索引对比
特点B+树索引哈希索引
查询效率稳定,支持范围查询快速,适用于等值查询
范围查询支持不支持
磁盘I/O较少较多
存储结构有序无序
适用场景通用单键值查询

四、MySQL 索引使用的最佳实践
  1. 选择合适的列创建索引

    • 高选择性列适合作为索引列(选择性 = 唯一值数量 / 总记录数)。
    • 经常出现在 WHERE 条件或 JOIN 的列优先考虑创建索引。
  2. 复合索引与最左前缀原则

    • 对多列查询创建复合索引时,应按照查询频率从高到低排列。
    • 查询条件需要包含复合索引的最左边列才能使用索引。
  3. 避免创建冗余索引

    • 同一列上的多个相似索引会导致性能下降和存储浪费。
  4. 定期维护索引

    • 对经常修改的数据表,定期使用 OPTIMIZE TABLE 命令优化索引结构。

五、Java 示例代码

以下是使用 Java 和 MySQL 结合的索引查询示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class MySQLIndexDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb";
        String username = "root";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            // 创建表和索引
            createTableAndIndex(connection);

            // 插入数据
            insertData(connection);

            // 使用索引进行查询
            queryWithIndex(connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void createTableAndIndex(Connection connection) throws Exception {
        String createTableSQL = """
            CREATE TABLE IF NOT EXISTS users (
                id INT AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(50) NOT NULL,
                email VARCHAR(50) UNIQUE,
                age INT
            );
        """;

        String createIndexSQL = """
            CREATE INDEX idx_age ON users(age);
        """;

        try (PreparedStatement stmt = connection.prepareStatement(createTableSQL)) {
            stmt.execute();
        }

        try (PreparedStatement stmt = connection.prepareStatement(createIndexSQL)) {
            stmt.execute();
        }
    }

    private static void insertData(Connection connection) throws Exception {
        String insertSQL = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
        try (PreparedStatement stmt = connection.prepareStatement(insertSQL)) {
            for (int i = 1; i <= 100; i++) {
                stmt.setString(1, "User" + i);
                stmt.setString(2, "user" + i + "@example.com");
                stmt.setInt(3, 20 + (i % 10)); // age ranges from 20 to 29
                stmt.executeUpdate();
            }
        }
    }

    private static void queryWithIndex(Connection connection) throws Exception {
        String querySQL = "SELECT * FROM users WHERE age = ?";
        try (PreparedStatement stmt = connection.prepareStatement(querySQL)) {
            stmt.setInt(1, 25); // Query users with age = 25

            try (ResultSet rs = stmt.executeQuery()) {
                while (rs.next()) {
                    System.out.printf("ID: %d, Name: %s, Email: %s, Age: %d%n",
                            rs.getInt("id"), rs.getString("name"), rs.getString("email"), rs.getInt("age"));
                }
            }
        }
    }
}

六、总结

MySQL 索引是提升数据库性能的重要工具,但需要合理设计和使用。B+树作为主流索引结构,既支持高效查询,又能保证数据的有序性。Java 代码示例展示了如何结合 MySQL 创建索引、插入数据并执行索引查询,实践了理论与应用的结合。

标签:age,MySQL,stmt,查询,索引,connection,mysql,数据结构
From: https://blog.csdn.net/Flying_Fish_roe/article/details/144241758

相关文章

  • 数据结构:顺序表详解
    1.顺序表的概念与定义2.顺序表的初始化与销毁3.顺序表的头/尾部的插入与删除4.顺序表指定位置的插入和删除4.对顺序表中的数据的查找5.总结我以过客之名,祝你前程似锦一.顺序表的概念与定义1.概念:顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是......
  • 【innodb阅读笔记】之 索引组织表
    一、组织索引表主键规则        在Innodb存储引擎中,表都是根据主键索引的顺序组织存放的,这种存放方式的表称为索引组织表,在innodb存储引擎表中,每个表都有一个主键,如果在创建表的时候没有显示的定义主键,则innodb会按如下方式选择或创建主键:    1.首先判断表......
  • Python如何将Excel数据导入到MySQL数据库?详细教程与实战示例
    在数据处理和分析的过程中,我们常常需要将Excel数据导入到MySQL数据库中,以便进行更高效的查询和管理。那么,如何利用Python实现这一过程呢?本文将深入探讨Python将Excel数据导入到MySQL数据库的方法,并提供详细的教程和实战示例。无论您是初学者还是有经验的开发者,都可以通过本文掌......
  • 第一部分:基础知识 6. 函数 --[MySQL轻松入门教程]
    MySQL提供了丰富的内置函数,涵盖了字符串处理、数值计算、日期时间操作、聚合分析以及控制流等多个方面。这些函数可以帮助用户更高效地进行数据查询和处理。1.字符串函数MySQL提供了丰富的字符串函数来帮助用户处理和操作字符串数据。下面是一些常用的MySQL字符串函数......
  • 链接MySQL报错2059 -Authentication plugin ‘caching sha2 password‘ cannot be loa
    1.报错内容: 2059-Authenticationplugin'cachingsha2password'cannotbeloaded2.报错截图:3.原因分析:如上图的报错提示可知,报错原因是caching_sha2_password不能加载。在MySQL8.0及以上版本中,默认的用户密码认证插件是'caching_sha2_password',而在MySQL5.7及以下......
  • Mysql基础——Gtid开启方法
    一、Gtid简介GTIDtransactionsareidentifiedbyaglobaltransactionidentifier(GTID)intheformUUID:NUMBER.EveryGTIDtransactioninalogisalwaysprecededbyaGtid_log_event.GTIDtransactionscanbeaddressedusingeithertheGTIDorusingthefile......
  • Mysql基础——主从MySQL手动同步
    mysql主从数据同步失败手动同步数据的方法 进入master执行1、锁表flushtableswithreadlock; 2、导出备份数据mysqldump-uroot-ptest1>/tmp/mysql.sql 3、查看主库状态记录偏移量position的值showmasterstatus; 4、将备份数据文件发入到从库服务......
  • mysql在线DDL工具--pt-online-schema-change 详细介绍
    pt-online-schema-change详细介绍简介pt-online-schema-change-无锁表修改表结构工具,这里无锁表也不是绝对的,在交互原表与中间表表名的时候也会有元数据锁,只不过时间很短语法pt-online-schema-change[OPTIONS]DSN#给表actor.sakila添加一个列pt-online-schema-change......
  • 索引的创建原则、索引失效的场景
    索引创建的原则有哪些?在项目中主要用到主键索引、唯一索引、根据业务创建的索引(复合索引)*针对数据量较大,而且查询比较频繁的表建立索引(单表超过10w条数据(增加用户体验))*针对常作为查询条件(where)、排序(orderby)、分组(groupby)操作做的字段建立索引尽量选择区分度高的字......
  • Mysql bin log 清理
    查看binlog查看binlog日志状态showvariableslike'%log_bin%';查看已生产的mysql-binlog日志showbinarylogs; 清除binlogbinlog日志已经影响到了磁盘空间,那么你将使用下面命令清除mysql>resetmaster;#清空所有binlog文件mysql还做了主从同步,......