乐趣区

关于mysql:MySQL索引原理一-索引类型

Thresh

概述

索引能够晋升查问速度,会影响 where 查问,以及 order by 排序。

MySQL 索引类型如下:

从索引存储构造划分:B Tree 索引、Hash 索引、FULLTEXT 全文索引、R Tree 索引
从利用档次划分:一般索引、惟一索引、主键索引、复合索引
从索引键值类型划分:主键索引、辅助索引(二级索引)从数据存储和索引键值逻辑关系划分:汇集索引(聚簇索引)、非汇集索引(非聚簇索引)

一般索引

最根本的索引类型,基于一般字段建设的索引,没有任何限度。

创立一般索引的办法如下:

CREATE INDEX < 索引的名字 > ON tablename (字段名);
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名);   罕用
CREATE TABLE tablename ([...], INDEX [索引的名字] (字段名) );

惟一索引

与 ” 一般索引 ” 相似,不同的就是:索引字段的值必须惟一,但容许有空值。在创立或批改表时追加惟一束缚,就会主动创立对应的惟一索引。

创立惟一索引的办法如下:

CREATE UNIQUE INDEX < 索引的名字 > ON tablename (字段名);
ALTER TABLE tablename ADD UNIQUE INDEX [索引的名字] (字段名); 罕用
CREATE TABLE tablename ([...], UNIQUE [索引的名字] (字段名) ;

主键索引

它是一种非凡的惟一索引,不容许有空值。在创立或批改表时追加主键束缚即可,每个表只能有一个主键。

创立主键索引的办法如下:

CREATE TABLE tablename ([...], PRIMARY KEY (字段名) );
ALTER TABLE tablename ADD PRIMARY KEY (字段名);    罕用

复合索引

用户能够在多个列上建设索引,这种索引叫做组复合索引(组合索引)。复合索引能够代替多个繁多索引,相比多个繁多索引复合索引所需的开销更小。

索引同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为 1 - 2 列的索引,宽索引也就是索引列超过 2 列的索引,设计索引的一个重要准则就是能用窄索引不必宽索引,因为窄索引往往比组合索引更无效。

创立组合索引的办法如下:

CREATE INDEX < 索引的名字 > ON tablename (字段名 1,字段名 2...);
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名 1,字段名 2...); 罕用
CREATE TABLE tablename ([...], INDEX [索引的名字] (字段名 1,字段名 2...) );

复合索引应用注意事项:

1. 何时应用复合索引,要依据 where 条件建索引
       留神不要过多应用索引,过多应用会对更新操作效率有很大影响。2. 如果表曾经建设了(col1,col2),就没有必要再独自建设(col1);如果当初有 (col1) 索引,如果查问须要 col1 和 col2 条件,能够建设 (col1,col2) 复合索引,对于查问有肯定进步。

全文索引

查问操作在数据量比拟少时,能够应用 like 含糊查问,然而对于大量的文本数据检索,效率很低。如果应用全文索引,查问速度会比 like 快很多倍。在 MySQL 5.6 以前的版本,只有 MyISAM 存储引擎反对全文索引,从 MySQL 5.6 开始 MyISAM 和 InnoDB 存储引擎均反对。

创立全文索引的办法如下:

CREATE FULLTEXT INDEX < 索引的名字 > ON tablename (字段名);
ALTER TABLE tablename ADD FULLTEXT [索引的名字] (字段名);
CREATE TABLE tablename ([...], FULLTEXT KEY [索引的名字] (字段名) ;

和罕用的 like 含糊查问不同,全文索引有本人的语法格局,应用 match 和 against 关键字,比方

select * from user where match(name) against('aaa');

全文索引应用注意事项:

1. 全文索引必须在字符串、文本字段上建设。2. 全文索引字段值必须在最小字符和最大字符之间的才会无效。(innodb:3-84;myisam:4-84)3. 全文索引字段值要进行切词解决,按 syntax 字符进行切割,例如 b +aaa,切分成 b 和 aaa
4. 全文索引匹配查问,默认应用的是等值匹配,例如 a 匹配 a,不会匹配 ab,ac。如果想匹配能够在布尔模式下搜寻 a *
    select * from user where match(name) against('a*' in boolean mode);
  
    + 必须蕴含该词
    - 必须不蕴含该词
    > 进步该词的相关性,查问的后果靠前
    < 升高该词的相关性,查问的后果靠后
    (*)星号 通配符,只能接在词前面
退出移动版