我们知道,根据MySQL的锁机制,写锁和读锁是冲突的,所以MySQl通过MVCC(多版本并发控制)方式来处理读写冲突,提高数据库高并发场景下的吞吐性能最早的数据库系统,只有读读之间可以并发,读写、写读、写写都要阻塞。引入MVCC后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,InnoDB通过undo log保存每条数据的多个版本,并且能够找回数据的历史版本提供给用户读,每个事务读到的数据版本可能是不一样的更新丢失( Lost Update ):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就
因为驱动结果集越大,意味着需要循环的次数越多,也就是说在被驱动结果集上面所 需要执行的查询检索次数会越多。比如,当两个表(表 A 和 表 B) Join 的时候,如果表 A 通过 WHERE 条件过滤后有 10 条记录,而表 B 有 20 条记录。如果我们选择表 A 作为驱动表,也就是被驱动表的结果集为 20,那么我们通过 Join 条件对被驱动表(表 B)的比较过滤就会有 10 次。反之,如果我们选择表 B 作为驱动表,则需要有 20 次对表 A 的比较过滤。小贴士1:驱动表的定义:当进行多表连接查询时,1.指定了联接条件时,满足查询条件的记录行数少的表为驱动表,2.未指定联接条件时,行数少
石头同学是某大公司高级开发工程师,某日收到不少错误告警信息,于是便去开始排查。跟踪日志发现是某个服务抛出的异常信息,奇怪的是这个服务上线也有一段时间了。之前很少看到类似的错误信息,最近偶尔多了起来。后来才定位到是因为服务调用了某外部接口,发现对方对参数长度做了限制,如果输入参数超过 1000 bytes,就直接抛异常,代码类似如下:心想,这还不简单,咱们的 result 也不是什么关键性的东西,你有限制,我直接 trim 一下不就行了?于是三下五除二,给搞了个 trim 方法,支持传不同参数按需 trim,代码如下:再在需要调用外部服务的地方,先调用这个 trimAsByte 方法,一顿操作连
ArrayList实现了List接口,继承了AbstractList抽象类,底层是数组实现的,并且实现了自增扩容数组大小。ArrayList还实现了Cloneable接口和Serializable接口,所以他可以实现克隆和序列化。ArrayList还实现了RandomAccess接口,这个接口是一个标志接口,他标志着“只要实现该接口的List类,都能实现快速随机访问”。基本属性ArrayList属性主要由数组长度size、对象数组elementData、初始化容量default_capacity等组成, 其中初始化容量默认大小为10。//默认初始化容量private static final
SQL优化此优化方案指的是通过优化 SQL 语句以及索引来提高 MySQL 数据库的运行效率,具体内容如下:分页优化例如:select * from table where type = 2 and level = 9 order by id asc limit 190289,10;复制代码优化方案:延迟关联先通过where条件提取出主键,在将该表与原数据表关联,通过主键id提取数据行,而不是通过原来的二级索引提取数据行例如:select a.* from table a, (select id from table where type = 2 and level在 MySQL 5.0 之前
前言在工作中一次排查慢接口时,查到了一个函数耗时较长,最终定位到是通过 List 去重导致的。由于测试环境还有线上早期数据较少,这个接口的性能问题没有引起较大关注,后面频繁超时,才引起重视。之前看《阿里巴巴Java开发手册》里面有这样一段描述:你看,阿里前辈们都免费总结了,不过还是会看到有人会用List的contains函数来去重......不记得的,罚抄10万遍如果需要这本书资源的网上下载也行,私聊我发你也行今天我就结合源码聊聊Set是怎样保证数据的唯一性的,为什么两种去重方式性能差距这么大HashSet源码底层实现基于 HashMap,所以迭代时不能保证按照插入顺序,或者其它顺序进行迭代