数据库是用来存储数据的, 在互联网应用中数据库中存储的数据可能会很多 (大数据), 数据表中数据的查询速度会随着数据量的增长逐渐变慢, 从而导致响应用户请求的速度变慢

—— 用户体验差, 如何提高数据库的查询效率?

索引的介绍

索引, 就是用来提高表中数据的查询数据的

索引, 就是将数据表中某一列/某几列的值提取出来构造成便于查找的结构进行存储, 生成的数据表的目录

当进行数据查询的时候, 现在目录中进行查找得到对应的数据的地址, 然后再到数据表中工具地址快速的获取数据纪录, 避免全表扫描

引索的分类

MySQL 中的索引, 根据创建索引的列的不同, 可以分为

  • 主键索引: 在数据表的主键字段创建的索引, 这个字段必须被 primary key 修饰, 每张表只能有一个主键
  • 唯一索引: 在数据表中的唯一列创建的引索 (unique), 此列的所有值只能出现一次, 可以为 NULL
  • 普通索引: 在普通字段上创建的索引, 没有唯一性的限制
  • 组合索引: 两个及以上字段联合起来创建的索引

说明

  1. 在创建数据表时, 将字段声明为主键 (添加主键约束), 会自动在主键字段创建主键索引
  2. 在创建数据表时, 将字段声明为唯一将 (添加唯一约束), 会自动在唯一字段创建唯一索引

创建索引

唯一索引

唯一索引的列的值不能重复

  1. create unique index index_test1 on tb_testindex(tid);

普通索引

普通索引不要求创建引索的列的值的唯一性

  1. create index index_test2 on tb_testindex(name);

组合索引

  1. create index index_text3 on tb_testindex(tid, name);

全文索引

MySQL 5.6 版本新增的索引, 可以通过此索引进行全文检索操作, 因为 MySQL 全文检索不支持种文, 因此这个全文索引不被开发者关注, 在应用开发中通常时通过搜索引擎 (数据库中间件) 实现全文检索

  1. create fulltext index <index_name> on tableName(fieldName);

索引使用

索引创建完成之后无需掉用, 当根据创建索引的列进行数据查询的时候会自动使用索引

组合索引需要根据创建索引的所有字段进行查询时触发

查看索引

  1. # 查询数据表的索引
  2. show indexes from tb_testindex;
  3. # 查询索引
  4. show keys from tb_testindex;

删除索引

索引时建立在表的字段上的, 不同的表中可能会出现相同名称的索引, 因此删除所有事需要指定表名

  1. drop index index_test3 on tb_textindex;

索引的使用总结

优点

  • 索引大大降低了数据库服务器在执行查询操作时扫描的数据量, 提高了查询效率
  • 所以可以避免服务器排序、将随机 IO 变成顺序 IO

缺点

  • 索引是根据数据表列的值创建的, 当数据表中数据发生 DML 操作时, 索引也需要更新
  • 索引文件也会占用磁盘空间

注意事项

  • 数据表数据不多时, 全表扫描可能更快, 此时不要使用索引
  • 数据量大但是 DML 操作很频繁时, 不建议使用索引
  • 不要在数据重复度高的列上创建索引 (性别)
  • 创建索引之后, 要注意查询 SQL 语句的编写, 避免索引失效