MySQL3:索引

前端之家收集整理的这篇文章主要介绍了MySQL3:索引前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

什么是索引

数据库表中一列或者多列的值进行排序的一种结构,所引用于快速找出在某个列中有一特定值的行。不使用索引,MysqL必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,MysqL快速到达一个位置去搜索数据文件,而不必查看所有数据。

索引的含义和特点

数据库结构,它们包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行,所有MysqL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。

数据库里面有20000条记录,现在要执行这么一个查询:SELECT * FROM table where num = 10000。如果没有索引,必须遍历整个表,直到num等于10000的这一行被找到为止;如果在num列上创建索引,MysqL不需要任何扫描,直接在索引中找10000,就可以得知值这一行的位置。可见,索引的建立可以提高数据库查询速度。

支持所有索引类型。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。大多数存储引擎有更高的额限制,MysqL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关;MyISAM和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎可以支持HASH和BTREE缩影。

数据库表中每一行数据的唯一性

2、可以大大加快数据的查询速度,这也是创建索引最主要的原因

查询时,也可以显著减少查询中分组和排序的时间

增加索引也有许多不利的方面,比如:

增加所耗费的时间也会增加

文件可能比数据文件更快达到最大文件尺寸

增加、删除修改的时候,索引也要动态地维护,这样就降低了数据的维护速度

索引的分类

MysqL的索引可以分为以下几类:

MysqL中的基本索引类型,允许在定义索引的列中插入重复值和空值

查询条件中使用了这些字段的左边字段时,索引才会被使用

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

索引的设计原则

数据库和应用程序的性能造成障碍,高效的索引对于获得良好的性能非常重要,设计索引时,应该考虑一下:

性能,因为当表中的数据更改的同时,索引也会进行调整和更新

查询的字段应该创建索引,但要避免添加不必要的字段

查询花费的时间可能比遍历索引时间还要短,索引可能不会产生优化效果

查询效率,反而会严重降低更新速度

查询速度

创建表的时候创建索引

table_name (

解释一下:

1、UNIQUE、FULLTEXT和SPATIAL为可选参数,分别表示唯一索引、全文索引和空间索引

2、INDEX和KEY为同义词,二者作用相同,用来指定创建索引

3、col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择

4、index_name为指定索引的名称,为可选参数,如果不指定则MysqL默认col_name为索引值

5、length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度

6、ASC或DESC指定升序或者降序的索引值存储

下面创建一个普通索引,没有唯一性之类的限制,其作用只是加快对于数据的访问速度:

() () ()

EXPLAIN book yead_publication

解释下字段的意思:

1、select_type行指定所使用的SELECT查询类型,这里值为SIMPLE,表示简单的SELECT,不使用UNION或者子查询。其他可能的取值有:PRIMARY、UNION、SUBQUERY等

2、table行指定数据库读取的数据表的名字,它们按照被读取的先后顺序排列

3、type行指定了本数据表与其他数据表之间的关联关系,可能的去只有system、const、eq_ref、ref、range、index和All

4、possible_keys行给出了MysqL搜索数据记录时可选用的各个索引

5、key行是MysqL使用的实际索引

6、key_len行给出了索引按字节计算的长度,key_len数值越小,表示越快

7、ref行给出了关联关系中另外一个数据表里的数据列的名字

8、rows行是MysqL在执行这个查询时预计会从这个数据表里读出的数据行的个数

9、extra行提供了与关联操作有关的信息

看到,possible_keys和key的值都为year_publication,查询时使用了索引

2、创建唯一索引

()

SingleIdx(name(

()      (

搜索,只有MyISAM存储引擎支持全文索引,并且只为CHAR、VARCHAR和TEXT列,索引总是对整个列进行,不支持局部索引,比如:

(MyISAM

因为默认的存储引擎为InnoDB,而全文索引只支持MyISAM,所以这里创建表的时候要手动指定一下引擎。

看到这么创建,就在info字段上成功建立了一个名为FullTxtIdx的FULLTEXT全文索引,全文索引非常适合大型数据库,而对于小的数据集,它的用处可能比较小

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

table_name (,...)

添加索引。以book这张表为例,先看一下这张表里面有哪些索引:

SHOW

名称

加上索引,sql语句如下:

book BoNameIdx(bookname(

加上唯一索引,名称为UniqidIdx:

book

加上单列索引:

book BkauthorIdx(author());

查询的时候,只需要检索前面50个字符。这里专门提一下,对字符串类型的字段进行索引,如果可能应该指定一个前缀长度,例如,一个CHAR(255)的列,如果在前10个或者前30个字符内,多数值是唯一的,则不需要对整个列进行索引,短索引不仅可以提高查询速度而且可以节省磁盘空间、减少I/O操作

添加索引,MysqL中CREATE INDEX被映射到一个ALTER TABLE语句上,基本语法结构为:

index_name table_name(,...)

删除了再创建,所有字段都没有索引,用CREATE INDEX语句创建一次索引:

BkNameIdx UniqidIdx BkAuAndInfoIdx book(author(),info( BkyearIdx book(year_publication);

此时我们SHOW一下INDEX,可以看到为5个字段建立了4个索引:

删除索引

删除索引了,可以使用ALTER TABLE和DROP INDEX删除索引。

table_name

比如把book的UniqidIdx给删除了:

book UniqidIdx;

删除了book表中的UniqidIdx这个索引,可以SHOW INDEX from book查看一下,这里就不贴图了

index_name

比如我把BkAuAndInfoIdx这个组合索引给删了:

BkAuAndInfoIdx

这样就把book表里面的BkAuAndInfoIdx这个组合索引给删除了。

注意一个细节,删除表中的列时,如果要删除的列为整个索引的组成部分,则该列也会从索引中删除;如果组成索引的所有列都被删除,则整个索引将被删除

猜你在找的MySQL相关文章