avatar

目录
sql-indexes-example

SQL Indexes Explained with Tables

Let’s use a larger 学生 (Students) table for our examples:

学生表 (Students)

学号 (ID) 姓名 (Name) 年龄 (Age) 班级 (Class) 分数 (Score)
1 张三 18 A班 85
2 李四 19 B班 92
3 王五 20 A班 78
9998 赵六 18 B班 96
9999 钱七 21 A班 88
10000 孙八 19 C班 91

Assume this table has 10,000 rows.

1. 创建索引

sql
1
2
3
4
5
-- 在姓名列上创建索引
CREATE INDEX idx_student_name ON 学生 (姓名);

-- 在班级和分数列上创建复合索引
CREATE INDEX idx_class_score ON 学生 (班级, 分数);

2. 不使用索引的查询

sql
1
SELECT * FROM 学生 WHERE 姓名 = '张三';

假设执行时间:100ms(需要全表扫描)

3. 使用索引的查询

sql
1
SELECT * FROM 学生 WHERE 姓名 = '张三';

假设执行时间:5ms(使用了idx_student_name索引)

4. 复合索引的使用

sql
1
2
3
4
5
6
7
8
-- 有效使用复合索引
SELECT * FROM 学生 WHERE 班级 = 'A班' AND 分数 > 90;

-- 部分使用复合索引
SELECT * FROM 学生 WHERE 班级 = 'A班';

-- 不使用复合索引
SELECT * FROM 学生 WHERE 分数 > 90;

5. 索引对INSERT的影响

插入10,000条记录的时间比较:

  • 无索引:约1秒
  • 有索引(姓名和班级+分数):约1.2秒

6. EXPLAIN语句

使用EXPLAIN语句可以查看查询的执行计划,了解索引的使用情况:

sql
1
EXPLAIN SELECT * FROM 学生 WHERE 姓名 = '张三';

可能的输出:

Code
1
2
3
4
5
+----+-------------+-------+------------+------+---------------+------------------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------------------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | 学生 | NULL | ref | idx_student_name | idx_student_name | 768 | const | 1 | 100.00 | Using index |
+----+-------------+-------+------------+------+---------------+------------------+---------+-------+------+----------+-------------+

这个输出表明查询使用了idx_student_name索引,预计只需要检查1行数据。


评论