一、索引介绍

索引是帮助MySQL高效获取数据的数据结构。我们知道最基本的数据查找方式是顺序查找,这种算法的复杂度为O(n),性能很低。性能比较高的数据查找算法有:二分查找、二叉树查找。但二分查找算法要求被查找的数据是有序的,数据库中的数据不可能满足这种要求。二叉树查找只能应用于二叉树这种特定数据结构上面。MySQL数据库为了满足这些高级的查找算法,在保存数据之外,数据库还维护着满足这些高级算法的数据结构,我们称这种数据结构为索引。

目前大部分的数据库系统都采用B-Tree或B+Tree作为索引结构。而MySQL普遍采用B+Tree作为索引结构。

二、索引分类

MySQL索引有如下几类:普通索引、唯一索引、主键索引、组合索引、全文索引。

各种索引的特点如下:

索引名称特点
普通索引无任何限制
唯一索引索引列必须唯一,但允许有NULL值
主键索引索引列必须唯一,且不允许有NULL值
组合索引组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到
全文索引根据词频进行全文搜索,使用不当会严重影响性能

 

三、语法

3.1 创建索引

创建索引的方式有3种,下面以创建普通索引为例分别介绍3种方式:

 

CREATE INDEX indexName ON mytable(username(length));

ALTER mytable ADD INDEX indexName ON (username(length));

CREATE TABLE mytable(
    ID INT NOT NULL,
    username VARCHAR(16) NOT NULL,
    INDEX [indexName] (username(length))
);

 

唯一索引的创建方式和普通索引类似,如:

ALTER mytable ADD UNIQUE indexName ON (username(length))

 

组合索引

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);

 

注意:组合索引的第一个字段必须出现在查询条件中,否则组合索引不会被用到。

 

3.2 删除索引

DROP INDEX indexName ON mytable;

 

3.3 查看索引

SHOW INDEX FROM myTable;

 

四、索引创建时机

虽然索引可以加快查询的速度,但索引也是有代价的。索引本身要消耗存储空间,同时索引会影响数据插入、删除、修改的时间,而且MySQL在运行时也要消耗资源去维护索引。因此索引并不是越多越好。

有2种情况下是不适合创建索引的:

  1. 表记录比较少,如表中只有几千条数据,则完全没必要创建索引。
  2. 选择性较低。通俗的讲就是表中非重复数据的占比较低,如果某列中的大多都是重复数据,则也没必要建立索引。一般采用如下的SQL语句进行计算。

 

SELECT count(DISTINCT(title))/count(*) AS Selectivity FROM employees.titles;
Logo

更多推荐