MySQL学习——索引
索引可以大大提升MySQL的索引速度,下面将介绍MySQL中的不同种索引。
- 普通索引
- 唯一索引
- 主键索引
- 组合索引
- 全文索引
1、普通索引
普通索引是最基本的索引,创建时没有任何限制。在创建索引时可以指定索引长度。length为可选参数,表示索引长度(只有字符串类型的字段才能指定索引长度),如果是BLOB和TEXT类型必须要指定这个length
创建索引时需要注意如果指定单列索引长度,length必须小于这个字段所允许的最大字符个数。
查询某张表的索引采用:SHOW INDEX FROM 表名
1.1、直接创建索引
语法格式:
CREATE INDEX 索引名 ON 表名(列名(length))
这种方式创建索引需要保证该列已经存在了,其中length可以省略。
1.2、修改表添加索引
语法格式:
ALTER TABLE 表名 ADD INDEX 索引名(列名(length))
1.3、创建表时指定索引
语法格式:
CREATE TABLE 表名(
...,
...,
INDEX 索引名(列名(length))
)
在创建表的最后末尾加上INDEX...即可
1.4、删除索引
语法结构:
DROP INDEX 索引名 ON 表名
2、唯一索引
唯一索引与普通索引类似,不同的是:索引列的值必须是唯一的,但允许有空值。
2.1、直接创建索引
语法结构:
CREATE UNIQUE INDEX 索引名 ON 表名(列名(length))
2.2、修改表添加索引
ALTER TABLE 表名 ADD UNIQUE 索引名(列名(length))
2.3、创建表时指定索引
语法格式:
CREATE TABLE 表名(
...,
...,
UNIQUE 索引名(列名(length))
)
3、主键索引
一种特殊的唯一索引,一个表只能由一个主键,不允许由空值,一般是建表时同时创建主键索引。一般是由数据库自动创建的,因此当我们个一张表分配了一个主键,那数据库就会帮我们自动创建这个主键索引。因此没有单独的创建主键索引的语句,而是创建主键的语法来代替
4、组合索引
组合索引是指使用多个字段建立的索引(索引中包含了多个字段),只有在查询条件中使用了创建索引时的第一个字段时,索引才会被使用(最左前缀原则)。
最左原则:若我们使用表中的name,address,salary创建索引,我们只能使用以下条件组合时索引才会生效。
- name,address,salary
- name,address,
- name
若只是用address,salary作为条件,则不会触发索引。
4.1、修改添加组合索引
语法结构:
ALTER TABLE 表名 ADD INDEX 索引名(列名1(length), 列名2(length)...)
其实可看出来组合索引的创建,其实就是普通索引创建时在括号内填写多个列。
5、全文索引(FULLTEXT INDEX)
全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,FULLTEXT索引与其他索引不同,它更像时一个搜索引擎,而不是简单的where语句的参数匹配。FULLTEXT索引配合match against操作一起使用。全文索引并不是完全值的索引,一般是在某个字段数据过大才建立全文索引。
可以在CHAR,VARCHAR或TEXT列建立全文索引。
5.1、修改表添加索引
ALTER TABLE 表名 ADD FULLTEXT 索引名(列名)
5.2、创建表时指定索引
语法格式:
CREATE TABLE 表名(
...,
...,
FULLTEXT 索引名(列名)
)
5.3、使用全文索引
全文使用的索引需要在查询语句中使用 match(全文索引列名) against('搜索的内容') 来索引。
语法结构:
SELECT * FROM 表名
WHERE MATCH(全文索引列名) AGAINST('搜索的内容')
注意全文索引检索的基本单位是词,而不是字符,例如数据为“hello word”,我是用“hello”去匹配则是可以检索出该条数据,但是使用“he”去匹配则无法被检索出来。
英文的分词是根据空格等非字符或数字来进行分词的。如果是对中文进行全文索引,则需要使用NGRAM这个解析器(在创建全文索引时在末尾增加WITH PARSER NGRAM即可)