在工作当中,涉及到Mysql的查询,我们经常会遇到给某个表某个字段加索引的诉求,加上索引能够让我们的sql得到查询速度上的提升。但索引的原理是什么呢,他又是怎么工作的,需要开发者对基础知识有一定的了解。
索引通过特定的一些数据结构,将数据组织有序,将随机I/O变为顺序I/O,有效减少查询一条数据所需要扫描的数据量,加快查询的速度。
从使用者的角度而言,Mysql索引主要为以下几种。
主键索引
根据数据表主键建立的索引,不允许重复和空值。主键索引列全表唯一
alter table 'table_name' add primary key pk_index_name('col_name');
唯一索引
用于确保建立索引列内的值是唯一的,允许空值。比如同样为age字段,不能出现2个age为10的数据
alter table 'table_name' add unique unique_index_name('col_name');
普通索引
用于表中的普通列构建的索引,没有特殊限制
alter table 'table_name' add index index_name('col_name');
联合索引
采用多个列组合构建的索引,用于组合搜索
alter table 'table_name' add index index_name('col1_name','col2_name');
全文索引
用于大文本对象的列构建索引
alter table 'table_name' add fulltext index full_index_name('col_name');
空间索引
用于GIS地图数据的索引,Mysql中的空间数据类型有GEOMETRY、POINT、LINESTRING、POLYGON
alter table 'table_name' add spatial index spa_index_name('col_name');
根据数据结构的不同,Mysql的索引可分为哈希索引
、BTree索引
、B+Tree索引
。
哈希索引
哈希索引通过hash表实现,通过将hash函数计算出的hash值存储在索引中,来完成key-value的快速查询
通常而言当发送hash碰撞之后(即两个key在经过hash函数之后值为同一个),采用链地址法解决冲突,如上图中小刘到小王的连接线,获取key找到索引地址之后,顺序遍历地址内的链表,获得最终结果。
哈希索引的特点和hashmap类似,适合于精确查找,但不适合范围查找,hash码并不具有规律性,所以存储hash索引时顺序性是无法保障的。
BTree索引
关于平衡二叉搜索树的概念和意义可以详见我的另一篇文章