一起养成写作习惯!这是我参与「掘金日新计划 · 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树不能满足海量数据的查询性能优化
B+树
B+树特点:查询0001 会缓存 下次查找0002的时候 直接不要从上到下查找 直接根据缓存定位
InnoDB
把索引和数据存放在一个文件中,通过索引就能直接在索引树上的叶子结点中获取数据--聚簇索引,可以实现行锁。
MyISAM非聚簇索引
把索引和数据存放在两个文件中,查找到索引后还要去另一个文件中找数据,性能会慢--非聚簇索引。MyISAM天然支持表锁,而且支持全文索引。