MySQL数据库设计针对PHP中的数据检索进行了优化

时间:2009-06-05 22:16:29

标签: php sql mysql database-design optimization

我是一个相当新的MySQL开发人员,我正在开始一个项目,我可以做一些关于...的初步建议。

我正在创建一个数据库,主要包含一定数量的项目(1-5k之间)和大约40个与每个项目相关联的布尔变量。然后,用户将输入他们对这40个值的选择,系统的工作是确定“最佳”匹配项目。这可能是匹配所有40个变量的项目,如果不存在,则可能是匹配39等的项目。

所以,如果有人有时间的话,有几个问题!

  1. 根据我对MySQL的经验,将数据拆分为这种大小的数据库的单独表格没有明显的速度优势。更多表的开销太大,无法对整体性能产生任何可行的差异。因此,我建议简单地创建一个包含40列和最多5000行的大型表来存储所有信息(表锁定不是问题,因为所有查询都将是SELECT)。这与其他人的思想和经验相符吗?
  2. 返回“最佳”匹配的最有效方法是什么?这甚至是可能通过数据库结构和单独的SQL命令,还是我只需要将整个数组返回到PHP并在那里运行一种启发式函数来确定最佳匹配?
  3. 感谢您的时间和帮助!

3 个答案:

答案 0 :(得分:3)

一张桌子肯定是对的。您可以将最多64个布尔变量存储到单个BIGINT列中,作为“掩码”,每位一个布尔值,并将匹配计算得非常快BIT_COUNT(~(the_column ^ user_preferences)),它将计算多少位相等列和掩码给出了用户的首选项(如果PHP给你操作64位整数的问题,你可以使用两个32位的列,总结两位数仍然非常快)。

答案 1 :(得分:0)

我将使用两张桌子。一个用于项目,一个用于匹配项目的布尔标志。只在'flags'表中输入一个项目的匹配项。 然后,为了得到一个项目的匹配数,只需要在'flags'表中记录与'items'表中的itemId匹配的记录。

答案 2 :(得分:0)

我不认为这是存储此类信息的最佳方法。它可能在视觉上看起来很好,但如果你所有的存储都是布尔值,那么我将创建两个表和一个链接表,每个匹配的真值都带有条目。

这里没有开销,因为mysql更喜欢搜索行而不是列。 count()函数将派上用场。

我很确定如果找不到任何匹配项,您将不得不恢复到PHP以运行搜索以查找39的匹配项等等。递归函数是一种很好的方法。

e.g。

表xOption id,name

表格选项 id,name

表xOption_yOption xOption_id,yOption_id

关于这一点的另一个好处是,您可以稍后在网格中轻松添加更多X或Y选项,您也可以存储有关选项的更多详细信息。

不要忘记使用索引。