新手問題,見笑了。
我想讓每篇文章都有一個獨立的訪問統計,訪問統計資訊單獨一個欄位。
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字段.比如我的會話表: