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;
索引对于优化数据库查询效率方面有着非常巨大的作用,下面是一个简单索引查询效率示例,希望能帮到一些朋友。
前提:范例表user_info,通过存储过程插入6万条数据。
表结构:
存储过程:
BEGIN
DECLARE i INT;
SET i =1;
WHILE i <= 60000 DO
INSERT INTO user_info VALUES(i,CONCAT("赵钱",i),CONCAT("passw",i),26);
SET i = i + 1;
END WHILE;
END
建立索引前:
从上执行结果看出,根据name查询时,耗时0.046s;
然后根据id查询,执行结果如下:
从上可以很明显的看出,根据主键id查询时间短的多得多!
这是因为:创建主键的时候自动给主键添加了索引,且该索引为唯一性索引。
即主键一定是唯一性索引。
但是一张表中可以有多个唯一性索引,所以唯一性索引不一定是主键。
******************************************普通索引和唯一性索引的区别 START***************************************************************
在这里不得不讲一下普通索引和唯一性索引的区别:
1、普通索引
普通索引的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = )或排序条件(ORDER BY column)中
的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
2、唯一索引
普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
**********************************************************普通索引和唯一性索引的区别 END**********************************************
下面开始创建索引(name):
CREATE INDEX ind_user_info_name ON user_info(name);
执行成功后根据name查询:
接下来是唯一索引!!用字段pass来示范:
添加索引前:
添加唯一索引:
CREATE UNIQUE INDEX uni_user_info_pass ON user_info(pass);
添加索引后再查询:
唯一性索引的另一个作用,控制该列不能有相同值!
查看表中所有的索引:
为了下面的演示,把刚创建的两个索引删除!
DROP INDEX ind_user_info_name ON user_info;
DROP INDEX uni_user_info_pass ON user_info;
创建一个唯一性复合索引:
CREATE UNIQUE INDEX uni_user_info_pass ON user_info(name,pass);
然后执行插入操作:
在这里因为是复合型索引,只有当任意两条数据name-pass两字段的值都对应相同时,才起到唯一约束的作用!!!!