• 线上账务系统余额并发更新问题记录

    Posted by : lon.y@qq.com on 2018年4月25日

    某电商平台,某天线上用户报bug说账户余额信息与交易流水对不上。可以认为是数据库并发更新问题,由此定位出具体原因,并给出解决方案。 问题现象 场景描述 线上账务系统,在定时结算给卖家钱时,且高并发量的情况下,出现提现x元(假设当前用户余额为x元)余额为0后,再转入该账户一笔钱(假设为y元),结果账户余额变为了x+y 元,导致用户余额错误。 ps:账户余额的变更都是在事务中update的 环境说明 mysql5.7 + innodb,事务隔离级别是REPEA

    阅读全文...

  • MySQL 的索引是什么?怎么优化?

    Posted by : lon.y@qq.com on 2018年4月9日

    索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了Explain,用于显示SQL执行的详细信息,可以进行索引的优化。 一、导致SQL执行慢的原因: 1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。 2.没有索引或者索引失效。(一般在互联网公司,DBA会在半夜把表锁了,重新建立

    阅读全文...

  • 优化 MySQL: 3 个简单的小调整

    Posted by : lon.y@qq.com on 2018年2月10日

    我并不期望成为一个专家级的 DBA,但是,在我优化 MySQL 时,我推崇 80/20 原则,明确说就是通过简单的调整一些配置,你可以压榨出高达 80% 的性能提升。尤其是在服务器资源越来越便宜的当下。 警告 没有两个数据库或者应用程序是完全相同的。这里假设我们要调整的数据库是为一个“典型”的 Web 网站服务的,优先考虑的是快速查询、良好的用户体验以及处理大量的流量。 在你对服务器进行优化之前,请做好数据库备份! 1、 使用 InnoDB 存储引擎 如果

    阅读全文...

  • 谈谈 MySQL 隐式类型转换

    Posted by : lon.y@qq.com on 2017年12月15日

    前言 今天我们继续回到MySQL系列文章中,谈一谈MySQL中隐式类型转换。(其实我最早知道是在慢SQL优化中知道隐式类型转换概念的),在说隐式类型转换之前,首先我们通过一个实例来看看是怎么回事。 数据结构 本文中所有的操作,都是基于该数据结构(有兴趣的童鞋,可以实验): create table t_base_user(   oid bigint(20) not null primary key auto_increment,   name varcha

    阅读全文...

  • MySQL 引擎特性:InnoDB崩溃恢复

    Posted by : lon.y@qq.com on 2017年12月14日

    前言 数据库系统与文件系统最大的区别在于数据库能保证操作的原子性,一个操作要么不做要么都做,即使在数据库宕机的情况下,也不会出现操作一半的情况,这个就需要数据库的日志和一套完善的崩溃恢复机制来保证。本文仔细剖析了InnoDB的崩溃恢复流程,代码基于5.6分支。 基础知识 lsn: 可以理解为数据库从创建以来产生的redo日志量,这个值越大,说明数据库的更新越多,也可以理解为更新的时刻。此外,每个数据页上也有一个lsn,表示最后被修改时的lsn,值越大表示越

    阅读全文...

  • MySQL 引擎特性:InnoDB IO 子系统

    Posted by : lon.y@qq.com on 2017年12月14日

    前言 InnoDB做为一款成熟的跨平台数据库引擎,其实现了一套高效易用的IO接口,包括同步异步IO,IO合并等。本文简单介绍一下其内部实现,主要的代码集中在os0file.cc这个文件中。本文的分析默认基于MySQL 5.6,CentOS 6,gcc 4.8,其他版本的信息会另行指出。 基础知识 WAL技术 : 日志先行技术,基本所有的数据库,都使用了这个技术。简单的说,就是需要写数据块的时候,数据库前台线程把对应的日志先写(批量顺序写)到磁盘上,然后就告

    阅读全文...

  • MySQL 引擎特性:InnoDB 同步机制

    Posted by : lon.y@qq.com on 2017年12月13日

    前言 现代操作系统以及硬件基本都支持并发程序,而在并发程序设计中,各个进程或者线程需要对公共变量的访问加以制约,此外,不同的进程或者线程需要协同工作以完成特征的任务,这就需要一套完善的同步机制,在Linux内核中有相应的技术实现,包括原子操作,信号量,互斥锁,自旋锁,读写锁等。InnoDB考虑到效率和监控两方面的原因,实现了一套独有的同步机制,提供给其他模块调用。本文的分析默认基于MySQL 5.6,CentOS 6,gcc 4.8,其他版本的信息会另行指

    阅读全文...

  • MySQL 引擎特性:InnoDB Buffer Pool

    Posted by : lon.y@qq.com on 2017年12月13日

    前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入了这一中间层,数据库对内存的管理变得相对比较复杂。本文主要分析MySQL Buffer Pool的相关技术以及实现原理,源码基于阿里云RDS MySQL 5.6分支,其中部分特性已经开源到AliSQL。Buffer Pool相关的源代码在buf目录下,主要包括

    阅读全文...

  • MySQL 性能调优技巧

    Posted by : lon.y@qq.com on 2017年12月7日

    摘要:针对购物旺季网站流量会对数据库造成的压力,作者给出了MySQL性能调优的一些技巧,这些技巧极具参考价值,通过这些调优,可以有效避免因为流量过大造成服务器宕机,从而给企业造成经济损失。以下是译文 万圣节已经过去很久了,该是把注意力集中在即将到来的假日季节的时候了。首先是感恩节,接着就是黑色星期五和网络星期一,最终在圣诞节/节礼周(从12月26日的节礼日开始,到12月31日的除夕结束为期六天或更长时间。这个词是由零售业在2000年代中期左右发明的,试图延

    阅读全文...

  • 写会 MySQL 索引

    Posted by : lon.y@qq.com on 2017年11月30日

    前言 继上篇《读懂MySQL执行计划》后,在文章末尾,我们谈到了索引的概念,那么,今天我们就一起来聊一聊MySQL索引。   什么是索引? 百度百科是这样描述的: 索引是为来加速对表中数据行中的检索而创建的一种分散的数据结果,时针对表而建立的,它是由数据页面以外的索引页面组成,每个索引页中的行都含有逻辑指针,以便加速检索物理数据 其实,索引的概念大家都很清楚,也知道索引能够提升查询效率,但大部分童鞋在怎么建索引,建在哪些字段上有以下常见误解: 新建表时不需

    阅读全文...