浅析MySQL索引

字体说明:  红色字体为需要强调的。 蓝色字体为MySQL关键字。 绿色字体为解释性说明文字。
另,图片里面的标注和红色字体解释也很重要。

简介:
      索引是对数据库表中的一列或者多列的值进行排序的一种结构,使用索引可以提高数据库中特定数据的
查询速度。

1.  索引的含义
     索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据库表里所有记录的引用指针。
MySQL中索引的存储类型有两种:BTREE 和 HASH,具体和表的存储引擎有关。MyISAM和InnoDB存储引擎
只支持BTREE索引。

2.  索引的分类
2.1  普通索引和唯一索引
       普通索引是MySQL的基本索引类型,允许在定义索引的列中插入重复值和空值。唯一索引列的值必须唯
一,但允许有空值。主键索引是一种特殊的唯一索引,不允许有空值。

2.2  单列索引和祝组合索引
        组合索引即是在多个列上创建索引。查询时,只有在查询条件中使用了这些字段(创建组合索引的时候
指定的哪些列)的最左边字段时,索引才会被使用。

2.3  全文索引
        全文索引FULLTEXT,在定义索引的列上支持全文查找,允许这些索引列中插入重复值和空值。全文索
引可以在CHAR、VARCHAR、TEXT类型的列上创建。MySQL中只有MyISAM存储引擎支持全文索引。

2.4  空间索引
        略(主要是不熟悉)。

3.  索引的设计原则

      关于索引的创建原则,相信大家也了解很多,废话少说,只是简单的提一两点就好了。1)  索引并非越多
越好,一个表中如果有大量的索引,不仅占用磁盘空间,而且影响*INSERT、DELETE、UPDATE等语句的性
能。  2) 当唯一性是某种数据本身的特征时,指定唯一索引。 3) 在频繁进行排序或者分组(GROUP BY 
或者ORDER BY)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。

4.  创建索引
4.1  在创建表的时候创建索引
        语法:
        CREATE   TABLE  表名  [   列名称  数据类型 ]  
        [   UNIQUE  |   FULLTEXT  ]   [   INDEX   |    KEY    ]    [   索引名称  ]   ( 列 名称  [  length  ]  )  [   ASC DESC ]
        说明:   UNIQUE  、 FULLTEXT  为可选参数,分别表示唯一索引、全文索引;INDEX 与 KEY为同义词
两者的作用相同,用来指定索引参数中列名称为需要创建索引的字段;参数中使用名称为可选参数,不指定
的话,默认名称为对应的列名称;length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引
长度;ACS或者DESC指定升序或者降序的索引值存储。

4.1.1  创建普通索引

          例:在book表中的year_publication字段上创建普通索引。
CREATE  TABLE book
(
bookid   INT  NOT  NULL,
bookname VARCHAR(100)  NOT  NULL,
authors  VARCHAR(100)  NOT  NULL,
info  VARCHAR(500) NULL,
year_publication   YEAR  NOT  NULL,

INDEX(year_publication)
);
如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 
用  EXPLAIN  SQL;   来查看执行计划。如下图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
   
4.1.2  创建唯一索引

          例: 创建一个表t1,在表t1中的字段id上使用UNIQUE 关键字创建唯一索引。
CREATE TABLE t1
(

  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
   UNIQUE  INDEX   UniqueIdx(id)
);

/*   查看t1  */
SHOW CREATE   table  t1   \G;
如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 

4.1.3  创建单列索引

           例: 创建一个表t2,在那么字段上创建单列索引。
CREATE TABLE t2
(
  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
   UNIQUE  INDEX   SingleIdx(name(20))
);

SHOW CREATE  table  t2  \G;
如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 

4.1.4  创建组合索引

          例:创建表t3,在id、name和age字段上创建组合索引。
CREATE TABLE t3
(

  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
  age  INT  NOT  NULL,
  info  VARCHAR(200),

  INDEX   MultiIdx(id,name,age)
);

SHOW CREATE  table  t3  \G;
          如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 
比较组合索引在查询记录的区别。如下
EXPLAIN   SELECT  *  FROM t3  WHERE id =1 AND name = 'zyj' \G;
EXPLAIN   SELECT  *  FROM t3  WHERE name = 'zyj' AND age = 28 \G;
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 

4.1.5  创建全文索引

          例: 创建表t4,在info字段上创建全文索引。如下:
/*  MySQL只有MyISAM存储引擎支持FULLTEXT索引,并且类类型为CHAR、TEXT、VARCHAR。
    并且需要指定表的存储引擎为MyISAM。
  */
CREATE TABLE t4
(

  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
  age  INT  NOT  NULL,
  info  VARCHAR(200),

   FULLTEXT INDEX   FullTextIdx(info)

ENGINE = MyISAM ;

SHOW CREATE  table  t4   \G;
          如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 

4.2  在已经存在的表上创建索引
4.2.1  使用ALTER TABLE语句创建索引
           语法:
ALTER  TABLE  table_name   ADD    [  UNIQUE  |  FULLTEXT  ]   [  INDEX   |   KEY    ]  
[  inex_name  ]  (col_name [ length ] ,...)  [ASC DESC ]

            例: 在book表中的book那么字段上建立名为NkNameIdx的普通索引。如下:
ALTER  TABLE  book   ADD  INDEX  NkNameIdx( bookname(30) );
SHOW CREATE  table  book  \G;
            如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 
          例:在book表的bookId字段上创建UniqueIdx的唯一索引。如下:
ALTER  TABLE  book  ADD UNIQUE INDEX  UniqueIdx( bookid );
SHOW CREATE  table  book  \G;
          如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 
          例: 在book表中的authors和info字段上建立组合索引。如下
ALTER  TABLE  book  ADD  INDEX  BkAndInfoIdx( authors(20), info(50) );
SHOW CREATE  table  book  \G;
          如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 
          例: 创建表t6,在t6上用 ALTER   TABLE创建全文索引。如下:
CREATE TABLE t6
(

  id  INT  NOT  NULL,
  info  VARCHAR(200)

) ENGINE = MyISAM ; 

ALTER TABLE t6  ADD   FULLTEXT  INDEX infiIdx(info);
SHOW CREATE  table  t6  \G;
          如图:
浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客
 

4.2.2  使用CREATE INDEX 创建索引
           语法:
CREATE     [  UNIQUE  |  FULLTEXT  ]   [  INDEX   |   KEY    ]   INDEX  index_name
ON   table_name ( col_name[ length ] , ... )  [ASC DESC ]

      例:在表book的bookname字段上建立名为BkNameIdx的索引。如下:
CREATE INDEX   BkNameIdx   ON   book (bookname);

      例: 在book表的bookId字段上建立唯一索引。如下:
CREATE   UNIQUE    INDEX   UniqueIdx    ON   book (bookId);

5.  删除索引
5.1  使用ALTER TABLE撒很难出索引
         语法:
ALTER   TABLE  table_name    DROP   INDEX  index_name;

5.2.  使用DROP  INDEX语句删除索引
        语法:
DROP    INDEX     index_name    ON  table_name ;

======= 浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客 MySQL 索引到此结束。又快外1点了。累啊,赶紧休息了。呵呵 浅析MySQL索引(待完善) - John.Zhou - zhouyou.jun的博客 =======
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值