我在设计表格结构时遇到问题,我想听听您的意见。我正在创建一个应该包含大约1-2mil行的表,让我们称之为用户,对于每个用户,我需要存储大约500个布尔值。这个表的主要重点是快速读取,没有强调大小或写入时间。主要查询将是选择匹配各种布尔列值的用户数为true或false。
所以这是我的问题:我必须在脑海中设计。
首先是正确的,我将只有1个表,其中500列为boolean / tinyint,只需使用一个表轻松查询结果即可查找结果。不确定这个查询的速度,以及使用这么多列的MySQL能力。
第二个有点复杂。我虽然将布尔值作为标记存储在掩码中,但是列数会显着减少,但在SELECT的WHERE中使用按位操作时不能确定速度。
有没有人在使用这些数据时有经验,并且在类似方法之间加快比较?或者有谁更好地了解如何处理这个问题?
答案 0 :(得分:2)
请考虑第三种选择。它有点复杂,但可以提高性能。您将需要3个表:
- 用户
- 权限
- PermissionsxUser
表用户仅拥有有关用户的信息。您的“列”在权限表的行中进行转换。然后,对于要在PermissionsxUser表中添加一行的每个权限。当然每个表都需要一个ID。
它也更有效,因为您只在授予特定权限时添加记录。如果用户没有特定权限ID的记录,则不允许执行该操作。
答案 1 :(得分:1)
您应该在系统上测试样本数据的两种不同方法。 A"正常"在SQL中存储数据的方法将为每个布尔值分配1个字节。因此,给定的记录大约是500字节(可能还有一些额外的开销)。通过比特摆弄,你可以把它放到63个字节左右,更复杂的访问带来额外的复杂性。 MySQL可以轻松处理500列。
在正常情况下,差异不会那么大。将记录的大小减小8倍会减少所需的页数,并且可能是内存中数据拟合或不适合内存的差异 - 这可以显着提高性能。 (实际上,每个500字节的几百万条记录应该很容易适应可用的缓存,所以这可能不是一个很大的区别。)
另一方面,你无法真正索引比特。因此,如果您希望使用索引提高某些查询的性能,那么如果打包这些选项将会更加困难。
通常,对于少数标志,通过支持比特来提高性能可能不值得访问增加复杂性。但是,你有一个相当极端的情况,可能需要进行比特打包。
答案 2 :(得分:-1)
您可以创建将此500 bollean值模拟为的SQL结构 例如8 *(64位)BIGINT列。
每个布尔集可以表示为整数。 所以你可以将你的布尔分组为无效者。
如果您想要询问您的数据库是否为布尔值,您必须先将其转换为整数。
因此,在每个查询中,您将要求8个bigints集,而不是500个布尔值。
这可能会有所帮助。 每列应该有一个索引。
示例:无符号整数(4位)的值2将表示为0010 它可能代表4个布尔列,它们具有值,false,false,true,false。