1.索引与现实中的类比:数据库索引就好像是一本字典的目录,能加快数据库中记录的查询速度。比如我们要从一本字典中查找某个汉字。如果没有目录的话,意味着要将字典从头翻到尾一个字一个字的找,这样很浪费时间(平均要比较(n+1)/2次)。如果我们给个目录,先找在目录中找到这个的汉字。然后根据目录中该汉字的页数再到字典中去找到这个汉字,这样会快很多。数据库也是同样的道理,整个数据库表中的数据就好比是一本字典中的所有汉字,索引就是目录。如果没有索引,我们要找一条记录的话,必须遍历整个数据库表。当表中数据量很大的时候,效率会低的难以接受。如果我们建立了索引的话,就可以根据索引很快找到记录在表中位置,然后从表中读取记录。
2.索引的原理:索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 Mysql 可以快速有效地查找与键值关联的行。这句话怎么理解呢?我们再拿字典类比,我们都知道字典中目录(不知道的去翻一翻)中的汉字都是按汉字首字母进行排序的。其中,汉字就代表记录的一列(因为字典真正的记录包括汉字、该汉字的拼音、该汉字的解释、汉字组成的词组或句子等)。同样,我们在创建一个索引的时候,这个列或多列就会按照一定的顺序排序好并保存到磁盘上,怎么保存呢?---Mysql中是采用B-树的结构进行保存。现在假如有个学生表student(id,number,name,sex,height,weight,tel)。表中有10000条记录,记录本身是乱序的.现在我们要查找一个number等于9999的(假设是在表中的最后一行),对应的 SQL 语句:select * from student where number = 9999,如果没有索引,那就意味着要遍历9999(如果记录条数更大呢)次才能找到该记录。但是,如果我们建立索引呢?当然,我们要根据number这列建立索引!那么,索引中的number就会按顺序排列,并以B树结构进行保存。有了索引之后,数据库会先到索引中去找,这个很快的(看看B树的原理你就知道了),找到number=9999的记录后会直接根据保存的指针找到表中对应的记录的位置。上面的例子是单列索引,什么时候要建立多列索引呢?当我们数据库中有4条这样的记录:
name = 'zhu',height = 170,weight = 65;
name = 'zhu',height = 172,weight = 62;
name = 'zhu',height = 172,weight = 60;
现在我们要找记录为:name = 'zhu',height = 172,weight = 60;如果我们只是根据name建立索引的话,我们还是不能准确的找到该记录,因为name='zhu'的有3(这里重复的比较少,如果是很大的数呢)条,这样到表中还是要比较查询。这时我们就可以建立多个列(name,height)的索引,这样就会筛选的只剩下2条记录了,还是要比较查询,我们再加一列weight这样就可以准确从筛选出我们要的记录了。那么我们不禁要问,那将所有的列都加到索引中去好不好呢?答案是否定的,首先,我们知道,创建索引需要额外的空间来保存,当你的索引所包含的列越大时所需要的磁盘空间就越大。其次,索引本身也许要数据库对其维护,如果索引越多,维护所需要的开销就越大。
3.什么列可以什么列不可以创建索引:在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。对于那些在查询中很少或者参考列不应该创建索引;对于那些只有很少数据值的列(比如索引)也不应该增加索引。对于那些定义为text,image和bit数据类型不应该增加索引;当修改性能远远大于检索性能时,不应该创建索引。
4.Mysql中索引的类别:B-Tree索引,Hash索引,R-Tree索引和FULLTEXT索引。他们之间的区别见http://blog.csdn.net/dyllove98/article/details/9631303这篇文章将的很详细
5.Mysql中如何创建索引:creta index test_suoying(索引的字段名) on 表名;