Wenqi's Blog

MySQL-SQL之索引

索引具有加快数据库服务器查询数据的速度的作用,其作用目的是为将经常作用于查询标志(比如where语句的查询条件)的列新建一个数据结构,这个数据结构的每一个元素通常包含两个信息:索引列的值和索引值所执行的数据行的地址。

关于索引

从对索引的实现算法上,最常见的是使用B+ Tree的数据结构,另外还有位图,全文索引的实现方式,这些算法实现对应于应对不同索引的应用场景,B+ Tree应用场景比较普遍,其更擅长于处理索引值含有不同值的列,其查询速度可以维持在log(N)的时间复杂度,而位图算法适合有大量行但是有较少值的情况,一个具体形象的例子是银行卡的类型仅仅有储蓄账户,支票账户等等几种,而银行卡信息却有很多,如果要对银行卡类型建立索引,位图算法是个好的选择。全文索引策略适用于对文字较多的列建立索引。
当前mysql对索引策略的支持如下表所示

除了我们上面提到的BTree,FullText,上面还出现了RTree,Hash等策略,hash算法是通过要索引的值获取一个hash值,并且根据hash值建立索引,rtree相对于b-tree的优势在于范围查找,不是很常用。
按照功能性来分的话,mysql索引又分为普通索引,唯一索引,主键索引,全文索引,外键索引和组合索引,我们既可以在创建表时创建索引,又可以在之后通过修改表的方式添加索引,我们用后面一种方式做例子

  1. 添加普通索引语法:alter table 表名 add index 索引名(列名)
  2. 添加唯一索引,这种索引会限制索引列出现重复的值,语法alter table 表名 add index unique 索引名(列名)
  3. 添加主键索引,这个mysql会自动帮我们加入,如果修改加入主键,可以使用alter table 表名 add primary key(列名)
  4. 添加全文索引,alter table 表名 add fulltext 索引名(列名)
  5. 添加外键索引,和添加外键一样,alter table 表名 add foreign key(列名) references 参照表名(参照表列)

使用explain命令处理select句,具体列的值可以参考这里

参考文献

MySQL索引(index)专题
MySQL中EXPLAIN命令详解

坚持原创技术分享,您的支持将鼓励我继续创作!