索引具有加快数据库服务器查询数据的速度的作用,其作用目的是为将经常作用于查询标志(比如where语句的查询条件)的列新建一个数据结构,这个数据结构的每一个元素通常包含两个信息:索引列的值和索引值所执行的数据行的地址。
关于索引
从对索引的实现算法上,最常见的是使用B+ Tree的数据结构,另外还有位图,全文索引的实现方式,这些算法实现对应于应对不同索引的应用场景,B+ Tree应用场景比较普遍,其更擅长于处理索引值含有不同值的列,其查询速度可以维持在log(N)的时间复杂度,而位图算法适合有大量行但是有较少值的情况,一个具体形象的例子是银行卡的类型仅仅有储蓄账户,支票账户等等几种,而银行卡信息却有很多,如果要对银行卡类型建立索引,位图算法是个好的选择。全文索引策略适用于对文字较多的列建立索引。
当前mysql对索引策略的支持如下表所示
除了我们上面提到的BTree,FullText,上面还出现了RTree,Hash等策略,hash算法是通过要索引的值获取一个hash值,并且根据hash值建立索引,rtree相对于b-tree的优势在于范围查找,不是很常用。
按照功能性来分的话,mysql索引又分为普通索引,唯一索引,主键索引,全文索引,外键索引和组合索引,我们既可以在创建表时创建索引,又可以在之后通过修改表的方式添加索引,我们用后面一种方式做例子
- 添加普通索引语法:
alter table 表名 add index 索引名(列名)
- 添加唯一索引,这种索引会限制索引列出现重复的值,语法
alter table 表名 add index unique 索引名(列名)
- 添加主键索引,这个mysql会自动帮我们加入,如果修改加入主键,可以使用
alter table 表名 add primary key(列名)
- 添加全文索引,
alter table 表名 add fulltext 索引名(列名)
- 添加外键索引,和添加外键一样,
alter table 表名 add foreign key(列名) references 参照表名(参照表列)
使用explain命令处理select句,具体列的值可以参考这里