mysql索引影响查询速度的示例demo

创建一个完整的索引影响查询速度的示例demo,通过实际对比可以直观感受索引的强大作用。

一、测试环境准备

1. 创建测试数据库和表

sql 复制代码
-- 创建测试数据库
CREATE DATABASE index_demo;
USE index_demo;

-- 创建用户表(无索引状态)
CREATE TABLE users_no_index (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    city VARCHAR(50) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 创建用户表(有索引状态)
CREATE TABLE users_with_index (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    city VARCHAR(50) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_email (email),
    INDEX idx_age_city (age, city),
    INDEX idx_created_at (created_at)
);

2. 插入大量测试数据

sql 复制代码
-- 插入50万条测试数据
DELIMITER $$
CREATE PROCEDURE insert_test_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= 500000 DO
        INSERT INTO users_no_index (username, email, age, city) VALUES (
            CONCAT('user', i),
            CONCAT('user', i, '@example.com'),
            FLOOR(18 + RAND() * 50),
            ELT(FLOOR(1 + RAND() * 10), '北京', '上海', '广州', '深圳', '杭州', '南京', '武汉', '成都', '西安', '重庆')
        );
        
        INSERT INTO users_with_index (username, email, age, city) VALUES (
            CONCAT('user', i),
            CONCAT('user', i, '@example.com'),
            FLOOR(18 + RAND() * 50),
            ELT(FLOOR(1 + RAND() * 10), '北京', '上海', '广州', '深圳', '杭州', '南京', '武汉', '成都', '西安', '重庆')
        );
        
        IF i % 10000 = 0 THEN
            SELECT CONCAT('已插入 ', i, ' 条数据') AS progress;
        END IF;
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER ;

-- 执行数据插入(这可能需要几分钟)
CALL insert_test_data();

二、性能对比测试

测试1:基本查询对比

sql 复制代码
mysql> SELECT * FROM users_no_index WHERE username = 'user110000';
+--------+------------+------------------------+-----+--------+---------------------+
| id     | username   | email                  | age | city   | created_at          |
+--------+------------+------------------------+-----+--------+---------------------+
| 110000 | user110000 | user110000@example.com |  36 | 北京   | 2025-12-27 16:33:15 |
+--------+------------+------------------------+-----+--------+---------------------+
1 row in set (0.08 sec)

mysql> SELECT * FROM users_with_index WHERE username = 'user110000';
+--------+------------+------------------------+-----+--------+---------------------+
| id     | username   | email                  | age | city   | created_at          |
+--------+------------+------------------------+-----+--------+---------------------+
| 110000 | user110000 | user110000@example.com |  66 | 成都   | 2025-12-27 16:33:15 |
+--------+------------+------------------------+-----+--------+---------------------+
1 row in set (0.00 sec)

测试2:精确的性能测量

sql 复制代码
mysql> SET profiling = 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> 
mysql> SELECT * FROM users_no_index WHERE username = 'user110000';
+--------+------------+------------------------+-----+--------+---------------------+
| id     | username   | email                  | age | city   | created_at          |
+--------+------------+------------------------+-----+--------+---------------------+
| 110000 | user110000 | user110000@example.com |  36 | 北京   | 2025-12-27 16:33:15 |
+--------+------------+------------------------+-----+--------+---------------------+
1 row in set (0.07 sec)

mysql> SHOW PROFILE FOR QUERY 1;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000094 |
| Executing hook on transaction  | 0.000006 |
| starting                       | 0.000034 |
| checking permissions           | 0.000006 |
| Opening tables                 | 0.000034 |
| init                           | 0.000011 |
| System lock                    | 0.000007 |
| optimizing                     | 0.000011 |
| statistics                     | 0.000022 |
| preparing                      | 0.000021 |
| executing                      | 0.073159 |
| end                            | 0.000040 |
| query end                      | 0.000004 |
| waiting for handler commit     | 0.000007 |
| closing tables                 | 0.000008 |
| freeing items                  | 0.000220 |
| cleaning up                    | 0.000018 |
+--------------------------------+----------+
17 rows in set, 1 warning (0.00 sec)

mysql> SELECT * FROM users_with_index WHERE username = 'user110000';
+--------+------------+------------------------+-----+--------+---------------------+
| id     | username   | email                  | age | city   | created_at          |
+--------+------------+------------------------+-----+--------+---------------------+
| 110000 | user110000 | user110000@example.com |  66 | 成都   | 2025-12-27 16:33:15 |
+--------+------------+------------------------+-----+--------+---------------------+
1 row in set (0.00 sec)

mysql> 
mysql> SHOW PROFILE FOR QUERY 2;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000096 |
| Executing hook on transaction  | 0.000006 |
| starting                       | 0.000005 |
| checking permissions           | 0.000005 |
| Opening tables                 | 0.000040 |
| init                           | 0.000005 |
| System lock                    | 0.000006 |
| optimizing                     | 0.000011 |
| statistics                     | 0.000089 |
| preparing                      | 0.000040 |
| executing                      | 0.000051 |
| end                            | 0.000005 |
| query end                      | 0.000005 |
| waiting for handler commit     | 0.000007 |
| closing tables                 | 0.000006 |
| freeing items                  | 0.000168 |
| cleaning up                    | 0.000012 |
+--------------------------------+----------+
17 rows in set, 1 warning (0.00 sec)

mysql> SHOW PROFILES;
+----------+------------+--------------------------------------------------------------+
| Query_ID | Duration   | Query                                                        |
+----------+------------+--------------------------------------------------------------+
|        1 | 0.07369975 | SELECT * FROM users_no_index WHERE username = 'user110000'   |
|        2 | 0.00055400 | SELECT * FROM users_with_index WHERE username = 'user110000' |
+----------+------------+--------------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)
相关推荐
曾几何时`17 小时前
MySQL(七)索引
数据库·mysql
悠悠1213817 小时前
一条 SQL 从敲下回车,到在 MySQL 里“跑完一生”,中间到底经历了啥?
数据库·sql·mysql
秋918 小时前
MySQL 9.7.0 使用详解:新特性、实战与避坑指南
android·数据库·mysql
努力努力再努力wz18 小时前
【MySQL进阶系列】拒绝冗余SQL:带你透彻理解视图的底层逻辑
android·c语言·数据结构·数据库·c++·sql·mysql
历程里程碑18 小时前
MySQL数据类型全解析 + 代码实操讲解
大数据·开发语言·数据库·sql·mysql·elasticsearch·搜索引擎
杨云龙UP18 小时前
Windows Server 2012 环境下 Oracle 11.2 使用 expdp 实现自动备份、异地复制与定期清理_20260504
服务器·数据库·windows·mysql·docker·oracle·容器
nbwenren18 小时前
MySQL数据库误删恢复_mysql 数据 误删
数据库·mysql·adb
星光开发者19 小时前
基于springboot电动汽车租赁管理系统-计算机毕设 附源码 11217
javascript·spring boot·mysql·django·php·html5·express
带鱼吃猫19 小时前
从原子性到串行化:数据库事务全解
数据库·mysql
IT学长19 小时前
JavaWeb图书管理系统设计与实现(附源码)
mysql·servlet·毕业设计·课程设计·图书管理系统