当前位置: 首页 > 后端技术 > Java

Mysql索引基础

时间:2023-04-01 18:18:26 Java

在日常工作中,当查询数据比较慢的时候,通常是因为数据量大,没有使用到索引。索引就像一本书的目录。如果没有目录,需要一页一页地写。查询,效率很慢。有了目录,可以快速查找资料。索引的三种常见模型:哈希表、排序数组、二叉搜索树,哈希表是一种按key-value存储数据的结构,通过key直接找到对应的vale。哈希表只适用于等价查询场景,对于范围搜索无效。排序数组支持等价查询和范围查询。在排序数组中,使用二分查找,查询的时间复杂度为O(logn)。从查询效率来说,有序数组确实是一个不错的选择。但是在添加或删除数据时,为了保证数组的顺序,中间插入的数据需要将数组移到数组后面,内存分配是一个非常耗时的过程。二叉搜索树也称为二叉搜索树。它的特殊性在于节点左子树上的所有值都小于右子树上的所有值,索引值可以有序的存储在二叉树上,如图如下图所示。查询的速度就是树的高度。节点的每一次访问都对应着磁盘的IO操作。对于同样的数据,为了加快查询速度,需要降低树的高度。要降低树的高度,就要将二叉树转化为N叉树。这里的N与mysql查询的页大小有关。B+树结构b+树的查找过程如图所示。B+树是一棵N叉树,每个节点都有一个索引和一个指针。如果要查找数据项28。首先,磁盘块1将被加载到内存中。此时发生IO,在内存中使用二分查找,确定28在17到35之间找到磁盘1中的P2指针,加载磁盘1的P2指针指向的磁盘3toMemory,第二次IO28在26和30之间,找到disk3的P2指针指向disk8,将disk8加载到内存中,第三次IO发生,在内存中二分查找找到28,atotalofthreeIO是真实的情况,一个三层的b+树可以表示百万条数据。如果百万数据只需要三个IO,性能会有很大的提升。没有索引,查询每条数据需要一次IO。查询效率很低。通过分析我们可以知道,IO的数量取决于b+树的高度。当数据一定时,每个圆盘的数量越大,树的高度就越小。磁盘的大小就是一个数据页的大小,是固定的。如果数据项占用的空间越小,数据项越多,树的高度就越低,所以在选择索引字段时,应该越小越好。比如4字节的int比8字节的bigint少一半。B+树和B树的区别b树的节点存放数据,b+树的节点不存放数据,只存放索引,叶子节点存放数据。b+树的叶子节点是用一个链表串联起来的,而b树不是。创建索引的几个原则最左匹配原则,mysql会一直往右匹配,直到遇到范围查询(>,<,between,like)停止匹配,比如a=1andb=2andc>3andd=4,如果按照(a,b,c,d)的顺序创建索引,d将不会使用该索引。如果可以使用(a,b,d,c)的索引,则可以任意调整a,b,d的顺序。=和in可以乱序,比如a=1andb=2andc=3。索引(a,b,c)可以任意顺序建立。mysql查询优化器会对查询索引进行优化,尽量选择区分度高的列作为索引。判别度是指字段的非重复比例。比率越大,扫描的记录越少。uniquekey的区分度为1,在某些状态下,面对大量数据,性别区分度为0。索引不能参与计算,保持列干净,不能给索引列添加函数或操作。因为b+树存储的是数据表的数据,计算出来的数据不能和b+树上的数据进行对比,会导致索引失效。尽量扩展索引,不要新建索引。比如表中本来有a的索引,现在需要增加b的索引,可以将原来的索引扩展成(a,b)的索引。因为没有建索引,所以需要创建b+树。参考美团-MySQL索引原理与慢查询优化深入浅出索引(上)如果觉得文章对您有帮助,请点个赞!