Hello World

Mysql 索引

原文:mysql索引详解

一. 索引的定义

  索引用于快速找出在某个列中有一特定值的行

  不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,

  如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。

  MySQL中的索引的存储类型有两种:B+TREEHASH

二. 优缺点

1. 优点

  1. 所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引
  2. 提高数据的查询速度

2. 缺点

  1. 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加
  2. 索引也需要占用空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值
  3. 当对表中的数据进行增加、删除、修改时,索引也需要动态维护,降低了数据的维护速度。

3. 使用原则

  1. 经常更新的表减少索引的设置,对经常用于查询的字段应该创建索引
  2. 数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
  3. 相同值多的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。

三. 索引分类

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

   MyISAMInnoDB存储引擎:只支持B+TREE索引, 也就是说默认使用B+TREE,不能够更换

   MEMORY和HEAP存储引擎:支持HASHB+TREE索引

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

1.1、单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。 

   1.1.1、普通索引

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

   1.1.2、唯一索引

      索引列中的值必须是唯一的,但是允许为空值,

   1.1.3、主键索引

      是一种特殊的唯一索引,不允许有空值。

1.2、组合索引

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

       最左前缀:查询条件中的所有字段需要从左边起按顺序出现在多列索引中,查询条件的字段数要小于等于多列索引的字段数,中间字段不能存在范围查询的字段((>、<、between、like)

     在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边

     mysql查询优化器explain,explain会纠正sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划。

1.3、全文索引

  全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,

  就是在一堆文字中,通过其中的某个关键字等,就可能找到该字段所属的记录行,比如有"你是个大煞笔,二货 ..." 通过大煞笔,可能就可以找到该条记录。

  这里说的是可能,因为全文索引的使用涉及了很多细节,我们只需要知道这个大概意思。

1.4、空间索引

  空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。

  在创建空间索引时,使用SPATIAL关键字。

  要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。   

posted @ 2018-09-19 10:18  小小忧愁米粒大  阅读(170)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书