MySQL的索引(普通索引)(唯一索引)(主键索引)(组合索引)(全文索引)(空间索引)

目录:

  • 什么是索引
  • 索引的使用原则
  • 索引的分类
  • 索引的优点与缺点与注意事项
  • 索引的机制

一、什么是索引?为什么要建立索引?

  • 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。

  • 例如:有一张person表,其中有2W条记录,记录着2W个人的信息。有一个Phone的字段记录每个人的电话号码,现在想要查询出电话号码为xxxx的人的信息。

  • 如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止。

  • 如果有了索引,那么会将该Phone字段,通过一定的方法进行存储,好让查询该字段上的信息时,能够快速找到对应的数据,而不必在遍历2W条数据了。其中MySQL中的索引的存储类型有两种:BTREE、HASH。

  • 通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力。索引优化是mysql中的一种优化方式。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容

  • 也就是用树或者Hash值来存储该字段,要知道其中详细是如何查找的,就需要会算法的知识了。我们现在只需要知道索引的作用,功能是什么就行。

二、MySQL中索引的使用原则

使用原则:

通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。

  • 对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,

  • 数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。

  • 在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。

  • 一个表中可以创建多个索引,这些索引度会被存放到一个索引文件中(专门存放索引的地方)

三、索引的分类

注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引

  • MyISAM和InnoDB存储引擎:只支持BTREE索引, 也就是说默认使用BTREE,不可以更换
  • MEMORY/HEAP存储引擎:支持HASH和BTREE索引

1、索引我们分为四类来讲 单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引、

1.1、单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。 这里不要搞混淆了。

1.1.1、普通索引:

  • MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。

1.1.2、唯一索引:

  • 索引列的所有值都只能出现一次,即必须唯一,值可以为空。

1.1.3、主键索引:

  • 主键是一种唯一性索引,但它必须指定为 primary key,每个表只能有一个主键,不允许有空值。当一张表,把某个列设为主键的时候,则该列就是主键索引

1.2、组合索引

  • 在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合

1.3、全文索引

  • MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
  • MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
  • 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。
  • 介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你是个大煞笔,二货 …"通过大煞笔,可能就可以找到该条记录。这里说的是可能,因为全文索引的使用涉及了很多细节

1.4、空间索引

  • 空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。
  • 在创建空间索引时,使用SPATIAL关键字。
  • 要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。具体细节看下面

四.索引的优点与缺点

(一).使用索引的优点

  • 可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.
  • 建立索引可以大大提高检索的数据,以及减少表的检索行数
  • 在表连接的连接条件 可以加速表与表直接的相连
  • 在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)
  • 建立索引,在查询中使用索引 可以提高性能

(二).使用索引的缺点

  • 在创建索引和维护索引 会耗费时间,随着数据量的增加而增加
  • 索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
  • 当对表的数据进行 INSERT,UPDATE,DELETE的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。

(三).使用索引需要注意的地方

在建立索引的时候应该考虑索引应该建立在数据库表中的某些列上面 哪一些索引需要建立,哪一些索引是多余的.

1.在经常需要搜索的列上,可以加快索引的速度
2.主键列上可以确保列的唯一性
3.在表与表的而连接条件上加上索引,可以加快连接查询的速度
4.在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间,  (单独order by 用不了索引,索引考虑加where 或加limit)
5.在一些where 之后的 < <= > >= BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE)

6.like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick '%ABC%' 那么这个索引讲不会起到作用.而nickname lick 'ABC%' 那么将可以用到索引

7.索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串

8.使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.

9.不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描

10.选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快

(四).什么情况下不创建索引

1.查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
2.很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
3.定义为text和image和bit数据类型的列不应该增加索引,
4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系

五、索引的机制

1 为什么我们添加完索引后查询速度为变快?

  • 传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,mysql需要将表的数据从头到尾遍历一遍
  • 在我们添加完索引之后,mysql一般通过btree算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历(折半查找大幅查询效率),找到相应的键从而获取数据

2 索引的代价

  • 创建索引是为产生索引文件的,占用磁盘空间
  • 索引文件是一个二叉树类型的文件,可想而知我们的dml操作同样也会对索引文件进行修改,所以性能会下降

3 在哪些表上适合使用索引?

  • 较频繁的作为查询条件字段应该创建索引
  • 唯一性太差的字段不适合创建索引,尽管频繁作为查询条件,例如gender性别字段
  • 更新非常频繁的字段不适合作为索引

4.不会出现在where语句中的字段该不该创建索引

满足以下条件的字段,才应该创建索引:

  • a: 肯定在where条经常使用 b: 该字段的内容不是唯一的几个值 c: 字段内容不是频繁变化

你可能感兴趣的:(mysql)