mysql行锁设计_mysql 并发行锁

version: 5.6.43Using index condition; Using filesort如果排序出现using filesort,排序的字段里如果有值是null, 有可能不会被检索出来

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

show OPEN TABLES where In_use > 0;show full PROCESSLIST;

发送礼物,1对多发送,会涉及到发送方减少金币情况

测试问题:压测500并发,发送方应为不同用户,但压测人员,发送方填写了同一个用户id,并发时发送方会减少金币 mysql innodb进行行锁,造成排列更新,会耗时多正确测试:压测500并发,发送方应该为不同用户id, 不会造成行锁, 才是正确压测

发现问题:针对同一个用户id压测试问题,同时发全麦(8个),for循环进行发8个,用了事务

1, 在for循环之外,开启事务,循环发8次,最后commit(全部成功或全部失败回滚)

2, 在for循环之内,开启事务,每个发送完,就进行commit(一次发一个 事务即结束,循环8次)

情况1:nginx把500并发同时给到php,并提交到mysql(mysql开启2000并发),观察sql,锁sql,但会不断减少,也有不断增加(增加多快,取决于nginx配置php是动态还是静态,静态比较快[几乎瞬时达到],动态需要启php进程的开销) 最后结果会部分成功,部分超时,超时是因为php执行时间到了,但sql语句事务已经交给mysql,会继续执行完成,只是显示结果超时了

情况2:全部超时,很奇怪,观察sql,一直500卡住,等php超时了,才会慢慢减少,为什么for之外开启与for之内差别这么大,后分析,for之内,事务是并不是500个,而且500*8=4000个,每一个都会造成行锁,当一个for循环执行完时, 会释放锁,此时会被其他进程获取锁,那么原来循环执行进行等待,直到再次获取到锁为止,所以500表面卡住,其他是正在执行中,少一个事务 for循环就会补上一个事务,所以看起来一直500个, 最终执行结果,可能php都超时了,因为锁不可能一直一个进程拥有,for 8 次没有执行完,最后导致都超时了,但这期间sql会一直跑的

最后:500 对于mysql并发行锁,也不至于超时,检查是因为代码中执行完后,会有一个刷新缓存操作(行锁不会影响其他查询sql),但刷新缓存有过滤关键字操作,很慢,做判断处理(发礼物不需要过滤),500即使造成行锁顺序执行,也轻松完成 平均每秒40个左右 mysql即使并发写入 也是很快的, 哪怕是有行锁。 如果请求有慢的情况,还是检查一下代码的执行效率,看看慢在了哪 是否可优化

每个InnoDB表都有一个特别的索引叫clustered index(聚集索引)。通常,clustered index和primary key是一个意思。为了在查询、插入以及数据库的其它操作时获得最好的性能,你必须理解InnoDB中是怎样使用clustered index优化大多数查询的。当你在表中定义了一个PRIMARY KEY的时候,InnoDB会把它作为clustered index。在你创建每一张表的时候最好定义一个primary key,如果实在没有一个或者一组逻辑唯一并且非空的列,你就添加一个新的auto-increment(自增长)的列,让它的值自动填充。如果你没有在你的表中定义PRIMARY KEY,那么MySQL将查找第一个所有值非空的唯一索引列作为clustered index。如果表中没有PRIMARY KEY,而且也没有合适的UNIQUE index,那么InnoDB内部将生产一个名字叫GEN_CLUST_INDEX的隐藏clustered index,其值为行IDinnodb会根据primary key(主健索引) 来定位数据,二级索引都会多一个字段来存放primary key,可以方便的回表,速度更快

innodb GEN_CLUST_INDEX 出现这种锁:lock_index:GEN_CLUST_INDEX 代表升级到了表锁,即使更新不是同一行 都会阻塞(查询不影响) 为什么会升级到表锁,是因为innodb行锁是依赖索引来实现的,根据where条件是否有索引,分两种情况

1,更新条件加了普通索引,则使用普通索引+primary key 或者 mysql内部生成的主健索引来加行锁

2,更新条件没有加普通索引(mysql会找主健索引或唯一索引,两个都没有就会使用GEN_CLUST_INDEX[就是使用mysql内部生成的主健索引\也叫聚集索引吧])加锁,并升级到表锁,影响其他行更新 所以在msyql innodb中,最好都建立一个自增的主健https://www.cnblogs.com/cjsblog/p/8447325.htmlhttps://dev.mysql.com/doc/refman/5.7/en/innodb-indexes.html

nginx 内存够 尽量配置 static静态启动php进程,效率会比动态启动快很多(必定不需要php启动的开销,而是在nginx启动时,php进程就启动好了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值