在MySQL中构建日志记录应用程序数据的最佳方法是什么
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在MySQL中构建日志记录应用程序数据的最佳方法是什么,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3783字,纯文字阅读大概需要6分钟。
内容图文
我可能会过度思考这个但是:
我有一个API;我想记录调用API以进行统计/调试.理想情况下,读取速度应该快,但不是必需的(主要是由我阅读).但是,写入速度应该很好,因为我不想放慢API的速度.
我们将从头开始,但API(和日志记录)将持续数年.数据越老,它就越不实用.在某些时候,我们可能希望完全删除旧数据(例如,删除超过三年的数据).
目前正在运行MySql 5.5.
结构表的最佳方法是什么?按年划分,只是弥补未来分区的负担?
PARTITION BY RANGE( YEAR(date) ) (
PARTITION p0 VALUES LESS THAN (2016),
PARTITION p1 VALUES LESS THAN (2017),
PARTITION p2 VALUES LESS THAN (2018),
PARTITION p3 VALUES LESS THAN (2019),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
或者有没有办法创建自动滚动分区?
或者我只是对年份进行索引?
解决方法:
就在这里.我会将分区名称更改为更有意义的名称.
假设表在mydb数据库中看起来像这样:
CREATE TABLE mytable
(
id INT NOT NULL AUTO_INCREMENT,
date DATETIME,
PRIMARY KEY (id,date),
KEY (date)
)
PARTITION BY RANGE( YEAR(date) ) (
PARTITION p2015 VALUES LESS THAN (2016),
PARTITION p2016 VALUES LESS THAN (2017),
PARTITION p2017 VALUES LESS THAN (2018),
PARTITION p2018 VALUES LESS THAN (2019),
PARTITION p9999 VALUES LESS THAN MAXVALUE
);
添加2019年的分区
ALTER TABLE mytable DROP PARTITION p9999;
ALTER TABLE mytable ADD PARTITION
(PARTITION p2019 VALUES LESS THAN (2020)),
(PARTITION p9999 VALUES LESS THAN MAXVALUE)
;
删除最旧的分区
ALTER TABLE mytable DROP PARTITION p2016;
想要存储过程以执行以下操作吗?
>在今年之前删除分区
>在未来4年内添加新分区
这是代码
DELIMITER $$
DROP PROCEDURE IF EXISTS `mydb`.`sp_mytable_Rotate` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `mydb`.`sp_mytable_Rotate` ()
This_Stored_Procedure:BEGIN
SET @year0 = YEAR(NOW());
SET @year4 = @year0 + 4;
SET @year5 = @year0 + 5;
SET @OldPartitionToKeep = CONCAT('p',@year0);
SET @NewPartitionToMake = CONCAT('p',@year4);
SELECT COUNT(1) INTO @zapcount FROM information_schema.partitions
WHERE table_schema = DATABASE() AND table_name = 'mytable'
AND partition_name < @OldPartitionToKeep;
IF @zapcount = 0 THEN LEAVE This_Stored_Procedure; END IF;
SELECT GROUP_CONCAT(partition_name) INTO @partitions_to_drop
FROM information_schema.partitions WHERE table_schema = DATABASE()
AND table_name = 'mytable' AND partition_name < @OldPartitionToKeep;
SET @partitions_to_drop= CONCAT(@partitions_to_drop,',p9999');
SET @sql = CONCAT('ALTER TABLE mytable DROP PARTITION ',@partitions_to_drop);
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
SET @sql = 'ALTER TABLE mytable ADD PARTITION ';
SET @sql = CONCAT(@sql,'(PARTITION ',@NewPartitionToMake,' VALUES LESS THAN (',@year5,'))');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
SET @sql = 'ALTER TABLE mytable ADD PARTITION (PARTITION p9999 VALUES LESS THAN MAXVALUE)');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
END $$
DELIMITER ;
从这里,只需打电话给它
USE mydb
CALL sp_mytable_Rotate();
在1月1日,你可以使用mysqldump备份旧分区的数据,然后像这样旋转:
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
THISYEAR=`date +%Y`
(( LASTYEAR = THISYEAR - 1 ))
BACKUP_FILE=Data_From_${LASTYEAR}.sql
BACKUP_GZIP=${BACKUP_FILE}.gz
mysqldump ${MYSQL_CONN} mydb mytable --where="date<'%{THISYEAR}-01-01'"| gzip > ${BACKUP_GZIP}
mysql ${MYSQL_CONN} -Dmydb -ANe"CALL sp_mytable_Rotate()"
基于Vérace’s suggestion,如果要将数据备份到表中,则ARCHIVE表可以压缩数据并且不会对索引产生额外开销.
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
THISYEAR=`date +%Y`
(( LASTYEAR = THISYEAR - 1 ))
BACKUP_TABLE=mydata_${LASTYEAR}
MKDT="MAKEDATE(${THISYEAR},1)"
SQL="CREATE TABLE ${BACKUP_TABLE} ENGINE=ARCHIVE SELECT * FROM mytable WHERE 0=1;"
SQL="${SQL} INSERT INTO ${BACKUP_TABLE} SELECT * FROM mytable WHERE date < ${MKDT}"
SQL="${SQL} CALL sp_mytable_Rotate();"
mysql ${MYSQL_CONN} -Dmydb -ANe"${SQL}"
然后,您可以将ARCHIVE表的.frm和.ARZ文件移动到指定的备份卷.
试试看 !!!
内容总结
以上是互联网集市为您收集整理的在MySQL中构建日志记录应用程序数据的最佳方法是什么全部内容,希望文章能够帮你解决在MySQL中构建日志记录应用程序数据的最佳方法是什么所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。