Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 最佳日志数据库结构_Php_Mysql_Performance_Join - Fatal编程技术网

Php 最佳日志数据库结构

Php 最佳日志数据库结构,php,mysql,performance,join,Php,Mysql,Performance,Join,MYSQL/PHP,我想创建人们在站点上执行的活动的记录 Table ADDED -> EventID, UserID, Time, IP Table DELETED -> EventID, UserID, Time, IP Table SHARED -> EventID, UserID, Time, IP. 当查询读取用户ID执行的最后10个操作时,连接这些表是否更有效,或者这样构造是否更有效 Table EVERYTHING -> EventID, EventT

MYSQL/PHP,我想创建人们在站点上执行的活动的记录

Table ADDED -> EventID, UserID, Time, IP

Table DELETED -> EventID, UserID, Time, IP

Table SHARED -> EventID, UserID, Time, IP.
当查询读取用户ID执行的最后10个操作时,连接这些表是否更有效,或者这样构造是否更有效

Table EVERYTHING -> EventID, EventType(eg ADDED, DELETED, SHARED), UserID, Time, IP 

使用一个表记录所有事件并区分事件类型,如第二个建议中所示

这里只存储一种类型的数据,因此适合将其存储在一个表中。在早期阶段,您不应该过多地担心表随着时间的推移会增长到什么大小。在这样的表中只有几个列,它可以很容易地增长到数以百万计的行,甚至需要考虑对它进行分区。


如果您有有限数量的事件类型,您可以考虑使用<代码>事件类型列。

< P>使用一个记录所有事件并区分事件类型的表,如在第二个建议中。

这里只存储一种类型的数据,因此适合将其存储在一个表中。在早期阶段,您不应该过多地担心表随着时间的推移会增长到什么大小。在这样的表中只有几个列,它可以很容易地增长到数以百万计的行,甚至需要考虑对它进行分区。


如果您有有限数量的事件类型,您可以考虑使用<代码> Engestys列。

使用一个表是正确的,因为它被适当地规范化了。添加新事件类型不需要新表。维护引用完整性和使用索引为用户检索和排序所有事件也更容易。(如果将它们放在单独的表中,那么为用户获取所有事件并按时间对它们进行排序可能比使用一个表慢得多!)

不过,有一些方法可以使这些表变小,以节省空间并保持索引小:

  • 使用
    enum()
    定义事件类型。如果有少量事件,则每行最多使用一个字节
  • 使用
    UNSIGNED
    整数类型可以从相同的字节数中获取更多的
    EventID
    UserID
    s
  • 如果不需要完整的日期范围(可能),请使用时间戳类型与日期时间类型相比,每行节省4个字节
  • 如果只使用ipv4地址,请将IP存储为无符号4字节整数,并使用INET_ATON()和INET_NTOA()进行来回转换。这是这里最大的赢家:VARCHAR类型至少需要16个字节,并且您可以使用固定的行长度格式
我建议使用如下表格格式:

创建表事件(
`EventID`整数无符号非空自动增量,
`UserID`MEDIUMINT UNSIGNED NOT NULL COMMENT'这允许1600万用户多一点,您的索引将更小',
`EventType`ENUM('add'、'delete'、'share')不为空,
`Time`TIMESTAMP NOT NULL默认当前时间戳,
`IP`整数无符号非空默认值0,
主键(`EventID`),
外键(`UserID`)在更新级联和删除级联上引用`Users`(`UserID`),
密钥(用户ID)
);
如果使用MyISAM存储,则行长度将为16字节,使用固定格式。这意味着每百万行需要16MB的数据空间,索引空间可能只有16MB的一半(取决于您使用的索引)。这是如此紧凑,以至于mysql可以在大部分时间将表的整个工作部分保存在内存中


然后是为最常见的操作创建所需索引的问题。例如,如果始终显示某个时间范围内的所有用户事件,请将
键(UserID)
替换为
索引userbytime(UserID,time)
。然后像
SELECT*这样的查询从UserID=?时间间隔呢?而且?
将非常快。

使用一个表是正确的做法,因为它已被正确规范化。添加新事件类型不需要新表。维护引用完整性和使用索引为用户检索和排序所有事件也更容易。(如果将它们放在单独的表中,那么为用户获取所有事件并按时间对它们进行排序可能比使用一个表慢得多!)

不过,有一些方法可以使这些表变小,以节省空间并保持索引小:

  • 使用
    enum()
    定义事件类型。如果有少量事件,则每行最多使用一个字节
  • 使用
    UNSIGNED
    整数类型可以从相同的字节数中获取更多的
    EventID
    UserID
    s
  • 如果不需要完整的日期范围(可能),请使用时间戳类型与日期时间类型相比,每行节省4个字节
  • 如果只使用ipv4地址,请将IP存储为无符号4字节整数,并使用INET_ATON()和INET_NTOA()进行来回转换。这是这里最大的赢家:VARCHAR类型至少需要16个字节,并且您可以使用固定的行长度格式
我建议使用如下表格格式:

创建表事件(
`EventID`整数无符号非空自动增量,
`UserID`MEDIUMINT UNSIGNED NOT NULL COMMENT'这允许1600万用户多一点,您的索引将更小',
`EventType`ENUM('add'、'delete'、'share')不为空,
`Time`TIMESTAMP NOT NULL默认当前时间戳,
`IP`整数无符号非空默认值0,
主键(`EventID`),
外键(`UserID`)在更新级联和删除级联上引用`Users`(`UserID`),
密钥(用户ID)
);
如果使用MyISAM存储,则行长度将为16字节,使用固定格式。这意味着每百万行需要16MB的数据空间,可能是索引空间的一半(取决于