MySQL(151)什么是MySQL的二级索引?

MySQL 中的二级索引(Secondary Index),也称为非聚簇索引,是一种用于加速数据检索的索引,但它并不像聚簇索引(Primary Index)那样将数据存储在索引结构中。二级索引存储的是索引列的值和主键的值,通过主键值可以进一步访问表中的完整记录。

一、二级索引的工作原理

二级索引包含以下内容:

  1. 索引列的值:用于进行快速查找。
  2. 主键的值:用于通过主键定位到表中实际的数据行。

当使用二级索引进行查询时,MySQL会通过索引列的值找到对应的主键,然后再通过主键去查找实际的数据行。

二、创建和使用二级索引

以下是一个创建和使用二级索引的详细示例,包括创建表、插入数据、创建索引以及执行查询。

1. 创建数据库和表

首先,创建一个数据库和一个示例表。

sql 复制代码
CREATE DATABASE example_db;
USE example_db;

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(100),
    salary DECIMAL(10, 2)
);

2. 插入示例数据

插入一些示例数据。

sql 复制代码
INSERT INTO employees (name, department, salary) VALUES
('Alice', 'Engineering', 70000),
('Bob', 'Marketing', 50000),
('Charlie', 'Engineering', 80000),
('David', 'HR', 60000),
('Eve', 'Marketing', 55000);

3. 创建二级索引

department列上创建一个二级索引。

sql 复制代码
CREATE INDEX idx_department ON employees(department);

4. 使用二级索引进行查询

使用二级索引进行查询,通过EXPLAIN命令可以看到索引的使用情况。

sql 复制代码
EXPLAIN SELECT * FROM employees WHERE department = 'Engineering';

查询结果将显示MySQL使用了idx_department索引。

三、代码示例

以下是一个使用Java和JDBC来操作MySQL二级索引的示例。

1. 创建表和插入数据

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class MySQLSetup {

    private static final String URL = "jdbc:mysql://localhost:3306/example_db";
    private static final String USER = "root";
    private static final String PASSWORD = "password";

    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             Statement stmt = conn.createStatement()) {

            String createTable = "CREATE TABLE IF NOT EXISTS employees ("
                    + "id INT AUTO_INCREMENT PRIMARY KEY, "
                    + "name VARCHAR(100), "
                    + "department VARCHAR(100), "
                    + "salary DECIMAL(10, 2)"
                    + ")";
            stmt.execute(createTable);

            String insertData = "INSERT INTO employees (name, department, salary) VALUES "
                    + "('Alice', 'Engineering', 70000), "
                    + "('Bob', 'Marketing', 50000), "
                    + "('Charlie', 'Engineering', 80000), "
                    + "('David', 'HR', 60000), "
                    + "('Eve', 'Marketing', 55000)";
            stmt.execute(insertData);

            String createIndex = "CREATE INDEX idx_department ON employees(department)";
            stmt.execute(createIndex);

            System.out.println("Table, data, and index created successfully.");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. 使用索引进行查询

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class MySQLQuery {

    private static final String URL = "jdbc:mysql://localhost:3306/example_db";
    private static final String USER = "root";
    private static final String PASSWORD = "password";

    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) {
            String query = "SELECT * FROM employees WHERE department = ?";
            try (PreparedStatement pstmt = conn.prepareStatement(query)) {
                pstmt.setString(1, "Engineering");

                try (ResultSet rs = pstmt.executeQuery()) {
                    while (rs.next()) {
                        int id = rs.getInt("id");
                        String name = rs.getString("name");
                        String department = rs.getString("department");
                        double salary = rs.getDouble("salary");
                        System.out.printf("ID: %d, Name: %s, Department: %s, Salary: %.2f%n", id, name, department, salary);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、总结

二级索引是一个非常有效的工具,当查询的条件是非主键列时,通过二级索引可以大大加速数据检索。通过上述示例,可以看到如何在MySQL中创建和使用二级索引,以及如何使用Java代码来操作和查询带有二级索引的表。

相关推荐
H_老邪6 小时前
spring boot 学习之路-1.0
spring boot·后端·学习
树獭叔叔6 小时前
Claude Code Skill 系统:懒加载的 Agent 行动说明
后端·aigc·openai
Nexzk7 小时前
我把 Hermes Agent 源码扒了个底朝天:它不是“又一个 AI Agent”,而是在认真造一套代理操作系统
后端
袋鱼不重7 小时前
Hermes Agent 安装与实战:从安装到与 OpenClaw 全方位对比
前端·后端·ai编程
写Cpp的小黑黑7 小时前
C++ std::shared_ptr 线程安全性和最佳实践详解
后端
沸点小助手7 小时前
「 AI 整活大赛,正式开擂 & 最近一次面试被问麻了吗」沸点获奖名单公示|本周互动话题上新🎊
前端·人工智能·后端
何陋轩7 小时前
消息队列Kafka与RabbitMQ深度解析:把分布式消息核心讲透,吊打面试官
redis·后端
青Cheng序员石头7 小时前
龙虾运行时安全部署 | NVIDIA NemoClaw 深度研究报告
后端·aigc·nvidia
Oneslide7 小时前
解决 df -h 与 lsblk 显示不一致问题(XFS 文件系统实操记录)
后端
_Evan_Yao7 小时前
别让“规范”困住你:前后端交互中的方法选择与认知突围
java·后端·交互·restful