一般地,主从延时是由slave引起的。

slave上有两个线程,IO_THREAD,SQL_THREAD。

IO_THREAD负责连接主库,拉取binlog文件到本地relay.log

SQL_THREAD负责从realy.log读取binlog并执行。

一般地,更有可能是SQL_THREAD造成延时。

如果是IO_THREAD,则可能因为是网络延时,不太可能是因为io性能

如果是SQL_THREAD,则可能执行sql的时候,有些sql太慢而引起的。此时,可以打开慢查询日志来定位问题。

另一个SQL_THREAD造成延时的原因可能是一些表没有主键或者唯一键,因为这样的话,在更新数据的数据可能需要扫描全表,因而变慢。

查询没有主键或者唯一索引的表。

mysql> SELECT t.table_schema,t.table_name,engine
FROM information_schema.tables t INNER JOIN information_schema .columns c
on t.table_schema=c.table_schema and t.table_name=c.table_name
GROUP BY t.table_schema,t.table_name
HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0;

Ref:https://www.percona.com/blog/2014/05/02/how-to-identify-and-cure-mysql-replication-slave-lag/

图注:

read_master_log_pos 代表slave的io thread读取master的binlog的最新位置

exec_master_log_pos代表slave的sql thread执行master的binlog(其实是io thread写入的relay log)的最新位置。

index_files/69513280.png

Untitled