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. 不使用索引的查询
sql
1 | SELECT * FROM 学生 WHERE 姓名 = '张三'; |
假设执行时间:100ms(需要全表扫描)
3. 使用索引的查询
sql
1 | SELECT * FROM 学生 WHERE 姓名 = '张三'; |
假设执行时间:5ms(使用了idx_student_name索引)
4. 复合索引的使用
sql
1 | -- 有效使用复合索引 |
5. 索引对INSERT的影响
插入10,000条记录的时间比较:
- 无索引:约1秒
- 有索引(姓名和班级+分数):约1.2秒
6. EXPLAIN语句
使用EXPLAIN语句可以查看查询的执行计划,了解索引的使用情况:
sql
1 | EXPLAIN SELECT * FROM 学生 WHERE 姓名 = '张三'; |
可能的输出:
Code
1 | +----+-------------+-------+------------+------+---------------+------------------+---------+-------+------+----------+-------------+ |
这个输出表明查询使用了idx_student_name索引,预计只需要检查1行数据。