两部分MySQL问题:访问特定的MySQL行和列性能

时间:2011-04-29 23:56:15

标签: php mysql

我有一个表格,其中列出了大约150个网站,其中包含“site_name”,“visible_name”(基本上是格式化名称)和“说明”列。对于我网站上的给定页面,我想为表中的每个站点提取site_name和visible_name,并且我想为所选站点提取所有三列,这些列来自$ _GET数组(URL参数)。

现在我正在使用2个查询来执行此操作,其中一个查询“为所有网站获取site_name和visible_name”,另一个查询“获取一个特定网站的所有3个字段”。我猜这是一个更好的方法:

SELECT * FROM site_list;

因此减少到1个查询,然后进行其余的后查询,这会带来两个问题:

  1. 每个站点的“描述”字段大约为200-300个字符。如果我只将它用于1个站点,那么从性能的角度来看,为所有150个站点提取这个是不是很糟糕?
  2. 如何引用网址中指定网站的MySQL结果集中的特定行?例如,如果网址为“mysite.com/results?site_name=foo”,我该如何进行SELECT * FROM site_list where site_name=foo;的等同查询?
  3. 我不知道如何获取“site_name = foo”的数据而不循环遍历整个结果数组并检查site_name是否与URL参数匹配。有没有更有效的方法呢?

    谢谢,

    克里斯

    PS:我在stackoverflow上发现了一个类似的问题并阅读了所有答案,但这对我的情况没有帮助,这就是我发布这个问题的原因。

    谢谢,

    克里斯

3 个答案:

答案 0 :(得分:0)

通常,在表中将'id'字段作为auto_increment值是一种好习惯。然后,你会:

SELECT id,url,display_name FROM table;

你以后会有'id'值:

SELECT * FROM table WHERE id=123;

如果你在桌子上有更多的WAAAY条目,这可能是你最有效的方法。

但是,表中只有150行,你可能只是做得很好

SELECT * FROM table;

并且仅根据您的条件访问匹配行的最后一个字段。

答案 1 :(得分:0)

如果您只需要名为foo的站点的描述,您可以使用SELECT * FROM site_list查询数据库WHERE site_name ='foo'LIMIT 1

否则你必须遍历结果数组并在site_name上进行字符串比较以找到正确的描述。

答案 2 :(得分:0)

我相信你现在所做的,保持特定查询以获取一个只有标题的网站列表和一个详细视图以及一个给定网站的描述,这很好。您不会提取任何不需要的数据,并且两个查询都很简单。

可以将您的查询合并为一个,使用左连接,可能是:

SELECT s1.site_name, s1.visible_name, s2.description
FROM site_list s1
LEFT JOIN
  ( SELECT site_name, description
  FROM site_list
  WHERE site_name = 'this site should go with description' ) s2
ON s2.site_name = s1.site_name

导致所有没有匹配名称的网站都有NULL作为描述,您甚至可以使用

对其进行排序
ORDER BY description DESC, site_name

获取带有描述的网站作为第一个获取的行,因此无需迭代结果来找到它,但是mysql必须做更多的工作来给你这个结果,否定你可能希望获得的任何可能的收益。所以基本上坚持你现在所拥有的,它的好处。