创建索引

索引:
    数据库的索引好比新华字典的音序表,它对数据库库表中一列或多列的值进行排序后的一种结构,其作用就是提高表中的数据查询速度
    普通索引:可以创建在任何数据类型中,其值是否唯一和非空没有固定的要求
    唯一性索引:唯一性索引是由unique定义的索引,该索引所在的字段的值必须是唯一的
    全文索引: 是由FULLTEXT定义的索引,它只能创建在char,varchar或text类型的字段上,而且,现在只有MYISAM存储引擎支持全文索引
    单列索引: 单列索引指的是在表中单个字段上创建索引,它可以是普通索引,唯一索引或者全文索引,只要保证该索引只对应表中一个字段即可
    多列索引: 多列索引指的是在表中多个字段上创建索引,只有在查询语句中使用了这些字段中第一个字段时,该索引才会被使用
    空间索引: 空间索引是由SPATIAL定义的索引,它只能创建在空间数据类型的字段上
    
    总结:需要注意的是,虽然索引可以提高数据的查询速度,但是索引会占用一定的磁盘空间,并且在创建和维护索引时,其消耗的时间时随着数据量的增加而增加的。因此,使用索引时,应该综合考虑索引的优点和缺点
    

创建索引:
    1. 创建表的时候创建索引
        CREATE TABLE 表名(
            字段名  数据类型[完整性约束条件]
            字段名  数据类型[完整性约束条件]
            ...
            字段名  数据类型
            [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [别名] (字段名1 [(长度)] [ASC|DESC]) 
        );
        
    关于以上语法的相关解释具体如下:
    * UNIQUE     可选参数,表示唯一性约束
      FULLTEXT   可选参数,表示全文约束
      SPATIAL    可选参数,表示空间约束
      INDEX和KEY :用来表示字段的索引,二者选一即可
      别名: 可选参数,表示创建的索引的名称
      字段名1: 指定索引对应字段的名称
      长度:可选参数,用于表示索引的长度
      ASC|DESC 可选参数,其中,ASC表示升序排列,DESC表示降序排序
      
      常用单词:
      MUL: multiple
      PRI:primary
      UNI: unique
      
      
          ~创建一个普通索引
           下面的例子中INDEX前面没有前缀,所以他是一个普通索引
    CREATE TABLE t1(
        id INT,
        name VARCHAR(20),
        score FLOAT,
        INDEX (id)
    );
        检查是否使用了索引,explain 命令可以查看后面的查询语句是如何执行的
        explain select * from t1 where id=1;      


          ~创建一个唯一索引
          使用unique关键字创建
    CREATE TABLE t2(
        id INT,
        name VARCHAR(20),
        score FLOAT,
        UNIQUE INDEX (id)
    );      
          检查创建效果
          show create table t2;
          
          
          ~创建全文索引
          全文索引一定要是文本类型,引擎一定要是MyISAM;
    CREATE TABLE t3(
        id INT,
        name VARCHAR(20),
        score FLOAT,
        FULLTEXT INDEX fulltext_name(name)
    )ENGINE=MyISAM;

        检查创建效果
        show create table t3;   


          ~创建单列索引
          前面的几个例子都是单列索引
    CREATE TABLE t4(
        id INT,
        name VARCHAR(20),
        score FLOAT,
        INDEX single_name(name(20))
    );      
        检查创建效果
        show create table t4;
        
         ~创建多列索引
         第一列被用作查询条件时,才会导致多列索引被使用
    CREATE TABLE t5(
        id INT,
        name VARCHAR(20),
        score FLOAT,
        INDEX multiple_name(id,name(20))
    );      
        检查创建效果
        explain select * from t5 where id=1;
        
        
        ~创建空间索引
        空间索引只能用在几个特定的数据类型上,并且数据库引擎必须时MyISAM
    CREATE TABLE t6(
        id INT,
        space GEOMETRY NOT NULL,
        SPATIAL INDEX sp(space)
    )ENGINE=MyISAM;
        检查创建效果
        show create table t6;
    
    
2. 使用CREATE INDEX 语句在已经存在的表上创建索引
        CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 on 表名 (字段名1 [(长度)] [ASC|DESC]);

    先创建一个表    
    CREATE TABLE book(
        bookid INT NOT NULL,
        bookname VARCHAR(255) NOT NULL,
        authors VARCHAR(255) NOT NULL,
        info VARCHAR(255) NULL,
        comment VARCHAR(255) NULL,
        publicyear YEAR NOT NULL
    );
        
          ~创建一个普通索引在bookid这一列上
          create index index_id on book(bookid)
          ~创建一个唯一索引在bookid这一列上
          create unique index qunique_id on book(bookid)
          ~创建一个多列索引在bookid这一列上
          create index multiple_index on book(authors(20),info(20))
          ~创建全文索引,注意全文索引只能加在引擎时MyISAM的表上
          drop table book;
CREATE TABLE book(
    bookid INT NOT NULL,
    bookname VARCHAR(255) NOT NULL,
    authors VARCHAR(255) NOT NULL,
    info VARCHAR(255) NULL,
    comment VARCHAR(255) NULL,
    publicyear YEAR NOT NULL
)ENGINE=MyISAM;
          
        CREATE FULLTEXT index  ftindex on book (bookname)
          
          
          
          
原文地址:https://www.cnblogs.com/zhuhaofeng/p/15725909.html