欢迎光临散文网 会员登陆 & 注册

Mysql调优系列视频【索引】【索引优化】【SQL优化】

2023-07-26 07:35 作者:我爱罗文_  | 我要投稿

mysql的优化大纲:

数据结构算法: 二叉树---->平衡二叉树(红黑树)---->B树(平衡多路查找树)---->B+树(B树的进阶),也就是mysql的底层数据结构

二叉树: 每个节点最多有两个子节,并遵循左边小于右边,数据随机性情况树杈越明显,缺点:随着数据的增多,树的结果会越高,数据查询的效率会变慢,如果数据是按顺序来排序依次进入的话,树的高度则会更明显

红黑树:虽通过自旋平衡,子节点自动分为2个,从而减少树的高度,当数据有序时,更明显,检索结果更佳,数据量越大树也会越高

b-tree:b-tree的出现,可以解决树的高度的问题,他不在限制一个父节点中只有两个子节点,而是允许M个子节点(M>2)。不仅如此,B树的一个节点可以存储多个元素,相交于二叉树的结构又将整体的树高度降低了

B+tree:b+tree是b树的一种升级优化,更适合做存储索引结构,在B+tree中,非叶子节点上仅存储key,不存储数据,所有的数据均存储在叶子的节点上面,并且是按照顺序来排序的,此外在B+tree中·各个数据页之间是双向链表连接的,叶子节点中的数据是单向链表连接的。


聚集索引和非聚集索引的区别?

按物理存储分类:innerdb属于聚集索引,mysisam属于非聚集索引

聚集索引:它的子叶同时存储索引和数据

非聚集索引:它的子叶只存储索引和指针,需要通过指针来查找具体的数据

效率:聚集索引更快


二级索引:所有非主键索引都称为二级索引,并且二级索引为非聚集索引,查找数据需要进行回表


覆盖索引: 需要查询的字段都在索列中的情况称为覆盖索引,索引列覆盖了查询字段的意思


索引下推:是mysql5.6之后针对扫描二级索引的一项改进,用来在范围查询是减少回表的次数,将需要回表的查询一次性完成


单列索引:只有一个索引字段(name)


联合索引:多个索引字段(name,age,heigt),联合索引需要遵循最左前缀原则,因为没有第一列的话,直接访问第二列,那么第二列肯定是无序的,直接访问后面的列就用不到索引了


单向索引和联合索引分别在什么场景创建,优势是什么?

联合索引的优势:

1.减少开销:

建立一个联合索引,实际上相当于创建了多个索引((a), (a,b), (a,b,c)),每单独建一个索引,都会增加写操作的开销和磁盘的开销,对于大量的数据,使用联合查询会大大减少开销

2.覆盖索引:

select a,b,c from table where a ='xx' and b='xxx'

那么mysql可以直接遍历索引取得数据,而无需回表,减少了很多的io操作,减少io操作,特别是随机io是dba主要的优化机制

3.效率高:

索引列多,通过联合索引筛选出的数据越少,比如有100万条的数据表,有如下sql:

select col1,col2,col3 from table where col1='1' and colw='2' and col2='3'

如果是单列的话需要查找三次


索引的优点:

1.提高检索效率

2.降低排序成本,索引对应的字段已经有一个自动排序·功能的,默认是升序asc


索引的缺点:

1.创建索引和维护索引需要耗费时间,这种时间会随着数据增加而增加

2.索引需要占用无聊空间,数据量越大,占用越多

3.会降低表增删改的效率,因为每次增删改索引,都需要进行动态维护


sql以及索引优化:

1.创建索引减少扫描量·

2.调整索引减少计算量

3.索引覆盖(减少不必访问的列,避免回表查询)

4.干预执行计划

5.sql改写


如果索引失效,需要排查:

手动添加索引:force index(idx_name_age_position)

1.遵循最左前缀原则

2.不在索引列上做任何操作(计算,函数,(自动or手动), 类型转换),会导致索引失效而造成全表扫描

3.索引引擎不能使用索引中范围条件中右边的列,范围查询会使得字段无序,造成部分索引失效

4.尽量使用覆盖索引(只访问索引的查询(索引列包含列),减少select * 语句,覆盖索引不写*

5.不等空值还有or,索引失效要少用

6.like百分写在最右

7.字符串不加单引号索引会失效

8.范围查询优化


trace工具用法:(跟踪查询过程和结果)

第一阶段:sql准备阶段,格式化sql

第二阶段:sql优化阶段

第三阶段:预估表的访问成本 -->对全表扫描情况行数,查询成本,再查询索引的成本,再根据估值分决定用索引还是全盘扫描



sql最佳实践:

1.避免使用select *: 

1).会增加查询解析器的成本

2).不走覆盖索引会产生大量的回表查询

3).浪费cpu和内存资源


2.小表驱动大表:

用数据量少的表用索引和条件大表进行数据筛选,从而减少数据计算量,提高查询效率


3.用连接查询代替子查询:

1).子查询需要执行两次数据库查询,一次是外部,一次是嵌套子查询。因此,使用连接查询可以减少数据库查询的次数,提高查询的效率

2).连接查询可以更好的利用数据库索引,提高查询性能。子查询通常会使用临时表或内存表,而连接查询可以直接利用表上的索引。这意味着连接查询可以更快的访问表中的数据,减少查询的资源消耗

3).对于大型数据集,使用连接查询通常比使用子查询更高效,子查询通常需要扫描整个表,而连接查询可以利用索引加速读取操作




Mysql调优系列视频【索引】【索引优化】【SQL优化】的评论 (共 条)

分享到微博请遵守国家法律