zoukankan      html  css  js  c++  java
  • 索引(简介,创建,删除)

    一、索引简介

    索引是一种特殊的数据结构,由数据库中一列或多列组合而成,用来快速查询数据库表中的特定记录。索引是提高数据库性能的重要方式。MySQL中,所有的数据类型都可以被索引。MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。

    1、索引的含义和特点

    索引是创建在表上的,是对数据库表中一列或多列的值进行排序的一种结构。

    通过索引,查询数据时可以不必读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。

    不同的存储引擎定义了每个表的最大索引数和最大索引长度。所有存储引擎对每个表至少支持16个索引,总索引长度至少为256字节。索引有两种存储类型,包括 B 型树(BTREE) 索引和哈希(HASH) 索引。InnoDB MyISAM 存储引擎支持 BTREE 索引,MEMORY存储引擎支持HASH 索引和BTREE 索引,默认为前者。

    索引的优点是提高检索数据的速度;对有依赖关系的子表和父表之间的联合查询时,可以提高查询速度;使用分组和排序子句进行数据查询,同样可以节省查询中分组和排序的时间。

    索引的缺点是创建和维护索引耗费时间,耗费时间的数量随着数据的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间;增加、删除和修改数据时,要动态的维护索引,造成数据的维护速度降低了。

    技巧:索引可以提高查询的速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序。这样就降低了插入记录的速度,插入大量记录时的速度影响更明显。这种情况下,最好的办法是先删除索引,然后插入数据。插入完成后,再创建索引。

    2、索引的分类

    MySQL 的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引、空间索引等。

    2.1 普通索引

    在创建普通索引时,不附加任何限制条件。这类索引可以创建在任何数据类型中,其值是否唯一和非空由字段本身的完整性约束条件决定。

    2.2 唯一性索引

    使用UNIQUE 参数可以设置索引为唯一索引。在创建唯一性索引时,限制该索引的值必须是唯一的。

    2.3 使用FULLTEXT 参数可以设置索引为全文索引。全文索引只能创建在 CHARVARCHAR TEXT 类型的字段上。

    2.4 单列索引

    在表中的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引、唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。

    2.5 多列索引

    在表的多个字段上创建索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段的第一个字段时,索引才会被使用。

    2.6 空间索引

    使用SPATIAL 参数可以设置索引为空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数据的效率。MySQL中的空间数据类型包括GEOMETRYPOINTLINESTRINGPOLYGON等。目前只有MyISAM存储引擎支持空间检索,而且索引的字段不能为空值。

    3、索引的设计原则

    3.1 选择唯一性索引

    3.2 为经常需要排序、分组和联合操作的字段建立索引

    3.3 为常作为查询条件的字段建立索引

    3.4 限制索引的数目

    3.5 尽量使用数据量少的索引

    3.6 尽量使用前缀来索引

    3.8 删除不再使用或者很少使用的索引

    二、创建索引

    创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式:创建表的时候创建索引、在已经存在的表上创建索引、使用 ALTER TABLE语句创建索引。

    1、创建表的时候创建索引

    创建表时可以直接创建索引,这种方式最简单、方便。其基本语法如下:

    CREATE  TABLE  表名  (属性名 数据类型  [完整性约束条件],

         属性名 数据类型  [完整性约束条件],

         ....

         属性名 数据类型

        [UNIQUE | FULLTEXT | SPATIAL]  INDEX | KEY

    [别名]  ( 属性名1  [(长度)]  [ASC | DESC])

       ;

    其中,UNIQUE 是可选参数,表示索引为唯一索引;FULLTEXT 是可选参数,表示索引为全文索引;SPATIAL 也是可选参数,表示索引为空间索引;INDEX KEY 参数用来指定字段为索引的,两者作用相同,选择其中之一就可以了; 别名  是可选参数,用来给创建的索引取的新名称;属性名参数指定索引对应的字段的名称,该字段必须为前面定义好的字段;长度  是可选参数,其指索引的长度,必须是字符串类型才可以使用;ASC DESC 都是可选参数,ASC  参数表示升序排列,DESC  参数表示降序排列。

    1.1 创建普通索引

    创建一个普通索引,不需要加任何 UNIQUEFULLTEXTSPATIAL 参数。

    创建一个表名为index1的表,在表中的id字段上建立索引如下:

    mysql> CREATE  TABLE index1(id  INT,

             ->    name  VARCHAR(20).

                                 ->    sex  BOOLEAN,

                                 ->    INDEX(id)

                                 ->    );

    mysql> SHOW CREATE TABLE index1 G

    *************************** 1. row ***************************

           Table: index1

    Create Table: CREATE TABLE `index1` (

      `id` int(11) DEFAULT NULL,

      `name` varchar(20) DEFAULT NULL,

      `sex` tinyint(1) DEFAULT NULL,

      KEY `id` (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    1 row in set (0.02 sec)

    结果显示id字段上已经建立了一个名为 id 的索引。使用EXPLAIN 语句可以查看索引是否被使用,如下:

    mysql> EXPLAIN SELECT * FROM index1 where id=1 G

    *************************** 1. row ***************************

               id: 1

      select_type: SIMPLE

            table: index1

       partitions: NULL

             type: ref

    possible_keys: id

              key: id

          key_len: 5

              ref: const

             rows: 1

         filtered: 100.00

            Extra: NULL

    1 row in set, 1 warning (0.06 sec)

    上面的结果显示,possible_key key 处的值都为 id 。说明 id 索引已经存在,而且已经开始起作用。

    1.2 创建唯一性索引

    创建唯一性索引时,需要使用 UNIQUE 参数进行约束。

    创建表名为index2的表,在表中的 id 字段上建立名为 index2_id 的唯一性索引,且以升序的形式排列。SQL代码如下:

    mysql> CREATE  TABLE index2(id  INT  UNIQUE,

         -> name  VARCHAR(20),

         -> UNIQUE  INDEX  index2_id(id  ASC)

        -> );

    1.3 创建全文索引

    全文索引只能创建在 CHARVARCHAR TEXT 类型的字段上。

    创建一个表名为index3 的表,在表中的info 字段上建立名为 index3_info 的全文索引。SQL 代码如下:

    mysql> CREATE TABLE index3(id  INT,

         -> info  VARCHAR(20),

         -> FULLTEXT INDEX index3_info(info)

         -> )ENGINE=MyISAM;

    1.4  创建单列索引

    单列索引是在表的单个字段上创建索引。

    创建一个表名为index4 的表,在表中的subject 字段上建立名为 index4_st 的单列索引。SQL代码如下:

    mysql> CREATE TABLE index4(id  INT,

         -> subject  VARCHAR(30),

         -> INDEX  index4_st(subject(10))

         -> );

    仔细观察会发现 subject 字段长度为30,而index_st 索引的长度只有10,这是对于字符型的数据,可以不用查询全部信息,而只查询其前面的若干字符信息,这样做可以提高查询速度。

    1.5 创建多列索引

    创建多列索引是在表的多个字段上创建一个索引。

    创建一个表名为index5 的表,在表中的name sex 字段上建立名为index5_ns 的多列索引。SQL 代码如下:

    mysql> CREATE  TABLE index5(id  INT,

        -> name  VARCHAR(20),

        -> sex  CHAR(4),

        -> KEY  index5_ns(name,sex)

        -> );

    下面使用EXPLAIN语句查看索引的使用情况,分别用name字段和sex字段作为查询条件进行查询,会发现只有使用了这些字段中的第一个字段(name)时才会触发索引。

    mysql> EXPLAIN select * from index5 where name='hj' G

    *************************** 1. row ***************************

               id: 1

      select_type: SIMPLE

            table: index5

       partitions: NULL

             type: ref

    possible_keys: index5_ns

              key: index5_ns

          key_len: 63

              ref: const

             rows: 1

         filtered: 100.00

            Extra: NULL

    1 row in set, 1 warning (0.01 sec)

    mysql> EXPLAIN select * from index5 where sex='man' G

    *************************** 1. row ***************************

               id: 1

      select_type: SIMPLE

            table: index5

       partitions: NULL

             type: ALL

    possible_keys: NULL

              key: NULL

          key_len: NULL

              ref: NULL

             rows: 1

         filtered: 100.00

            Extra: Using where

    1 row in set, 1 warning (0.00 sec)

    1.6 创建空间索引

    创建空间索引时必须使用 SPATIAL 参数来设置。创建空间索引时,表的存储引擎必须是MySIAM 类型。而且,索引字段必须有非空约束。

    创建一个表名为 index6 的表,在表中的 space 字段上建立名为 index6_sp 的空间索引。SQL 代码如下:

    mysql> CREATE TABLE index6(id INT,

        -> space GEOMETRY NOT NULL,

        -> SPATIAL KEY index6_sp(space)

        -> )ENGINE=MyISAM;

    其中space字段是非空的,而且数据类型是GEOMETRY类型,这个类型是空间数据类型。空间数据类型包括GEOMETRYPOINTLINESTRINGPOLYGON类型等。这些空间数据类型平时很少用到。

    2、在已经存在的表上创建索引

    在已经存在的表中,可以直接为表上的一个或几个字段创建索引。基本语法如下:

    CREATE  [UNIQUE | FULLTEXT | SPATIAL]  INDEX  索引名  ON  表名  (属性名  [(长度)]  [ASC | DESC];

    其中,UNIQUE 是可选参数,表示索引为唯一性索引;FULLTEXT 是可选参数,表示索引为全文索引;SPATIAL 也是可选参数,表示索引为空间索引;INDEX 参数用来指定字段为索引的;索引名  参数是给创建的索引取的新名称;表名  参数是指需要创建索引的表的名称,该表必须是已经存在的,如果不存在,需要先创建;属性名  参数指定索引对应的字段的名称,该字段必须为前面定义好的字段;长度  是可选参数,其指索引的长度,必须是字符串类型才可使用;ASC DESC 都是可选参数,ASC 参数表示升序排列,DESC 参数表示降序排列。

    mysql> CREATE INDEX index7_id ON example2(stu_id); example2 表中的stu_id 字段上建立名为index7_id 的索引

    mysql> CREATE UNIQUE INDEX index8_id ON example2(course_id); example2 表中的course_id字段上建立名为index8_id的唯一性索引

    mysql> CREATE FULLTEXT INDEX index9_info ON example2(info); example2 表中的info字段上建立名为index9_info的全文索引。其中FULLTEXT 用来设置索引为全文索引;info字段必须为CHARVARCHAR TEXT 等类型。

    mysql> CREATE INDEX index10_addr ON study(address(4)); sutdy表中的address字段上建立名为index10_addr的单列索引,查询时可以只查询address字段的前4个字符,而不需要全部查询。

    mysql> CREATE INDEX index11_na ON study(name,address); sutdy表中的name address 字段上建立名为index11_na 的多列索引。查询条件中必须有 name 字段才能使用索引。

    mysql> CREATE SPATIAL INDEX index12_line ON study(line); sutdy表中的line 字段上建立名为index12_line的空间索引,其中SPATIAL 用来设置索引为空间索引;表 index12的存储引擎必须是MyISAM类型;line字段必须为空间数据类型,而且是非空的。

    3、用 ALTER TABLE 语句来创建索引

    在已经在存在的表上,可以通过 ALTER TABLE 语句直接为表上的一个或几个字段创建索引。基本语法如下:

    ALTER  TABLE  表名  ADD  [UNIQUE | FULLTEXT | SPATIAL]  INDEX  索引名 (属性名  [(长度)]  [ASC | DESC]);

    其中参数与上面的两种方式的参数是一样的。

     三、删除索引

    删除索引是指将表中已经存在的索引删除掉。对于一些不使用会降低表的更新速度,影响数据库性能的索引,应该将其删除。

    通过DROP语句来删除索引。其基本语法如下:

    DROP  INDEX 索引名  ON  表名;

    mysql> DROP INDEX index10_addr ON study; 删除 study 表的索引 index10_addr

  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/uphold/p/11221331.html
Copyright © 2011-2022 走看看