索引是什么?
索引(在Mysql中也叫做“键(key)”)是存储引擎为了加速对表中数据行的检索而创建对一种分散存储的数据结构。
索引的出现其实就是为了提高数据查询的效率,正确的创建适合的索引是提升数据库查询性能的基础。
索引的优点
索引可以让服务器快速的定位到表的位置,根据创建索引的数据结构不同,索引也有一些其他的附加作用。
最常见的B-Tree索引,按照顺序存储数据,所以Mysql可以用来做ORDER BY 和GROUP BY操作。
因为数据是有序的,所以B-Tree也就会将相关的列值都存储在一起。最后因为索引中存储了实际的列值,所以某些查询只使用索引就能够完成全部查询。据此特性,总结下来索引有如下三个有点:
- 索引能极大的减少存储引擎需要扫描的数据量
- 索引可以帮助我们在进行分组、排序等操作时,避免使用临时表
- 索引可以把随机IO变成顺序IO
常见的索引模型
- 哈希表:哈希表是一种以键-值存储数据的接口,我们只要输入待查找的key,就可以找到其对应的值。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。不可避免地,多个key值经过哈希函数的换算,会出现一个同一个值的情况。处理这种情况的一种方法是,拉出一个链表。哈希表这种结构适用于只有等值查询的场景,比如Memcached及其他一些NoSQL引擎。而有序数组在等值查询和范围查询场景中性能都非常优秀。
- 有序数组:有序数组索引只适用于静态存储引擎,比如一些不会再修改的数据。
- 搜索树:二叉搜索树的特点是每个节点的左子节点小于父节点,父节点又小于右子节点。树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。
索引类型
PRIMARY: 主键索引,不允许有空值
#创建主键索引
ALTER TABLE table ADD PRIMARY KEY (column);
UNIQUE: 唯一索引,允许有空值。
#创建唯一索引
ALTER TABLE table ADD UNIQUE (column);
FULLTEXT:全文索引,innodb引擎在5.6.4版本提供了对全文索引的支持。
#创建全文索引
ALTER TABLE table ADD FULLTEXT (column)
#全文索引用法 注意Mysql只支持英文内容的全文索引
SELECT * FROM table WHERE MATCH(column) AGAINST('text' IN NATURAL LANGUAGE MODE);