MySQL索引(一)

104 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

索引的分类

主键索引:主键自带索引效果,通过主键来查询表中的记录,性能是非常好的。

普通索引:为普通列创建的索引

#格式
create index 索引名称 on 表明(列名)
#列子
create index idx_name on emp(name)

唯一索引:就像是唯一列,列中的数据是唯一的,比普通索引的性能比较好

create unique index idx_name on emp(name)

联合索引(组合索引):一次性为表中的多个字段一起创建索引。注意:一个联合索引建议不要超过五个列。

create index idx_name_age on emp(name,age)

全文索引:不会使用MySQL提供的MyISAM存储引擎的全文索引来实现的,而是使用第三方的搜索引擎中间件如果ES,Solr。

索引的数据结构

使用索引查找数据性能很快,避免了全表扫描的多次磁盘IO读写。

数组:可以通过数组的索引/下标。

      数组的查询性能好,时间复杂度O(1)

      数组的增删性是非常差的

链表:查询的性能是非常差的,时间复杂度O(n)

      增删性能是非常好的

栈:先进后出
队列:先进先出

树的查找性能是明显比线性表要好

多叉树

非二叉树

二叉树

一个节点最多只能有2个子节点,可以是 0、1、2子节点。

二叉查找树

查询性能跟树的高度有关,树的高度又跟你插入数据的顺序有关系。特点:对于二叉树的根节点的数值是比所有左子树的结点的数值大;比右子树的节点的数值小。这样的规律同样满足它的所有子树。 左小右大

### 平衡二叉树

二叉查找树不能非常智能的维护树的高度,因此二叉查找树在某些情况下查询性能是不ok的,此时平衡二叉树就出现了。

特点:平衡二叉树的及其所有子树都应该满足:左子树和右子树的深度差不能不能超过1
如果不满足这个特点:左旋,右旋,双向(先左后右,先右后左)

红黑树

平衡二叉树为了维护二叉树,一旦不满足平衡的情况下会进行自旋,但是自旋会造成一定的系统开销。因此红黑树在自旋造成的系统开销和减少查询次数之间做了权衡。红黑树有时候并不是一棵平衡二叉树。
红黑树在查询性能上得到了优化。因为红黑树在每一层存放的数据内容是有限的,导致数据量一大,树的深度就变得非常大,于是查询性能非常差。

B树

B树允许一个节点存储多个数据....的节点决定了树的高度
B树的一个节点最多只能存放15个数据,B树不能满足海量数据的查询性能优化

image.png

B+树

B+树特点:查询0001 会缓存 下次查找0002的时候 直接不要从上到下查找 直接根据缓存定位

image.png

InnoDB

把索引和数据存放在一个文件中,通过索引就能直接在索引树上的叶子结点中获取数据--聚簇索引,可以实现行锁。

image.png

MyISAM非聚簇索引

把索引和数据存放在两个文件中,查找到索引后还要去另一个文件中找数据,性能会慢--非聚簇索引。MyISAM天然支持表锁,而且支持全文索引。