MySQL 索引的分类
mysql的索引主要分为3类:
1.单列索引
2.联合索引(复合索引)
3.唯一索引
-----------------------------------------------------
在介绍索引的分类之前我们必须知道什么叫做索引:
MySQL官方给出的定义是:
索引是帮助mysql高效获取数据的数据结构.
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据
,这样就可以在这些数据结构上实现高级算法.这种数据结构,被称为索引
从本质上来说,索引就是数据结构.
可以简单地理解为:
索引是排好序的快速查找的数据结构.
是为了解决SQL数据过于庞大引起效率下降的优化方案
下面我们来聊下索引,简单的阐述下我对索引的认识:
1.单值索引
单值索引是最通用,最简单的一种索引.
一个索引只包含一个列,一个表中可以有多个单列索引.
这是最基本的索引,没有任何限制,下面是它的几种创建方式(length可以忽略不写):
#外部创建
CREATE INDEX [indexname]ON t1(colname);
#创建表的时候创建
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
#alter语句添加
ALTER table tableName ADD INDEX indexName(columnName)
2.唯一索引
它与前面的普通索引有些类似,不同的就是:
索引列的值必须唯一,但可以为null;
我们声明unique关键字时,会为其字段自动添加唯一索引
它也有3种创建方式,其中两种都是被熟知的:
#创建表时添加,可以使用标记约束和列级约束
CREATE TABLE mytable(
ID INT NOT NULL, UNIQUE
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (rowname(length))
);
#使用alter 语句
ALTER TABLE T1 ADD UNIQUE [indexname] (rowname(length))
#外部创建
CREATE UNIQUE INDEX [indexname] ON TABLENAME(rowname(length))
3.复合索引(联合索引)
复合索引是索引中功能最强大的一个.
索引能够同时覆盖多个数据列,对于复合索引来说:
mysql从左到右的使用索引中的字段,一个查询可以只使用索引的一部分,但是只能从最左侧开始.
例如:
我们定义了复合索引 index(c1,c2,c3),则我们进行查找的时候可以 c1 , c2 ,c3 | c1 ,c2 | c1 这三种组合来查找,只能从最左边来开始,如果使用c2 , c3 进行查找则索引会失效.当最左侧字段是常量引用时,索引就十分有效.
CREATE INDEX idx_c1_c2_c3ON tablename(c1,c2,c3)
复合索引的建立原则:
当我们需要频繁的用到某些字段并且我们能确定使用字段的顺序时,我们就可以创建复合索引;
但如果我们并不确定要用到哪些字段时就只能单独的为这些字段添加索引,添加无用的复合索引会引起索引失效的同时给mysql更改添加删除带来压力.
复合索引对排序的优化:
我们要知道复合索引只会对与创建索引时的排序顺序完全相同或相反的 order by语句进行优化
#创建的复合索引为:
CREATE INDEX idx_c1_c2_c3ON tablename(c1 DESC,c2 DESC,c3 DESC)
#顺序完全相同
SELECT c1 ,c2 ,c3 FROM t1 ORDER BY c1 DESC , C2 DESC , C3 DESC;
SELECT c1 ,c2 ,c3 FROM t1 ORDER BY c1 DESC , C2 DESC ;
SELECT c1 ,c2 ,c3 FROM t1 ORDER BY c1 DESC ;
#顺序完全相反
SELECT c1 ,c2 ,c3 FROM t1 ORDER BY c1, C2, C3 ;
SELECT c1 ,c2 ,c3 FROM t1 ORDER BY c1, C2;
SELECT c1 ,c2 ,c3 FROM t1 ORDER BY c1;