索引是存储的表中一个特定列的值数据结构,索引包含一个表列的值,并且这些值存储在一个数据结构中。(BTree、B+Tree)
(B Tree二分查找法或顺序法,B+ )MySQL存储引擎:InnoDB;
存储引擎
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎。
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物,使用表级锁, 并发性差。
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问,表级锁。
ARCHIVE存储引擎是被设计用来存储企业中的大量流水数据的存储引擎。
Mysql支持Hash索引和B+树索引两种
B+Tree索引、Hash索引
B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。
哈希表hash table(key,value,就是把Key通过哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。
而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。
Hash索引
把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
但是,
- Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询;
- Hash 索引无法被用来避免数据的排序操作;
- Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高,哈希碰撞问题;
- 不支持最左匹配
索引最左匹配原则
如果是联合索引,那么key也由多个列组成,同时,索引只能用于查找key是否存在(相等),遇到范围查询(>、<、between、like
左匹配)等就不能进一步匹配了,后续退化为线性查找;
如有索引(a, b, c, d)
,查询条件a = 1 and b = 2 and c > 3 and d = 4
,则会在每个节点依次命中a、b、c,无法命中d。(c已经是范围查询了,d肯定是排不了序了)
聚集索引、非聚集索引
- 聚集索引就是以主键创建的索引
- 非聚集索引就是以非主键创建的索引
聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续;
聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
设置索引要付出的代价
- 增加数据库的存储空间,
- 插入和修改数据要花更多的时间(因为索引也要变动)
建索引之处
- 频繁搜索的列
- 连接属性(主外键)
- 经常排序分组的列(常出现于where之后)
- 尽可能的扩展索引,不要新建立索引
CREATE [UNIQUE] INDEX index_name ON table_name(column_list)
DROP INDEX index_name