1 索引是什么?

索引在MySQL中也叫做“键”,它是一个特殊的文件,它保存着数据表里所有记录的位置信息
索引好比是一本书的目录,能加快数据库的查询速度。

应用场景:

  • 当数据库中数据量很大时,查找数据会变得很慢,我们就可以通过索引来提高数据库的查询效率。

优点:

  • 加快数据的查询速度

缺点:

  • 创建索引会耗费时间和占用磁盘空间,并且随着数据量的增加所耗费的时间也会增加

使用原则:

  • 数据量小的表最好不要使用索引
  • 在一字段上相同值比较多不要建立索引

    2 索引的使用

    (1) 查看表中已有索引

    show index from classes;
    注: 主键列 和 外键列 会自动创建索引
    image.png

    (2) 创建索引

    alter table classes add index my_name(name);
    注: 若不指定索引, 默认使用字段名
    image.png

image.png

(3) 删除索引

alter table classes drop index my_name;
image.png

3 技巧

(1) 有几个KEY就代表有几个索引

image.png
image.png

4 验证索引查询性能

(1) 创一个没有primary key的表

  1. create table mytest(
  2. name varchar(50) not null
  3. );

(2) 写一个python程序来插入10000行数据

  1. sql = "insert mytest(name) values(%s);"
  2. try:
  3. # 执行SQL语句
  4. for i in range(10000):
  5. cursor.execute(sql, ("test"+str(i)))
  6. # (添加,删除,修改后)要提交修改到数据库
  7. conn.commit()
  8. except:
  9. # 对修改的数据进行撤销
  10. conn.rollback()

(3) 验证性能

  1. -- 开启运行时间监测:
  2. set profiling=1;
  3. -- 查找第1万条数据ha-99999
  4. select * from mytest where name='test8888';
  5. -- 查看执行的时间:
  6. show profiles;
  7. -- title字段创建索引:
  8. alter table mytest add index (name);
  9. -- 再次执行查询语句
  10. select * from mytest where name="test8888";
  11. -- 再次查看执行的时间
  12. show profiles;

image.png

5 联合索引

联合索引又叫复合索引,即一个索引覆盖表中两个或者多个字段,一般用在多个字段一起查询的时候。

(1) 创建一个表

  1. create table mytest1(
  2. id int not null primary key auto_increment,
  3. name varchar(30),
  4. age int
  5. );

(2) 添加联合索引

alter table mytest1 add index(name, age);

(3) 显示创建表

show create table mytest1;
image.png
优点:

  • 减少磁盘空间开销,因为每创建一个索引,其实就是创建了一个索引文件,那么会增加磁盘空间的开销。

最左原则:

  1. select * from stu where name='张三' -- 这里使用了联合索引的name部分 (对)
  2. select * from stu where name='李四' and age=10 -- 这里完整的使用联合索引,包括 name age 部分 (对)
  3. select * from stu where age=10 -- 因为联合索引里面没有这个组合,只有 name | name age 这两种组合 (错)