索引在数据库开发中有非常重要的作用,通过在表字段中建立索引可以优化查询,确保数据的唯一性,并且可以对任何全文索引字段中大量文本的搜索进行优化。在MySQL中主要有四类索引:主键索引、唯一索引、常规索引、和全文索引。
主键索引(PRIMARY KEY)
主键索引是关系型数据库中最常见的索引类型,主要作用是确定数据表里一条数据记录的位置。数据表会根据主键的唯一性来标识每条记录,任意两条记录里的主键字段都不允许是同样的内容,这样可以加快寻址定位时的速度。最好为每张数据表指定一个主键,但一个表只能指定一个主键,而且主键的值不能为空,不过可以有多个候选索引。
唯一索引(UNIQUE KEY)
唯一索引与主键索引一样,都可以防止创建重复的值。但是,不同之处在于每个表只能有一个主键索引,但是可以有多个唯一索引。唯一索引的作用就是保证某列数据的值不能相同。
常规索引(INDEX)
常规索引技术是关系型数据库查询中最重要的技术,如果要提升数据库的性能,索引优化是首先应该考虑的,因为它能使我们的数据库得到最大性能的提升。如果没有索引的数据表,就没有排序的数据集合,要查询数据就要进行全表扫描。有索引的表是一张在索引列上排序了的表,可以通过索引快速定位记录。在MyISAM数据表中数据行保存在数据文件中,索引保存在索引文件中。而InnoDB数据表把数据与索引放在用一个文件中。
常规索引也存在缺点,例如,多占用磁盘空间,而且还会减慢索引数据列上的插入,删除,和修改操作,它们也需要按照索引列上的排序格式执行。因此索引应该创建在搜索,排序,分组等操作所涉及的数据列上。也就是where子句,关联检索中的from子句,order by或group by 子句中出现过的数据列最适合用来创建这种索引。不要建立太多索引,索引是会消耗系统资源的,要适可而止。
常用的索引命令如下:
CREATE INDEX ind ON carts(price , name) #创建名称为ind的索引为carts表的两列
SHOW INDEX FROM carts #显示carts表所有的索引
DROP INDEX ind ON carts #删除ind索引
全文索引(FULLTEXT)
MySQL从版本3.23.23开始支持全文索引和搜索,使你在不使用模式匹配操作的情况下搜索单词或短语。但全文索引只能在MyISAM下的CHAR,VARCHAR,或TEXT类型的列上创建,也允许创建一个或多个数据列上,只是一种特殊的索引,它会把某个数据表的某个数据列上出现过的所有单词生成一份清单。
- 全文索引的创建和别的索引类型创建类似,但基于全文索引获取查询却有所不同。在SELECT 语句中需要使用 MATCH() 和AGAINST() 两个特殊的MySQL函数,MATCH函数负责列举将对它搜索的一个或多个数据列,而AGAINST()函数则负责给出搜索字符串。例如,我们要在数据表books的detail字段中搜索字符串“hello”,SELECT语句如下所示:
SELECT bookname,price FROM books WHERE MATCH(detail) AGAINST('hello') #全文索引
该查询列出在detail出现的“hello”的记录,以相关性从高到低的顺序排序。另外,这两个函数除了在where子句中使用,还可以放到查询体中。这样,执行MySQL会搜索books表中的每一条记录,计算各条记录的相关值,并返回匹配记录的加权分列表。返回的分数越高,相关性越大,如下所示:
SELECT MATCH(detail)AGAINST("hello") FROM books; #全文索引