ALOVN

志当存高远

Golang通过修改源码编译的方式获取goroutine id

Golang source compile and get goroutine id

这篇文章主要介绍如何编译Go的源码,学习后可以自己为Go添加一些定制化的功能,或许也可以为Go贡献自己的代码(仅仅会编译是不够的,还必须深入理解Go的运行机制和源码实现)。这里将通过修改Go的源码添加一个获取Goroutine编号的函数为例,介绍如何编译。 一般编程语言中都有线程,通过给线程分配编号,我们可以记录与某线程有关的数据,比如Java中的ThreadLocal。Golang没有提...

MySQL中的InnoDB行锁

MySQL InnoDB Record lock、Gap Lock and Next-Key Lock

MySQL中InnoDB存储引擎在默认隔离级别(Repeatable Read,可重复读)下有三种行锁的算法: Record Lock: 单个行记录上的锁,记录锁(也称行锁) Gap Lock: 间隙锁,锁定一个范围,但不包含记录本身 Next-Key Lock: Gap Lock+Record Lock,锁定一个范围,并且所对应记录本身 记录锁很好理解。关于间隙锁,可以...

MySQL的自增长列(auto-increment)实现机制

MySQL auto-increment

自增长是MySQL中常用的一个属性。在InnoDB存储引擎的内存中,对每隔含有自增长列的表都有一个自增长计数器。对有自增长的表进行插入时,会对这个计数器进行初始化,执行下面的语句得到计数器的值: 1 select max(auto_increment_col) from t for update; 插入操作会根据这个自增长的计数器加1赋值给自增长列。这种自增长方式称为AUTO-INC ...

如何在一台机器上安装多个版本的Go

how to install multiple versions of Go on the same machine

有时候需要将代码在不同go版本下测试,为了方便,这时候就需要在同一机器上安装多个版本的go。之前有文章里有介绍过在MacOS下如何使用brew安装多个版本的go,但是这并不适用与linux、windows平台。 今天看Golang官方文档发现一个更通用、方便的方法。 安装多个版本的go其实很简单,只需要使用 go install 命令就可以了。 1 2 $ go install gol...

MySQL中哪些字段应该加索引

which fields should be add index in MySQL

高选择性 MySQL中并不是所有查询条件中出现的列都需要添加索引,对于什么时候添加B+树索引,一般的经验是:在访问表中某列有很少一部分值时使用B+树索引才有意义,最好是象主键一样取值范围很广,几乎没有重复值,属于高选择性。 对于像性别字段、地区等字段,它们的取值范围很小,称为地选择性,比如按性别进行查询时,可取值范围一般只有F、M。假如男女比例均衡的话,当我们进行下面查询时: 1 se...

MySQL之Online DDL

MySQL Online DDL

MySQL5.5版本之前存在的一个普遍被人诟病的问题,我们先看下MySQL对于索引的添加或者删除的这类DDL操作过程: 首先创建一个新的临时表(alter table后新定义的表结构) 把原表中的数据导入到临时表 删除原表 把临时表重命名为原来的表名 若对一张大表进行索引添加或删除,这需要很长的时间,MySQL数据库会发生阻塞。这意味着数据库服务将长时间不可用,对My...

MySQL之分区表

MySQL partition

MySQL的分区功能并不是在存储引擎层完成的,因此不是只有InnoDB存储引擎支持分区,MyISAM、NDB等也都支持。但也并不是所有的存储引擎都支持,如CSV就不支持。 MySQL数据库支持的分区类型是水平分区,并不支持垂直分区。此外MySQL数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引。 有些人有这样一个误区:只要启用了分区,数据库就会运行的更快。这个结论不一定对的...

MySQL的二进制日志(binlog)

MySQL binary log

简介 MySQL的二进制日志(binary log)记录了对数据库执行更改的所有操作,但是不包括SELECT和SHOW这些查询的操作,因为它们没有对数据本身修改。若执行更新的SQL并没有使数据产生变化,那么这个执行更新的SQL也会被写入二进制日志。例如: 1 2 mysql> update t_user set age=18 where user_id=1; # 原本age=18,...

MySQL的慢查询日志

MySQL slow query log

慢查询日志可以帮助DBA定位存在问题的SQL语句,从而进行SQL语句层面的优化。MySQL通过设置一个阈值,将运行时间超出这个值的所有SQL语句都记录到慢查询日志中。运维可以通过filebeat等工具将日志抽取到Elastic Search中并通过Kibana查看(ELK或EFK)。这需要开发人员或DBA每天或每隔一段时间进行检查并优化。 启用慢查询日志 MySQL中可以通过参数 lon...

汇编指令中lea与mov的区别

The difference between lea and mov in Assembly

lea lea是 “load effective address” 的缩写,它只计算地址,不会把内存中的值移动到目的寄存器。简单来说,lea指令可以用来将一个内存地址直接赋给目的操作数,例如:lea eax,[ebx+8]就是将ebx+8这个值直接赋给eax寄存器,而不是把ebx+8处的内存地址里的数据赋给eax寄存器。 mov mov指令与lea恰恰相反,例如:mov eax,[eb...