一、什么是索引

索引(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

MySQL基础笔记(四) 索引的更多相关文章

  1. MySQL基础(四)——索引

    MySQL基础(四)--索引

  2. MYSQL基础笔记(四)-数据基本操作

    数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...

  3. MYSQL基础笔记(五)- 练习作业:站点统计练习

    作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...

  4. MYSQL基础笔记(三)-表操作基础

    数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...

  5. MYSQL基础笔记(六)- 数据类型一

    数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...

  6. MYSQL基础笔记(二)-SQL基本操作

    SQL基本操作 基本操作:CRUD,增删改查 将SQL的基本操作根据操作对象进行分类: 1.库操作 2.表操作 3.数据操作 库操作: 对数据库的增删改查 新增数据库: 基本语法: Create da ...

  7. MYSQL基础笔记(一)

    关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...

  8. MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  9. MySql基础笔记(二)Mysql语句优化---索引

    Mysql语句优化--索引 一.开始优化前的准备 一)explain语句 当MySql要执行一个查询语句的时候,它首先会对语句进行语法检查,然后生成一个QEP(Query Execution Plan ...

随机推荐

  1. Vue之组件的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. delphi 动态调用API

    好处没有这个API 也可以启动程序只是调用会出错. function __IsNativeVhdBoot: Boolean; type TIsNativeVhdBoot = function( Nat ...

  3. spring注解开发-扩展原理(源码)

    1.BeanFactoryPostProcessor BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的; BeanFactoryPostProcesso ...

  4. java面试宝典第一弹

    object类的直接子类有哪些 Boolean Character Character.Subset Class ClassLoader Compiler Enum Math Number Packa ...

  5. VW结合rem进行移动端布局

    ---恢复内容开始--- html { font-size:10vw: } div { width: 1rem; height: 1rem; } VW这个单位适合用来适应不同设备的 一个设备的宽度就为 ...

  6. ubuntu修改网卡名称ensX为eth0

    1.sudo nano /etc/default/grub 找到GRUB_CMDLINE_LINUX="" 改为GRUB_CMDLINE_LINUX="net.ifnam ...

  7. github 获取 token

    登录github 地址:https://github.com 点击settings 在点击Developer settings 继续 继续 描述栏随意写  复选框是token的权限 都选上吧 点击红框 ...

  8. 如何将已经安装从chrome扩展程序导出备份为.CRX文件?

    之前介绍过CRX Extractor可以从chrome应用商店下载备份扩展程序,有读者朋友问说:如果 Google Chrome扩展程序已经从 Chrome应用商店下架,还有没有方法下载呢?通常网路上 ...

  9. Java学习之File类理解

    File类是io包中唯一代表磁盘文件本身的对象.File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建.删除.重命名文件等.File类的对象主要用来获取文件本身的一些 ...

  10. 异常 Failed to bind NettyServer on /10.133.7.216:29105, cause: Failed to bind to: /0.0.0.0:29105

    "C:\Program Files\Java\jdk1.7.0_80\bin\java" -agentlib:jdwp=transport=dt_socket,address=12 ...