数据库索引

MySQL索引与存储引擎详解

索引是存储的表中一个特定列的值数据结构,索引包含一个表列的值,并且这些值存储在一个数据结构中。(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

转载于:https://www.cnblogs.com/Samuel1/p/9836562.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值