索引的概述和性能分析

发布时间:2024年01月20日

索引index,是一种有序的数据结构,可以高效的获取数据,在数据库中维护着满足查找特定算法的数据结构,就是索引

无索引的情况,查询数据时会全表扫描,效率极低

索引结构

(1)二叉树,查询性能还行,但当数据顺序插入时,就会形成链表,数据量大时,层级就深,查询效率慢

(2)红黑树,是普通二叉树优化,但本质仍是二叉树,不适合大数据情况

(3)BTree,即多路平衡查找树,该树一个节点下可以挂多个节点,以一个5阶的树,他的每个节点底下可以挂5个子节点,每个节点最多存储4个key,5个指针。节点中超过了4个key,就会向上分裂。

(4)B+Tree,以4阶的树为例,所有的元素都会出现在叶子节点,上面的节点不存放数据,且叶子节点形成了单项链表、

在mysql中的B+Tree中,对普通的树进行了优化,即叶子节点形成的不再是单向链表,而是双向链表

(5)Hash用一定的hash算法,算出对应的hash值,映射到对应的位置上,然后存储在hash表中

多个key计算的hash值有可能重复,可以通过链表来解决(类似HashMap)

Hash只能用于对等比较,不能范围查询,也不能排序,因为查询结果无序,但查询效率高,通常只需要查询一次,有时候遇到hash碰撞要多查询

索引的分类

(1)主键索引PRIMARY

(2)唯一索引UNIQUE

(3)常规索引

(4)全文索引FULLTEXT

innoDB中,索引按存储形式又分为聚集索引和二级索引

聚集索引就是叶子节点下挂的是这一行的行数据,而二级索引的叶子节点下挂的是表的主键,还要通过主键再次索引

如果表有主键,主键索引就是聚集索引

不存在主键,将使用第一个unique索引作为聚集索引

上述都不存在,则会自动生成一个rowid作为聚集索引

索引的语法

(1)查看对应表的索引 show index from 表名;

(2)创建索引 create [ PRIMARY/UNIQUE/FULLTEXT] index 索引名 on 表名;

索引名一般这样取:idx_

--------------------------

索引性能优化

性能的优化主要是优化查询语句,所以怎么才能知道什么表中的查询较多呢?

(1)根据show [session / global] status like 'Com__9_____';可以访问CRUD的访问频次

(2)查看慢查询日志

所有执行时间超过参数long_query_time的查询都会被记录在慢查询日志,默认下慢查询日志未开启

(3)profile

数据库支持profile的话可以使用,可以使用select @@have_profiling查看是否支持

profiling默认为关闭,需要set profiling = 1打开开关

show proflies能够帮我们查看sql优化中,时间都花在了哪里

(4)explain执行计划

前三种方法都只是在时间上判断sql语句性能,而explain或desc可以获取如何执行select的信息,包括在执行中表如何连接,和连接的顺序情况

explain执行计划中,各个字段的含义:

id:select查询的序列号,表示查询中执行select字句或是操作表的顺序,当id相同时,执行顺序从上到下,id不同,则id越大,越先执行。

select_type:表示select的类型,一般有primary(主查询,即外层查询),simple(不使用表连接或子查询),union(union中的第二个或之后的查询语句),subquery(子查询)

type:表示连接类型,性能由好到差的连接类型为:null(不使用任何表),system(访问了系统表),const(使用主键或唯一索引访问),eq_ref,ref(使用非唯一索引),range(范围查询),index,all,优化sql时尽量往前优化。

possible_keys:可能应用到这张表上的索引

keys:实际使用的索引,无则为null

key_len:索引使用的字节数,一般来说长度越短越好

rows:mysql认为必须要执行查询的行数,是一个估计值

filtered:返回结果的行数占需读取行数的百分比,越大越好

extra:额外展示的信息

文章来源:https://blog.csdn.net/m0_69050443/article/details/135150198
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。