Chen Jian's Java Blog 

Date types for createdAt and updatedAt in MySQL

by Chen Jian


Posted on 2018-11-19 12:00 in Database


If you really want them work well, : 1. Make sure your mysql's version is 5.6.5+ 2. The two columns exact data types must be createdAt timestamp not null DEFAULT CURRENT_TIMESTAMP, updatedAt timestamp null DEFAULT NULL ON UPDATE...


InnoDB foreign key constraint columns are automatically indexed

by Chen Jian


Posted on 2016-03-13 12:00 in Database


So you don't have to create an index manually on the foreign key columns.   


Don't enforce foreign key constraints

by Chen Jian


Posted on 2016-01-08 12:00 in Database


There are many situations that multi-table data consistency can limit your work.  For example, unit tests on single table , batch data migration  and so on. 


mysql的安装路径

by Chen Jian


Posted on 2015-06-26 12:00 in Database


1. mac + dmg方式: /usr/local/mysql


innodb: 两个事务在binlog文件中不会交叉

by Chen Jian


Posted on 2015-01-17 12:00 in Database


在innodb的binlog文件中,如果一个事务从第m行开始,在第n行结束;那么从m到n之间只会记录本事务的操作,不会记录其他事务的行为。 这是因为innodb中binary log entries总是以事务为单位整体写入文件的。 引用 Within an uncommitted transaction, all updates (UPDATE, DELETE, or INSERT) that change transactional tables such as BDB or...


对InnoDb执行mysqldump时应该加上 --single-transaction参数

by Chen Jian


Posted on 2015-01-17 12:00 in Database


mysqldump默认情况下并不保证数据一致性。 在innodb中,可以这样: mysqldump --single-transaction mydb > mydb-backup.sql 如果有 --single-transaction参数,mysqldump会将整个数据的读取过程置于一个满足repeatable read的事务中,最后导出的数据也是相互一致的。 由于innodb的mvcc特性,使用 --single-transaction执行mysqldump,...


MySQL两种备份模式:Logical Backup 和 Raw Backup

by Chen Jian


Posted on 2015-01-17 12:00 in Database


Logical Backup 就是用诸如mysqldump这样的工具把数据导出为可视的sql文件或csv文件 。 Raw Backup 则是指直接备份数据库的数据文件 。 Raw Backup执行起来比Logical Backup快的多,因为它不需要消耗CPU/内存把数据变成sql或csv(顺便说一下,变csv比变sql要快很多)。 但Raw Backup有一个缺点:Raw File的跨平台能力比较弱。 一个windows下的文件在linux下可能就用不了,一个从mysql...


备份MySQL数据时最好从备库中备份

by Chen Jian


Posted on 2015-01-17 12:00 in Database


数据备份对数据库本身有cpu压力;如果为了追求一致性,可能还要施加锁表操作,影响一定的可用性。数据量越大,这些代价就越高。 可以专门设置一个备库,然后从这个备库中把数据和binlog备份出来。


innodb的binlog跟redo/undo log无关

by Chen Jian


Posted on 2015-01-13 12:00 in Database


mysql, 不管用的是不是innodb, 都有binlog. 这个binary log跟transaction没关系,它主要用于replication和backup. log文件会一直递增,不会循环使用(后面的记录不会覆盖前面的) 同时,innodb还有redo log/undo log. 它们用于transaction, 且会循环使用。


innodb中应该尽量把多条语句放在单个事务中执行

by Chen Jian


Posted on 2015-01-13 12:00 in Database


默认情况下, 一个写操作就是一次事务 。  如果一次业务操作包含三次DB写操作,三个写操作就是三个事务,三个事务导致三次log flush(磁盘读写,代价较高): 引用 InnoDB must flush the log to disk at each transaction commit if that transaction made modifications to the database. 所以应该把这三次DB写操作合在一个事务里,这...


MySQL Replication的基本架构

by Chen Jian


Posted on 2015-01-10 12:00 in Database


摘自High Performance MySQL 复制过程的核心是binlog 拓扑方面: 1. 一主一备最常见,可满足典型的读写分离需求 2. 一主多备也可以,但要注意备机太多可能导致主机负担过大。有个办法是主机只挂一个特殊的备机,其他备机再从这个特殊备机中同步数据(即把特殊备机当作主机),把主机的同步负担转移到特殊备机上。这个策略叫distribution master 3. 你可能会想用主主双活(Master-Master in...


mysql: my.cnf在哪里?

by Chen Jian


Posted on 2014-12-25 12:00 in Database


先找到mysqld的执行文件 引用 #ps aux|grep mysqld 如:  /usr/libexec/mysqld 运行一下这个程序的help命令,根据输出中的"Default options"关键字找到my.cnf的位置 引用 #sudo /usr/libexec/mysqld --verbose --help |grep -A1 "Default options" 如:...


注意Prepared Statement执行时会比普通statement多一次连接

by Chen Jian


Posted on 2014-12-22 12:00 in Database


使用Prepared Statement时,你要先输入那种带问号的语句,让数据库服务端生成一个Prepared Statement句柄传给你;你再拿着这个句柄,输入参数让数据库去执行n次sql。 也就是说,这里客户端与服务端的交互(round trip)发生了1 + n次。1 = 生成prep stmt, n = 执行sql. 典型的OLTP应用在大部分情况下,都不会循环执行sql,也就是说 n=1.也就是说,如果不使用prep stmt, 一次数据库交互需要1个round trip;...


MySQL触发器的适用场景和约束

by Chen Jian


Posted on 2014-12-22 12:00 in Database


最适合的场景可能是:冗余设计中的数据联动,以及summary table这种。 这两类逻辑用触发器来搞定会比用上层代码搞定要简洁的多。 性能方面没有问题,在InnoDB中,它还可以保证原子性。 不过, 1. 这类逻辑比较隐蔽,容易被忽略,埋坑。 2. 调试难,如果没有全局梳理,一不小心可能导致死锁。 3. 一旦要分表分库,可能处理起来会比在上层应用中处理更棘手。


MySQL query cache出现负面作用的情形

by Chen Jian


Posted on 2014-12-22 12:00 in Database


1. 写语句特别频繁的场景不适合使用query cache,  因为query cache会被不停地失效,导致cache miss, 使用query cache纯粹是浪费性能。因为query cache本身也有使用代价,执行语句前它要先查一下cache中有没有,如果没有,从表中查到值之后还要更新一下cache 2. query cache累积过多可能出问题。当表中数据修改时,所有相关的cache都要失效;在失效过程中,要访问cache的查询都会被阻塞(即使跟这张表没关系);如果cache很多,最...