代码之家  ›  专栏  ›  技术社区  ›  myermian

对唯一列的数据库搜索:长字符串还是多int或Long?

  •  1
  • myermian  · 技术社区  · 14 年前

    我不确定我将使用什么数据库(更有可能是SQL Server Express),所以我不知道这是否有什么不同(或者 有区别的)重要的。

    基本上,我希望将我的对象存储在数据库中,以便可以搜索唯一的对象。

    public class FooBar
    {
        public GridItem[,]  Items { get; set; } //This is a 5x4 grid
    }
    
    public enum GridItem
    {
        a = 0,
        b,
        c
    }
    

    起初,我将每个GridItem表示为一个2个字符的二进制文件(a=00,B=01,C=10——我不认为这会让我的应用程序在数组中构建字符串时陷入困境),它给了我一个40个字符的字符串。我可以在数据库中搜索匹配的字符串,但这让我思考。将每个GridItem保留为Int32(或Int64)并搜索数据库以查看所有列(GItem00、GItem01,…)是否更有效。。。GItem54)匹配到相应的行/列GridItem。我认为Int32与Int64可能与处理器有关,所以这没什么大不了的。基本上,如果速度是我最关心的(而不是存储),那么哪一个更好。。。吐出一个80个字符的字符串,或者将20个不同的Int32存储到数据库中并搜索这些列?

    或者,是否还有更好的方法,比如将对象序列化为二进制文件,并以某种方式搜索匹配的blob?我不是一个真正的数据库员,所以我不知道。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Mike Lue    14 年前

    我以前没有遇到过这样的问题,但我有一些理论 更快的速度 .

    当系统将数据持久化为40字节字符并且有一个索引时,该索引将尽可能短,以区分数据的准确记录位置。例如:

    0101101.... => 010(3-byte index)
    0111111.... => 011(3-byte index)
    

    在一般数据库理论中,使用的存储越少 查询性能 获得。

    如果您的数据足够多,以至于数据库需要所有字符(40字节字符)来索引记录,则某些记录的索引大小将为40字节。

    上述理论有一个前提:匹配的数据只占全部数据的一小部分。

    索引维护工作有一个值得关注的重要因素:您需要20个索引(逻辑上)来加速20int32的策略。实际上,80字符策略和单个Int64策略只需要一个索引。


    让我们解释一下索引是否不起作用,这意味着数据库系统使用全表扫描(FTS)策略执行查询。

    对于每个记录8字节的8字节(Int64)数据,SQL Server中的每个页面都可以保存8K*1024/8=1024条记录。

    如果有20000条记录,数据库需要20000/204=99个I/O来执行FTS,而另一个需要20000/1024=20个I/O。

    所需的I/O越少,获得的性能就越多。

        2
  •  0
  •   MrFox    14 年前

    枚举并不是很有用,如果你知道你想要哪个索引号,只需访问那里的数据。同样,在Foo[,]之后,您应该指定变量名,不能在那里使用枚举名。

        3
  •  0
  •   Pavel Urbančík    14 年前

    如果我正确理解您的问题,您想匹配数据库中FooBar(或其二进制表示)的整个实例吗? 5x4网格=20个项,每个项2位=40位=5字节=Int64列。你不能更快地满足你的要求。