2012-05-24 40 views
0

我在做一个Web应用程序,我使用MySQL作为我的DB后端。我的数据库最终会更大,就像一些表中的超过1亿行一样。我只想确认一个关于这样的大桌子的事情。MySQL性能

选择1。假设这些表具有主键,并使用主键进行查询,但是我需要运行mysql查询,例如针对每个用户登录查询100个查询。

USERID KEYS 

1  {1,2,3,4} 

我会得到用户密钥,然后让主键查询来获得每个值

PRI.KEY Value 

1  google 

2  yahoo 

3  aol 

4  windows 

如果用户登录,我需要得到他的书签网站为例。所以我会做两个查询 从TB_KEYS中选择KEYS,其中USERID = 1;然后我解析KEYS和每个键, 从TB_VALUES中选择值,其中PRI.KEY =(KEY - 我从第一个查询中解析出来);

选项2.我不使用主键进行查询,但我需要运行一些用户登录查询。

OPT_TABLE_2

USERID KEY   Value 

1  1   google 

1  2   yahoo 

1  3   aol 

1  4   windows 

从OPT_TABLE_2选择值,其中USERID = 1;

哪个选项会更好..?

+0

你的问题没有道理。你可以包含一些你试图获得的东西的实际SQL查询吗? – Cylindric

+0

如果用户登录,我需要让他的书签网站为例。 因此,我将在第一种方法中进行两个查询: 从TB_KEYS中选择KEYS,其中USERID = 1; 然后我解析KEYS和每个键, 从TB_VALUES中选择值,其中PRI.KEY =(KEY - 我从第一个查询中解析出来); –

+0

编辑你的问题来澄清它,不要只是发布更新作为评论:)这样你会得到很好的格式,未来的读者不需要扫描所有的线索评论。不知道为什么你不能只使用JOIN。 – Cylindric

回答

0

但我需要运行mysql查询,比如每个用户登录的100个查询。

那么出于这个原因,这种方法是错误的。您尚未申请relational database normalisation rules

,但我需要为用户的登录

运行几个查询那么它可能仍然是错误的。您只需运行一个查询即可从此结构中获取与用户有关的数据 - 无论是或者您试图获取这些建议结构未表示的信息。

减少查询次数将会对性能产生影响大规模

为自己测试是微不足道的。

0

使用关系数据库,可能是第一个。通过适当的索引,跨越第二个过滤器应该非常快,但第一个应该有更小的表,通常更好。

实际上有三个表可能会更好:用户,用户密钥对和密钥。

如果你正在运行那么多的查询,你真的可能想弄清楚为什么和少运行。

与任何重要的性能问题一样:对其进行基准测试。生成10K测试用户及其数据,并查看在每种方法下运行时会发生什么。

+0

匿名downvote为什么? – zebediah49

+0

在其他地方看到答案--opt 1打破了第一条规则的正式化,要求解析数据以生成进一步的查询,没有办法在DBMS中加入表,查询处理开销。 – symcbean

+0

真的吗?我发誓,有一种方法可以在单个干净的步骤中从字符串中选择索引列表。这就是为什么我的第二选择是使用第三个表来链接它们,如果这不起作用。 – zebediah49