一、什么是索引

索引(Index),可以看作一个指针,指向表里的数据。当数据库没有索引时,查找信息通常是全表扫描;使用了索引,它就会直接引导到数据在表里的准确物理位置。

  • 优点:索引的主要目的是提高数据检索的性能,在数据量比较大时尤其明显。

  • 缺点

    1. 索引通常与相应的表是分开保存的,索引也会占据物理存储空间,而且可能比表本身还大。
    2. 索引的维护(索引项的添加和删除)有时间消耗,会影响数据检索的速度。

当为字段添加了索引后,索引里记录了与被索引字段相关联的位置值。当表里添加新数据时,索引里也会添加新项。如下图所示:

假设执行

SELECT * FROM table_name WHERE name='SMITH';

由于 where 条件里的 name 字段已经设置了索引,所以会首先在索引里搜索'SMITH',找到以后直接返回被搜索数据在表里的实际位置。

二、创建索引

创建索引使用CREATE INDEX命令或者ALTER TABLE...ADD...命令。数据库里的表可以创建多种类型的索引。

1. 单字段索引

单字段索引是基于一个字段创建的:

CREATE INDEX index_name ON table_name(column_name);

如果某个字段经常在 where 子句作为单独的查询条件,那么它的单字段索引是最有效的。

2. 唯一索引

唯一索引不允许被索引字段具有重复值,除此之外,它与普通索引的功能一样。

CREATE UNIQUE INDEX index_name ON table_name(column_name);

唯一索引用于改善性能和保证数据完整性。

3. 组合索引

组合索引是基于两个或多个字段创建的:

CREATE INDEX index_name ON table_name(column1, column2);

如果经常在where子句里联合使用两个或多个字段进行查询,可以考虑创建组合索引。

4. 隐含索引

隐含索引是数据库服务程序在创建对象时自动创建的。比如,数据库会为主键约束唯一性约束自动创建索引。

为什么给主键约束和唯一性约束自动创建索引?

主键约束和唯一性约束都要求字段的每个值都唯一。当用户向表中添加新记录时,为了有效地检查新值在成百上千的记录里是否唯一,对应的字段必须被索引。

三、删除索引

MySQL中删除索引使用ALTER TABLE或者DROP INDEX命令。两者的功能是一样的,事实上,DROP INDEX语句在内部被映射到一个ALTER TABLE语句中。

方法一:

ALTER TABLE table_name DROP INDEX index_name;

方法二:

DROP INDEX index_name ON table_name;

四、何时(不)应该使用索引

考虑使用索引的情况:

  1. 一般来说,大多数用于表结合的字段都应该设置索引。比如,外键经常用于与父表的结合,适合设置索引。

  2. 经常在order bygroup by里引用的字段应该考虑设置索引,因为索引会自动进行排序,简化了实际的排序操作,提高了输出结果的速度。

  3. 具有大量唯一值得字段,或是在where子句里会返回很小部分记录的字段,都可以考虑设置索引。

索引的初衷是提高数据检索的性能,但不要认为使用索引就能解决所有的问题,在一些情况下索引可能根本不会改善性能而只是占据磁盘空间。

  1. 索引不应该用于小规模的表。

  2. 当字段在where子句里作为条件会返回表里的大部分记录时,该字段不适合设置索引。

  3. 包含大量NULL值的字段不应该设置索引。索引对在不同记录中包含不同数据的字段特别有效,字段中过多的NULL值会严重影响索引的运行效率。

  4. 经常被更新的字段不应该设置索引。因为对索引的维护会变得很繁重。

个人站点:http://songlee24.github.com

最新文章

  1. js学习笔记:webpack基础入门(一)
  2. 多层iframe的页面取子标签
  3. POS管理系统之新增设备入库
  4. Mvc下异步断点续传大文件
  5. [Java] 关键字final、static使用总结
  6. hdu4105  Electric wave
  7. Jstorm调度定制化接口(0.9.5 及高版本)
  8. Jenkins 在声明式 pipeline 中并行执行任务
  9. php留言板
  10. oracle管理权限和角色
  11. python入门(十五):装饰器
  12. 我的C#跨平台之旅(二):开发最为简单的REST API
  13. package.json包描述文件说明
  14. leetcode题解 1.TwoSum
  15. AngularJS学习笔记(四)内置指令
  16. jekins 实现Django项目的自动部署(ubuntu16.04,python2.7,django1.11)
  17. P2196 挖地雷
  18. SICP 习题 (1.35)解题总结
  19. 2月4日 考试——迟到的 ACX
  20. Net Core MVC6 RC2 启动过程分析

热门文章

  1. ios之coretext
  2. [LUOGU] [NOIP2017] P3960 列队
  3. Linux 之 nano 编辑器的使用
  4. linux 05
  5. markdown pad激活
  6. LeetCode (17)Letter Combinations of a Phone Number
  7. ES6(字符串)
  8. javascript:与获取鼠标位置有关的属性
  9. captcha库报错"OSError: cannot open resource"
  10. 关于如何使用Spring里@AliasFor注解进行注解的封装