急,在线等!! ● 向ACMAIN_CHM、zuoxingyu求助 ● 以下几种关于日志表的设计那一种更有效率

用户昵称不能为空 2010-09-28 05:08:33
需求:

记录每分钟在线人数 [表minlog]
记录每小时在线人数 [表hourlog]

(另外还涉及另外一个表,流失日志表 losslog)

表minlog 结构:

mysql> desc minlog;
+--------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+-------+
| time | int(10) unsigned | NO | PRI | NULL | | //分钟的时间戳,精确到分钟
| count_online | int(10) unsigned | NO | | NULL | | //在线人数
+--------------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)



表hourlog结构:

mysql> desc hourlog;
+---------------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------------------+------+-----+---------+-------+
| hour | int(10) unsigned | NO | PRI | 0 | | //小时的timestamp ,精确到秒
| count_online | int(10) unsigned | NO | | 0 | | //采样此刻的在线人数
| count_reguser | int(10) unsigned | NO | | 0 | | //总注册用户数
| total_notloss | mediumint(8) unsigned | NO | | 0 | | //未流失用户数
| total_mayloss | mediumint(8) unsigned | NO | | 0 | | //可疑流失
| total_isloss | mediumint(8) unsigned | NO | | 0 | | //已经流失
| avg_online | int(10) unsigned | NO | | 0 | | //平均在线
+---------------+-----------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)



流失日志表losslog结构:

mysql> desc losslog;
+---------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| hour | int(10) unsigned | NO | | 0 | | //这个和hourlog表里面的hour是对应
| notloss | int(10) unsigned | NO | | 0 | |
| mayloss | int(10) unsigned | NO | | 0 | |
| isloss | int(10) unsigned | NO | | 0 | |
| level | smallint(1) unsigned | NO | | 0 | |
| total | mediumint(8) unsigned | NO | | 0 | |
+---------+-----------------------+------+-----+---------+----------------+
7 rows in set (0.02 sec)



表minlog 和表hourlog都没有自动递增的键,他的主键都是int(10)的Linux 时间戳 unix_timestamp() 值。
这里又一个问题,那就是在插入 hourlog表的时候需要先验证 from_unixtime(hour,'%Y%m%d%H') 是否有,这样SQL的效率可能不是很高。


写入小时日志的流程:
1.先使用SQL语句检查数据库表hourlog中是否有当前小时的日志存在,语句:
select 1 from hourlog where from_unixtime(hour,'%Y%m%d%H')=from_unixtime(unix_timestamp(),'%Y%m%d%H') limit 1 


2.如果存在,那么不插入,否则插入
insert into hourlog(hour,count_online,....)values(unix_timestamp(),'$count_online',....)


同样写入每小时流失日志表的流程是
先检查losslog里面是否有当前这个小时的记录,有就不插入,没有就开始写入小时日志。(流失的小时日志是每一个级别一个记录的。。)
select 1 from losslog where from_unixtime(hour,'%Y%m%d%H')=from_unixtime(unix_timestamp(),'%Y%m%d%H') limit 1 



以上三个表就是目前我使用的方法。我想的就是使用int(10)而且,每一个都是10位的来做主键会不会很好效率?
帮我分下下,我想将表改为使用自动递增的id为主键的,但是这样的话就无法和另外一个表 losslog 对应起来了。

帮我分析下~~~~
...全文
198 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acmain_chm 的回复:]

引用为了不另外加一个logtime(记录时间),所以直接将hour精确到秒了。
从时间效率上来说。宁可添加这么个LOGTIME。
[/Quote]

我也觉得好像是的。不过我程序里面要改蛮多地方了。
ACMAIN_CHM 2010-09-28
  • 打赏
  • 举报
回复
[Quote]为了不另外加一个logtime(记录时间),所以直接将hour精确到秒了。[/Quote]
从时间效率上来说。宁可添加这么个LOGTIME。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 acmain_chm 的回复:]

没有看明白你的业务逻辑.

表hourlog 的hour 为什么不精确到 小时? 为什么要精确到秒?
如果精确到小时,则后面的程序使用 insert IGNORE into就行了。如果重复则MYSQL会取消操作。
[/Quote]

因为这个hourlog 表里面的hour字段是每个小时里面随即取样的时间。
为了不另外加一个logtime(记录时间),所以直接将hour精确到秒了。
ACMAIN_CHM 2010-09-28
  • 打赏
  • 举报
回复
[Quote]每一个都是10位的来做主键会不会很好效率?[/Quote] INT(10)并不是说这是个10位的数字,它仍是INT型数列,也就是4个字节。可以存放 -2147483648 到 2147483647 的整数。 (10)只是说明了一下显示格式,这个显示设置功能基本上没什么用处。

所以说用一个INT做主键,本身没有什么问题。效率也没问题。
ACMAIN_CHM 2010-09-28
  • 打赏
  • 举报
回复
没有看明白你的业务逻辑.

表hourlog 的hour 为什么不精确到 小时? 为什么要精确到秒?
如果精确到小时,则后面的程序使用 insert IGNORE into就行了。如果重复则MYSQL会取消操作。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]

你可以使用 insert into ... on duplicate
或者 insert IGNORE into ...
[/Quote]

呃,,,, 我需要保证hourlog表中每小时的记录只有一条。
这个语句不太清楚怎么写。

另外我上面这三个表的设计应该是没有问题的吧(效率,对吗)。。。
ACMAIN_CHM 2010-09-28
  • 打赏
  • 举报
回复
你可以使用 insert into ... on duplicate
或者 insert IGNORE into ...

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧