我來說一下資料寫入的跟進過程,可以在資料庫test中建立一張表test_data
create table test_data(id int primary key,name varchar(30)) engine=innodb;
我們寫入一條資料:
mysql> insert into test_data values(1,"aa");
Query OK, 1 row affected (0.00 sec)
檢視資料字典informationschema.tables的欄位update_time可以看到發生了變化。
mysql> select * from information_schema.tables where table_schema="test" and table_name="test_data"\G
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: test_data
TABLE_TYPE: BASE TABLE
ENGINE: InnoDB
VERSION: 10
ROW_FORMAT: Dynamic
TABLE_ROWS: 1
AVG_ROW_LENGTH: 16384
DATA_LENGTH: 16384
MAX_DATA_LENGTH: 0
INDEX_LENGTH: 0
DATA_FREE: 0
AUTO_INCREMENT: NULL
CREATE_TIME: 2019-10-08 12:29:05
UPDATE_TIME: 2019-10-08 12:29:40
CHECK_TIME: NULL
TABLE_COLLATION: utf8_general_ci
CHECKSUM: NULL
CREATE_OPTIONS:
TABLE_COMMENT:
1 row in set (0.00 sec)
如果繼續寫入一條資料:
mysql> insert into test_data values(2,"bb");
檢視字典裡的資料,就會發現時間戳開始變化(遞增),當然你可以在寫入前記錄下時間戳。
TABLE_ROWS: 2
AVG_ROW_LENGTH: 8192
UPDATE_TIME: 2019-10-08 12:29:58
所以你的問題可以轉換一個思路來實現,即一段時間內沒有變化的表,可以透過information_schema.tables的欄位來進行查詢,這樣就可以得到資料庫裡的熱表和冷表了。
比如檢視2019-10-08之前沒有DML資料變化的表,可以使用如下的SQL:
select table_name,update_time from information_schema.tables where update_time <="2019-10-08" ;
| xxxx1 | 2019-09-02 23:49:42 |
| xxxx2 | 2019-09-03 23:45:21 |
| xxxx3 | 2019-09-04 23:59:31 |
| xxxx4 | 2019-09-05 23:41:25 |
| xxxx5 | 2019-09-06 21:44:40 |
| xxxx6 | 2019-09-07 23:46:17 |
+-------------------------+---------------------+
1019 rows in set (1.66 sec)
補充下,資料庫版本建議是在MySQL 5.7+
我來說一下資料寫入的跟進過程,可以在資料庫test中建立一張表test_data
create table test_data(id int primary key,name varchar(30)) engine=innodb;
我們寫入一條資料:
mysql> insert into test_data values(1,"aa");
Query OK, 1 row affected (0.00 sec)
檢視資料字典informationschema.tables的欄位update_time可以看到發生了變化。
mysql> select * from information_schema.tables where table_schema="test" and table_name="test_data"\G
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: test_data
TABLE_TYPE: BASE TABLE
ENGINE: InnoDB
VERSION: 10
ROW_FORMAT: Dynamic
TABLE_ROWS: 1
AVG_ROW_LENGTH: 16384
DATA_LENGTH: 16384
MAX_DATA_LENGTH: 0
INDEX_LENGTH: 0
DATA_FREE: 0
AUTO_INCREMENT: NULL
CREATE_TIME: 2019-10-08 12:29:05
UPDATE_TIME: 2019-10-08 12:29:40
CHECK_TIME: NULL
TABLE_COLLATION: utf8_general_ci
CHECKSUM: NULL
CREATE_OPTIONS:
TABLE_COMMENT:
1 row in set (0.00 sec)
如果繼續寫入一條資料:
mysql> insert into test_data values(2,"bb");
Query OK, 1 row affected (0.00 sec)
檢視字典裡的資料,就會發現時間戳開始變化(遞增),當然你可以在寫入前記錄下時間戳。
mysql> select * from information_schema.tables where table_schema="test" and table_name="test_data"\G
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: test_data
TABLE_TYPE: BASE TABLE
ENGINE: InnoDB
VERSION: 10
ROW_FORMAT: Dynamic
TABLE_ROWS: 2
AVG_ROW_LENGTH: 8192
DATA_LENGTH: 16384
MAX_DATA_LENGTH: 0
INDEX_LENGTH: 0
DATA_FREE: 0
AUTO_INCREMENT: NULL
CREATE_TIME: 2019-10-08 12:29:05
UPDATE_TIME: 2019-10-08 12:29:58
CHECK_TIME: NULL
TABLE_COLLATION: utf8_general_ci
CHECKSUM: NULL
CREATE_OPTIONS:
TABLE_COMMENT:
1 row in set (0.00 sec)
所以你的問題可以轉換一個思路來實現,即一段時間內沒有變化的表,可以透過information_schema.tables的欄位來進行查詢,這樣就可以得到資料庫裡的熱表和冷表了。
比如檢視2019-10-08之前沒有DML資料變化的表,可以使用如下的SQL:
select table_name,update_time from information_schema.tables where update_time <="2019-10-08" ;
| xxxx1 | 2019-09-02 23:49:42 |
| xxxx2 | 2019-09-03 23:45:21 |
| xxxx3 | 2019-09-04 23:59:31 |
| xxxx4 | 2019-09-05 23:41:25 |
| xxxx5 | 2019-09-06 21:44:40 |
| xxxx6 | 2019-09-07 23:46:17 |
+-------------------------+---------------------+
1019 rows in set (1.66 sec)
補充下,資料庫版本建議是在MySQL 5.7+