时间:2019-09-16 14:49:06 作者:无名 浏览量:43
一、什么是索引?
索引证来快速地寻找那些具有特定值的记载,一切MySQL索引都以B-树的形式保存。假如没有索引,履行查询时MySQL有必要从第一个记载开始扫描整个表的一切记载,直至找到符合要求的记载。表里面的记载数量越 多,这个操作的代价就越高。假如作为查找条件的列上已经创立了索引,MySQL无需扫描任何记载即可迅速得到方针记载地点的位置。假如表有1000个记 录,经过索引查找记载至少要比次序扫描记载快100倍。
假定咱们创立了一个名为people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL,name CHAR(50) NOT NULL );
然后,咱们彻底随机把1000个不同name值刺进到people表。在数据文件中name 列没有任何清晰的次序。假如咱们创立了name列的索引,MySQL将在索引中排序name列,对于索引中的每一项,MySQL在内部为它保存一个数据文 件中实际记载地点位置的“指针”。因而,假如咱们要查找name等于“Mike”记载的peopleid(SQL指令为“SELECT peopleid FROM people WHERE name='Mike';”),MySQL可以在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,精确地返回该行的 peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回成果。假如没有“name”列的索引,MySQL要扫描数据文件中的一切 记载,即1000个记载!显然,需求MySQL处理的记载数量越少,则它完成任务的速度就越快。
二、索引的类型
MySQL供给多种索引类型供选择:
一般索引 :
这是最基本的索引类型,并且它没有仅有性之类的约束。一般索引可以经过以下几种方法创立:
创立索引,例如CREATE INDEX <索引的姓名> ON tablename (列的列表);
修正表,例如ALTER TABLE tablename ADD INDEX [索引的姓名] (列的列表);
创立表的时分指定索引,例如CREATE TABLE tablename ( [...],INDEX [索引的姓名] (列的列表) );
仅有性索引:
优化MYSQL动态网站索引分析速度教程图2
这种索引和前面的“一般索引”基本相同,但有一个区别:索引列的一切值都只能出现一次,即有必要仅有。仅有性索引可以用以下几种方法创立:
创立索引,例如CREATE UNIQUE INDEX <索引的姓名> ON tablename (列的列表);
修正表,例如ALTER TABLE tablename ADD UNIQUE [索引的姓名] (列的列表);
创立表的时分指定索引,例如CREATE TABLE tablename ( [...],UNIQUE [索引的姓名] (列的列表) );
主键 :
主键是一种仅有性索引,但它有必要指定为“PRIMARY KEY”。假如你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创立表的时分指定,例如“CREATE TABLE tablename ( [...],PRIMARY KEY (列的列表) ); ”。可是,咱们也可以经过修正表的方法加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。
全文索引:
MySQL从3.23.23版开始支撑全文索引和全文检索。在MySQL中,全文索引的索引 类型为FULLTEXT。全文索引可以在VARCHAR或许TEXT类型的列上创立。它可以经过CREATE TABLE指令创立,也可以经过ALTER TABLE或CREATE INDEX指令创立。对于大规模的数据集,经过ALTER TABLE(或许CREATE INDEX)指令创立全文索引要比把记载刺进带有全文索引的空表更快。本文下面的讨论不再触及全文索引,要了解更多信息,请拜见MySQL documentation。
三、单列索引与多列索引