mysql索引合并

一、背景

     本篇博客的背景,是在工作中遇到了一次mysql死锁问题,是由于相同sql语句,准备更新不同记录行而引发的问题,看了一下日志,是因为触发了mysql的“索引合并”造成的问题,举个例子就是

update table set A = 'xxx' where B = '1' and C = '1';
update table set A = 'xxx' where B = '2' and C = '1';

  上述两句sql同时想去更新相同table的不同记录行,除了where条件的值不同,其他都一样。

但是B和C拥有不同的索引index_B和index_C。在同时执行这两句话的时候就有可能会触发索引合并(Intersection)

二、死锁日志

2023-02-27 08:59:12 0x7f68b9eca700
*** (1) TRANSACTION:
TRANSACTION 4866906256, ACTIVE 0 sec fetching rows
mysql tables in use 3, locked 3
LOCK WAIT 1830 lock struct(s), heap size 172240, 7 row lock(s), undo log entries 1
MySQL thread id 327807334, OS thread handle 140070362175232, query id 21404780768 10.234.100.74 issa updating
UPDATE NSFOUCS_VULN_REPORT SET SCAN_TIME='2023-02-27 08:59:12.666'  WHERE DEVICE_TYPE='1' AND IS_LAST = '1' AND VULN_ID='QT042023000027'  AND IP_ADDR ='10.233.146.81' AND IS_TEST=0
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2626 page no 807486 n bits 128 index PRIMARY of table `ssa`.`nsfoucs_vuln_report` trx id 4866906256 lock_mode X locks rec but not gap waiting
Record lock, heap no 52 PHYSICAL RECORD: n_fields 62; compact format; info bits 0


*** (2) TRANSACTION:
TRANSACTION 4866906257, ACTIVE 0 sec fetching rows
mysql tables in use 3, locked 3
1802 lock struct(s), heap size 172240, 3 row lock(s)
MySQL thread id 327807522, OS thread handle 140087772620544, query id 21404780782 10.234.100.75 issa updating
UPDATE NSFOUCS_VULN_REPORT SET SCAN_TIME='2023-02-27 08:59:12.669'  WHERE DEVICE_TYPE='1' AND IS_LAST = '1' AND VULN_ID='QT042023000027'  AND IP_ADDR ='10.200.173.179' AND IS_TEST=0
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 2626 page no 807486 n bits 128 index PRIMARY of table `ssa`.`nsfoucs_vuln_report` trx id 4866906257 lock_mode X locks rec but not gap
Record lock, heap no 52 PHYSICAL RECORD: n_fields 62; compact format; info bits 0
 

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2626 page no 765202 n bits 584 index NSFOUCS_VULN_REPORT_DEVICE_QUERY of table `ssa`.`nsfoucs_vuln_report` trx id 4866906257 lock_mode X locks rec but not gap waiting
Record lock, heap no 479 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 1; hex 31; asc 1;;
 1: len 14; hex 5154303432303233303030303237; asc QT042023000027;;
 2: len 8; hex 969c5d8b81d34001; asc   ]   @ ;;

二、索引合并是什么

    索引是什么,就不再赘述了,本篇文章主要是来说一下,MySQL在 5.0版本中引入新特性:索引合并优化(Index merge optimization),当查询中单张表可以使用多个索引时,同时扫描多个索引并将扫描结果进行合并。
通俗解释就是: 一条SQL中使用两个或多个索引,查出来的数据集取交集或并集。

在介绍索引合并过程之前,要先了解一下聚簇索引和非聚簇索引:

聚簇索引:根据主键构建的索引叫做聚簇索引。
非聚簇索引:不是根据主键构建的索引叫做非聚集索引或者二级索引或者辅助索引。

聚簇索引

聚簇索引并不是一种单独的索引类型。而是一种数据存储方式(所用的用户记录都保存在页子节点)也就是所谓的索引即数据,数据即索引。

三、索引合并的类别

     MySQL5.0之前,一个表一次只能使用一个索引,无法同时使用多个索引分别进行条件扫描。但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引(一般是2个)分别进行条件扫描。简单的说,index merge 技术其实就是:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,合并方式分为三种:union, intersection, 以及它们的组合sort_union(先内部intersect然后在外部union);

四、索引合并存在的问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值