You might loss some data by going by that approach, although it depends on how frequent users generate data.... How quickly would you be able to link the newly created table to all other tables?
In my opinion, the best approach is to use mysql inbuilt partitioning system.....
For example:
CREATE TABLE user_data(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
created_at TIMESTAMP NOT NULL)
PARTITION BY RANGE (UNIX_TIME_STAMP(created_at)) (
PARTITION year_2018 VALUE LESS THAN (UNIX_TIME_STAMP('2019-01-01'),
PARTITION year_2017 VALUE LESS THAN (UNIX_TIME_STAMP('2018-01-01'),
PARTITION year_2016 VALUE LESS THAN (UNIX_TIME_STAMP('2018-01-01'),
);
To select data in 2018:
DB:: select ( SELECT * FROM user_data PARTITION (year_2018) );