1 索引是什么?
索引在MySQL中也叫做“键”,它是一个特殊的文件,它保存着数据表里所有记录的位置信息
索引好比是一本书的目录,能加快数据库的查询速度。
应用场景:
- 当数据库中数据量很大时,查找数据会变得很慢,我们就可以通过索引来提高数据库的查询效率。
优点:
- 加快数据的查询速度
缺点:
- 创建索引会耗费时间和占用磁盘空间,并且随着数据量的增加所耗费的时间也会增加
使用原则:
- 数据量小的表最好不要使用索引
- 在一字段上相同值比较多不要建立索引
2 索引的使用
(1) 查看表中已有索引
show index from classes;
注: 主键列 和 外键列 会自动创建索引
(2) 创建索引
alter table classes add index my_name(name);
注: 若不指定索引, 默认使用字段名
(3) 删除索引
alter table classes drop index my_name;
3 技巧
(1) 有几个KEY就代表有几个索引
4 验证索引查询性能
(1) 创一个没有primary key的表
create table mytest(
name varchar(50) not null
);
(2) 写一个python程序来插入10000行数据
sql = "insert mytest(name) values(%s);"
try:
# 执行SQL语句
for i in range(10000):
cursor.execute(sql, ("test"+str(i)))
# (添加,删除,修改后)要提交修改到数据库
conn.commit()
except:
# 对修改的数据进行撤销
conn.rollback()
(3) 验证性能
-- 开启运行时间监测:
set profiling=1;
-- 查找第1万条数据ha-99999
select * from mytest where name='test8888';
-- 查看执行的时间:
show profiles;
-- 给title字段创建索引:
alter table mytest add index (name);
-- 再次执行查询语句
select * from mytest where name="test8888";
-- 再次查看执行的时间
show profiles;
5 联合索引
联合索引又叫复合索引,即一个索引覆盖表中两个或者多个字段,一般用在多个字段一起查询的时候。
(1) 创建一个表
create table mytest1(
id int not null primary key auto_increment,
name varchar(30),
age int
);
(2) 添加联合索引
alter table mytest1 add index(name, age);
(3) 显示创建表
show create table mytest1;
优点:
- 减少磁盘空间开销,因为每创建一个索引,其实就是创建了一个索引文件,那么会增加磁盘空间的开销。
最左原则:
select * from stu where name='张三' -- 这里使用了联合索引的name部分 (对)
select * from stu where name='李四' and age=10 -- 这里完整的使用联合索引,包括 name 和 age 部分 (对)
select * from stu where age=10 -- 因为联合索引里面没有这个组合,只有 name | name age 这两种组合 (错)