MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构。
1、唯一索引
指索引列的值必须唯一,但允许有空值(NULL可以出现多次)。
2、单值索引
3、复合索引
即一个索引包含多个列。
创建索引:
删除索引:
数组?:
数组在查找方面效率很高,根据角标查询数据,时间复杂度为O(1),但如果发生了插入和删除,整个数组的角标都会变化,时间复杂度为O(n),效率很低。
哈希表?:
哈希表是由键值对组成的,其增删改查的时间复杂度都是O(1)。
二叉树?:
就增删改查操作来说,哈希比树的操作更快,但二叉树有排序操作。
但是,普通二叉树是静态的,导致其并不稳定,各个节点添加后就无法修改优化,也就是说,可能会有下面的情况出现:
平衡二叉树(AVL)?:
相比于普通二叉树,平衡二叉树会通过自旋来实现动态变化,是自身的结构稳定了下来。
到了平衡二叉树这里,各个操作的时间复杂度都已经相对稳定,且时间复杂度均为O(log(n))。
B树?:
二叉树中,每个节点仅能有一个数据,B树中可以有两个(三叉树)。
相比于二叉树,少了一次IO操作,提高了查询效率。
B+树(√):
这是B树的检索原理:
在B树中,每个磁盘块中键值和数据存储在一起。
优势:① 提高数据检索的效率,降低数据库的IO成本。
劣势:① 索引提升了查询速度,但也降低了更新表的速度,如INSERT、UPDATE、DELETE。因为更新表时,不仅要保存数据,还要保存索引文件中每次更新添加了索引列的字段,调整因为更新所带来的键值变化后的索引信息。
MySQL的查询处理,也就是使用EXPLAIN关键字模拟优化器执行SQL查询语句,从而得知MySQL是如何处理你的SQL语句的,由此来分析你的查询语句或是表结构的性能瓶颈。
执行EXPLAIN所获得的信息:
注:由于Mysql5.5⁄5.7⁄8.0底层做了不同优化,不同版本下性能表现不同。
最简单的select查询,查询中不包含子查询或UNION
查询中若包含复杂的子部分,则最外层被标记为PRIMARY,在select或where中的子部分为SUBQUERY
从UNION表获取结果的select就是UNION RESULT
还有DEPENDENT SUBQUERY和UNCACHEABLE SUBQUERY,但不常用。

显示查询使用了何种类型,从好到差依次是:
system > const > eq_ref > ref > range > index > ALL
注:一般来说,需要保证查询至少要达到range级别,最好能达到ref
表示可能应用在这张表中的索引,可能是一个或多个,只要查询涉及到的字段存在索引,该索引就会被列出,但不一定被实际使用。
1、Using where
2、Using filesort()
说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,MySQL中无法利用索引完成的排序称为“文件排序”。
创建索引后:
建立了的deptid和name的索引后,该排序就会使用索引,大幅提升效率。
相比于上面的order by操作,group by操作要在where查询后对其进行分组操作再产生一张新表作为结果,也就是说,where查询的数据被形成了一张中间的临时表用于下面的操作,既然如此,就会发生Using temporary。
如果没有出现using where,则表示索引是用来读取数据而非执行查找动作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/171470.html