数据库中为何要建立索引?
这个问题对于做做简单实验的学生来说似乎并不需要过于了解,但是,如果处理的数据达到百万以及以上的时候,合适的索引就能够体现出很强大的优势(MYSQL默认使用B+树索引)。
创建索引的三种方式:

三种方式:
1. CREATE INDEX index_name ON table_name (column_name).
2. ALTER TABLE ADD index indexname [index_type] (column_name).
3. 建表的时候在后面附上

4. 建立索引时可以指定索引是升序或者降序。
CREATE INDEX PersonIndex ON Person (LastName DESC) ;
如果字段的属性为字符串,限制length的大小可以有效的提高查询速率。
如长度为7的char型字段,在索引中可以设置为比7要小的长度。
5.建立组合索引:
建立组合索引在某些情况下会起到很好的效果。
CREATE INDEX PersonIndex ON Person (LastName, FirstName)
6.删除索引
DROP INDEX [indexName] ON mytable; 
7.组合索引的一些注意事项:
比如对于如下的表:
CREATE TABLE People (
   last_name varchar(50)    not null,
   first_name varchar(50)    not null,
   dob        date           not null,
   gender     enum('m', 'f') not null,
);
如果在last_name、first_name和dob上建立一个组合索引。
使用上述索引时有以下一些限制:
(1) 查询必须从索引的最左边的列开始。例如你不能利用索引查找在某一天出生的人。
(2) 不能跳过某一索引列。例如,你不能利用索引查找last name为Smith且出生于某一天的人。

Mysql中的索引类型:
1.Full Text(全文索引)
全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%”这类针对文本的模糊查询效率较低的问题。在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的。

对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。但很明显,中文不能按照这种方式进行分词。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,当然还有其他的分词插件可以使用。

2.Hash索引
Hash索引能够存在的最大原因在于其能够很快的定位而不是逐层寻找,具有极高的效率,当然其本身也有一些缺点:
Hash索引引用文章
(1)Hash 索引仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询
由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。
(2)Hash 索引无法被用来避免数据的排序操作。
由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算
(3)Hash 索引不能利用部分索引键查询。
对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
(4)Hash 索引在任何时候都不能避免表扫描。
前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

3.B+树索引