存储过程对我的情况有益吗?

时间:2011-03-04 04:53:55

标签: php mysql stored-procedures

我最近开始为一家小型企业工作,该企业运营着一个小型网站。我听到一位同事提到我们的网站或MySQL数据库每秒都会被击中~87次。

我今天也负责重组这些数据库中的一些表格。我在学校被教过,良好的数据库设计要求表示两个表之间的多对多关系,我应该使用第三个表作为中间人。 (第三个表将包含两个表中两个相关行的id。)

目前我们使用两个独立的数据库,总共少于40个表,没有超过1k行的表。现在,一些PHP脚本使用第三个表来关联某些行,这些行具有第三列,如果一个表中的行与某些其他表中的多个行相关,则该第三列用于存储逗号分隔的ID字符串。因此,如果他们想要使用第三列中的id,他们必须获取字符串并将其分开并获得正确的id。

当我提到我们应该切换到正确使用第三个表时,好的设计要求他们说这会对这样的小表造成太多开销,因为他们必须使用几个连接语句来获取他们想要的数据。

最后,我的问题是为这些连接创建存储过程会减轻这些连接对系统的影响吗?

非常感谢你们,对于冗长的解释感到抱歉!

3 个答案:

答案 0 :(得分:1)

根据事情的声音,您应该尝试重新设计数据库架构。

  

两个独立的数据库,总共少于40个表,没有超过1k行的表

听起来它没有被正确地规范化 - 或者它已经进行了大规模的标准化并且会受益于某些多态性。

  

逗号分隔的ID

哦,亲爱的 - 代理钥匙 - 本质上并不坏,但往往是设计糟糕的标志。

  

第三个表,用于关联某些行,这些行具有用于存储逗号分隔ID字符串的第三列

所以距离标准化还有很长的路要走 - 这真的很糟糕。

  他们说这会给这些小桌子造成太多开销

我想是时候开始打磨你的简历了。听起来像'他们'对DBMS系统知之甚少。

但是如果你必须坚持这一点 - 从设计良好的数据库(提示 - 使用视图)模拟设计糟糕的数据库要容易得多,反之亦然。离线重新设计数据库并比较调优查询的性能 - 它将至少以最快的速度运行。添加视图以允许旧代码未经修改地运行,并比较执行密钥操作所需的代码量。

答案 1 :(得分:0)

在数据库中执行它比在PHP中更快更简单;这就是数据库引擎所擅长的。在键上创建索引(InnoDB默认会这样做),连接速度很快;说实话,桌子很小,连接几乎总是很快。

由于两个原因,存储过程并没有真正出现;主要是,他们不会对影响产生任何影响(不管是否有任何影响 - 你将通过在数据库中而不是在PHP级别来提高应用程序性能)。

其次,避免像瘟疫一样的MySQL存储过程,如果你曾经使用存储过程语言为任何其他数据库工作,那么他们真的很难编写和调试。

答案 2 :(得分:0)

我不明白如何将逗号分隔的id列表存储在一个列中,并且必须解析id列表以获取所有关联的行,这比简单的表连接简单得多。

将查询移动到存储过程通常不会带来任何好处。但是,如果您必须使用逗号分隔的表示外键关联的值列表,则存储过程可能会提高性能。也许在您的存储过程中,您可以声明一个临时表(例如,参见Create table variable in MySQL),然后填充临时表,为逗号分隔字符串中包含的每个值填充1行。

我不确定通过这样做可以获得什么类型的性能提升,考虑到你提到的任何表中没有很多行。整个练习似乎有点傻。抛弃逗号分隔的id列表将是最好的方法。