(本人菜鸟一枚,如有理解不对,请大神多多指正!!!)

一、索引
  1、什么是索引?
  答:索引类似于一本书的目录,便于数据快速高效的查找,也可以解释为数据按照某个特定的规则去存储排序数据


  2 、索引的类型?
  答:索引可以分为:普通索引,唯一索引,主键索引和组合索引


  2.1 普通索引 ---最基本的一种索引方式,没有什么限制


       有三种创建索引的方式:


      ①创建索引-CREATE INDEX indexName ON tableName(columnName(length));


    注:如果columnName为char或者varchar,则可以指定length小于实际长度(可以通过观察发现从第几个长度开始不重复,则   可将length定义为该长度),如果为BOOLEAN或TEXT类型,则length长度则为实际长度。


     ②修改表结构添加索引-ALTER tableName ADD INDEX indexName ON (columnName(length));


     ③创建表的时候添加-即是在创建表的时候加入INDEX indexName(columnName(length));


2.2 唯一索引---不同于普通索引,它所加的列的值必须是唯一的,但允许有空值。


     有三种创建索引的方式:


    ①创建索引-CREATE UNIQUE INDEX indexName ON tableName(columnName(length));


    ②修改表结构添加索引-ALTER tableName ADD  UNIQUE indexName ON (columnName(length));


    ③创建表的时候添加索引-即是在创建表的时候加入UNIQUE indexName(columnName(length));


2.3 主键索引-它是一种特殊的索引,值为唯一的,不能为空,一般是在创建表的时候进行添加


    即是在创建表的时候加入PRIMARYKEY (columnName);


2.4 组合索引-组合索引即是在多个列上加上索引,是为了进一步提升MySQL的查询速度


   ALTER TABLE tableName ADD INDEX name_age_city(name(10),age,city);


  假如name的长度为15,这里将name长度改为10是因为name的长度一般是不超过10的,这样做可以加快MySQL的索引查询速度,还可以减少索引文件的大小,也可以提升INSERT的速度!!!



二、索引原理
    举个例子:一个数据库共有5000 000条记录,id int(4),name  Char(50),otherName Char(50),address Char(100)。每条记录需要分配204个字节,假设保存在MyISAM数据库中,则这个数据库块大小默认为B=1024字节。于是,我们可以计算出这个表的分块因数为bfr=(B/R)=1024/204=5,即磁盘的每个数据块保存的记录为5条,那么保存整个表所需的数据块数是              N=r/bfr=5000000/5=1000 000。
     使用线性查找索引id字段--这个字段是键字段(每个字段的值是唯一的),需要访问N/2=500000个数据块才能找到目标值。不过因为这个字段是经过排序的,所以可以使用二分查找法,而这样平均只需要访问log2 1000000=19.93=20个块,显然性能极大的提升了。
       再看一下name这个字段,它是未经过排序的,因此不能通过二分法进行查找,而且字段的值也不是唯一的,所以要从头查到尾,既需要访问100000个数据块。这种情况通过建立索引就可以得到改善。
     故:当键字段唯一时,可以减少一半的查找。当这个字段排序过,则只需要Log2 N个块的查找


(B树和B+树以后会补上的^_^!!)