时间:2019-09-16 14:49:06 作者:无名 浏览量:43
索引可以是单列索引,也可以是多列索引。下面咱们经过具体的比方来说明这两种索引的区别。假定有这样一个people表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL AUTO_INCREMENT,firstname CHAR(50) NOT NULL,lastname CHAR(50) NOT NULL,age SMALLINT NOT NULL,townid SMALLINT NOT NULL,PRIMARY KEY (peopleid) );
优化MYSQL动态网站索引分析速度教程图3
下面是咱们刺进到这个people表的数据:
这个数据片段中有四个姓名为“Mikes”的人(其间两个姓Sullivans,两个姓McConnells),有两个年纪为17岁的人,还有一个姓名异乎寻常的Joe Smith。
这个表的主要用途是根据指定的用户姓、名以及年纪返回相应的peopleid。例如,咱们可 能需求查找姓名为Mike Sullivan、年纪17岁用户的peopleid(SQL指令为SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age=17;)。因为咱们不想让MySQL每次履行查询就去扫描整个表,这里需求考虑运用索引。
首要,咱们可以考虑在单个列上创立索引,比方firstname、lastname或许 age列。假如咱们创立firstname列的索引(ALTER TABLE people ADD INDEX firstname (firstname);),MySQL将经过这个索引迅速把查找规模约束到那些firstname='Mike'的记载,然后再在这个“中间成果集”上 进行其他条件的查找:它首要扫除那些lastname不等于“Sullivan”的记载,然后扫除那些age不等于17的记载。当记载满足一切查找条件之后,MySQL就返回终究的查找成果。
因为建立了firstname列的索引,与履行表的彻底扫描相比,MySQL的功率进步了很 多,但咱们要求MySQL扫描的记载数量仍旧远远超过了实际所需求的。尽管咱们可以删去firstname列上的索引,再创立lastname或许age 列的索引,但总地看来,不论在哪个列上创立索引查找功率仍旧相似。
为了进步查找功率,咱们需求考虑运用多列索引。假如为firstname、lastname和age这三个列创立一个多列索引,MySQL只需一次检索就可以找出正确的成果!下面是创立这个多列索引的SQL指令:
ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);
因为索引文件以B-树格式保存,MySQL可以立即转到适宜的firstname,然后再转到适宜的lastname,最终转到适宜的age。在没有扫描数据文件任何一个记载的情况下,MySQL就正确地找出了查找的方针记载!
那么,假如在firstname、lastname、age这三个列上别离创立单列索引,效 果是否和创立一个firstname、lastname、age的多列索引相同呢?答案是否定的,两者彻底不同。当咱们履行查询的时分,MySQL只能使 用一个索引。假如你有三个单列的索引,MySQL会试图选择一个约束最严格的索引。可是,即使是约束最严格的单列索引,它的约束能力也必定远远低于 firstname、lastname、age这三个列上的多列索引。
四、最左前缀
多列索引还有别的一个长处,它经过称为最左前缀(Leftmost Prefixing)的概念表现出来。持续考虑前面的比方,现在咱们有一个firstname、lastname、age列上的多列索引,咱们称这个索引 为fname_lname_age。当查找条件是以下各种列的组合时,MySQL将运用fname_lname_age索引:
firstname,lastname,agefirstname,lastnamefirstname
从另一方面了解,它相当于咱们创立了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。下面这些查询都可以运用这个fname_lname_age索引:
优化MYSQL动态网站索引分析速度教程图4
SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17'; SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan'; SELECT peopleid FROM people WHERE firstname='Mike'; The following queries cannot use the index at all: SELECT peopleid FROM people WHERE lastname='Sullivan'; SELECT peopleid FROM people WHERE age='17'; SELECT peopleid FROM people WHERE lastname='Sullivan' AND age='17';