我正在研究一个通过远程MySQL数据库存储其数据的C++应用程序.
其中一项功能是尽可能保持与远程数据保持同步.为此,我使用NOW()函数获取最后的更新时间,并在更新记录时,将last_changed字段设置为NOW().
这项工作现在很好,除了它的最大精度高达一秒的问题.导致数十个重复条目,这会浪费带宽,并且必须手动删除它们.
为了限制大部分膨胀,我希望精度大于此值,最好是高达微秒(如unix gettimeofday()).但是,我在文档中找不到任何有关此内容的信息.我能找到的是NOW()函数使用的是一种变量类型,能够存储高达微秒的精度(源).但是在使用它时,第二个之后的所有精度都是零.
有没有办法强制Mysql服务器使用更高精度的计时器(并将潜在的性能视为理所当然)?或另一种方法来实现这一目标?
http://dev.mysql.com/doc/refman/5.1/en/datetime.html
DATETIME或TIMESTAMP值可以包括高达微秒(6位)精度的尾随小数秒部分.尽管可以识别此小数部分,但它会从存储在DATETIME或TIMESTAMP列中的值中丢弃.
使用varchar或text列来保留分数.
ps:MySQL本身无法获得微秒的时间
pps:未来版本除外)) http://dev.mysql.com/doc/refman/5.6/en/news-5-6-4.html
MySQL现在允许TIME,DATETIME和TIMESTAMP值的小数秒,精度高达微秒(6位).要定义包含小数秒部分的列,请使用语法type_name(fsp),其中type_name为TIME,DATETIME或TIMESTAMP,fsp是小数秒精度.
一些表达式产生的结果与以前的结果不同.示例:timestamp系统变量返回一个值,该值包含微秒小数部分而不是整数值.
因此,在了解了 MySQL 用户定义的函数后,我终于能够让它工作了。
在 Code::Blocks 中我写了这个简单的库文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef long long longlong;
#include <mysql.h>
#include <ctype.h>
#include <sys/time.h>
#include <unistd.h>
static pthread_mutex_t LOCK_hostname;
extern "C" longlong PreciseNow(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
extern "C" my_bool PreciseNow_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
extern "C" void PreciseNow_deinit(UDF_INIT *initid);
my_bool PreciseNow_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
return 0; //optional
}
void PreciseNow_deinit(UDF_INIT *initid)
{ //optional
}
longlong PreciseNow(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
struct timeval start;
long mtime, seconds, useconds;
gettimeofday(&start, NULL);
return start.tv_sec * 1000000 + start.tv_usec;
}
Run Code Online (Sandbox Code Playgroud)
它唯一做的就是返回当前系统时间。我将 lib 文件放在“/usr/lib/mysql/plugin/”中。其次,在数据库中,我执行了以下查询:
创建函数 PreciseNow 返回整数 SONAME 'libhrt.so'
最后,我将时间戳列转换为 bigint(8 字节整数)。也许这不是必需的,但是看到 C 函数返回相同的对象类型,为什么不......
现在,当运行 SQL 查询“SELECT PreciseNow()”时,我得到了内置“NOW()”的微秒精确版本!由于我对 MySQL 的了解非常有限,我认为这是解决我的问题的完全合法且有效的解决方案?
| 归档时间: |
|
| 查看次数: |
10474 次 |
| 最近记录: |