84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
新手问题,见笑了。
我想让每篇文章都有一个独立的访问统计,访问统计信息单独一个字段。
1条访问数据约为450个字符。几乎都是英文数字,只有ip地址是中文。
text长度是65535,相当约145条。感觉 太少了。如果改为mediumtext感觉又太大,用不完,占用空间。
请教有没什么方法?
访问统计的话 应该单独设计一个表吧。设置成一个字段维护起来 不方便的。单独弄个表吧
字段的话适当调整 aid就是文章id
mediumtext比text只多1 Byte,如果你觉得这就算太大,用不完,占用空间,那我是在找不到更好的办法了
mediumtext
text
1 Byte
太大,用不完,占用空间
楼主先要搞清楚,text和longtext这些都是可变长度的字段类型.这是phpMyAdmin里的说明:text: 最多存储65535(2^16-1)字节的文本字段,存储时在内容前使用2字节表示内容的字节数.longtext: 最多存储4294967295字节即4GB(2^32-1)的文本字段,存储时在内容前使用4字节表示内容的字节数.也就是说,你在longtext类型的字段里只存1个字符,占用空间只不过是4个字节加上1个字符占用的字节数,而不是占用4个GB的存储空间,4个GB指的是该字段能容纳的最大值.
最后就是有明显关系并且需要查询统计的多个量,不建议全部塞到一个字段里面.像不确定的会话数据(如JSON串)这类东西,倒是可以一股脑存到一个longtext字段.比如我的会话表:
DROP TABLE IF EXISTS `io_session`; CREATE TABLE IF NOT EXISTS `io_session` ( `user_id` bigint unsigned NOT NULL COMMENT '用户编号', `data` longtext NOT NULL COMMENT '会话内容', `create_time` bigint unsigned NOT NULL COMMENT '创建时间', `update_time` bigint unsigned NOT NULL COMMENT '更新时间', `version` smallint unsigned NOT NULL DEFAULT '0' COMMENT '版本号', `flag` tinyint NOT NULL DEFAULT '1' COMMENT '版本号递增递减方向标识', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='会话表'; // 填出会话数据到数组 $io['user']['session'] function io_session_get() { global $io; if(!isset($io['user']['id'])) return false; $db = io_db(); $table = IO_DB_PREFIX.'session'; $sql = "SELECT * FROM `{$table}` WHERE `user_id` = ?"; $stmt = $db->prepare($sql); $stmt->execute(array($io['user']['id'])); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); if(!isset($rows[0])) return false; $data = json_decode($rows[0]['data'], true); // JSON解码失败时,把会话内容重置为空 $io['user']['session']['data'] = ($data) ? $data : array(); $io['user']['session']['version'] = $rows[0]['version']; $io['user']['session']['flag'] = $rows[0]['flag']; //register_shutdown_function('io_session_set'); } // 将会话数据写入到数据库 function io_session_set() { global $io; if(!isset($io['user']['session'])) return false; $data = json_encode($io['user']['session']['data']); $db = io_db(); $table = IO_DB_PREFIX.'session'; switch(true) { // version 类型 smallint 范围 0 到 65535 case ($io['user']['session']['flag'] == 1 && $io['user']['session']['version'] != 65535): { $sql = "UPDATE `{$table}` SET `data` = ?, `version` = ? WHERE `user_id` = ? AND `version` = ? AND `flag` = 1"; $version_increase = true; break; } case ($io['user']['session']['flag'] == 1 && $io['user']['session']['version'] == 65535): { $sql = "UPDATE `{$table}` SET `data` = ?, `version` = ?, `flag` = -1 WHERE `user_id` = ? AND `version` = ? AND `flag` = 1"; $version_increase = false; break; } case ($io['user']['session']['flag'] == -1 && $io['user']['session']['version'] != 0): { $sql = "UPDATE `{$table}` SET `data` = ?, `version` = ? WHERE `user_id` = ? AND `version` = ? AND `flag` = -1"; $version_increase = false; break; } case ($io['user']['session']['flag'] == -1 && $io['user']['session']['version'] == 0): { $sql = "UPDATE `{$table}` SET `data` = ?, `version` = ?, `flag` = 1 WHERE `user_id` = ? AND `version` = ? AND `flag` = -1"; $version_increase = true; break; } } $stmt = $db->prepare($sql); $stmt->execute(array( $data, $version_increase ? $io['user']['session']['version'] + 1 : $io['user']['session']['version'] - 1, $io['user']['id'], $io['user']['session']['version'], )); return ($stmt->rowCount() == 0) ? false : true; } io_session_get(); var_export($io['user']['session']); $io['user']['session']['data']['date'] = date('Y-m-d H:i:s'); io_session_set();
访问统计的话 应该单独设计一个表吧。设置成一个字段维护起来 不方便的。单独弄个表吧
字段的话适当调整 aid就是文章id
mediumtext
比text
只多1 Byte
,如果你觉得这就算太大,用不完,占用空间
,那我是在找不到更好的办法了楼主先要搞清楚,text和longtext这些都是可变长度的字段类型.
这是phpMyAdmin里的说明:
text: 最多存储65535(2^16-1)字节的文本字段,存储时在内容前使用2字节表示内容的字节数.
longtext: 最多存储4294967295字节即4GB(2^32-1)的文本字段,存储时在内容前使用4字节表示内容的字节数.
也就是说,你在longtext类型的字段里只存1个字符,占用空间只不过是4个字节加上1个字符占用的字节数,而不是占用4个GB的存储空间,4个GB指的是该字段能容纳的最大值.
最后就是有明显关系并且需要查询统计的多个量,不建议全部塞到一个字段里面.像不确定的会话数据(如JSON串)这类东西,倒是可以一股脑存到一个longtext字段.比如我的会话表: