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

Posted

技术标签:

【中文标题】针对 PHP 中的数据检索优化的 MySQL 数据库设计【英文标题】:MySQL Database Design Optimized for Data Retrieval in PHP 【发布时间】:2009-06-05 22:16:28 【问题描述】:

我是一个相当新的 mysql 开发人员,并且正在开始一个项目,我可以通过一些初步建议来完成...

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

所以,如果有人有时间,请询问几个问题!

    根据我对 MySQL 的经验,对于这种大小的数据库,将数据拆分到单独的表中并没有明显的速度优势。更多表的开销太大而无法对整体性能产生任何可行的影响。因此,我建议简单地创建一个包含 40 列和最多 5000 行的大表来存储所有信息(表锁定不是问题,因为所有查询都是 SELECT)。这与他人的想法和经验相符吗? 返回“最佳”匹配的最有效方法是什么?这是否甚至可能仅通过数据库结构和 SQL 命令,或者我将不得不简单地将整个数组返回给 php 并在那里运行某种形式的启发式函数以确定最佳匹配?李>

感谢您的时间和帮助!

【问题讨论】:

【参考方案1】:

一张桌子肯定是对的。您可以将多达 64 个布尔变量存储到单个 BIGINT 列中,作为每个位一个布尔值的“掩码”,并以 BIT_COUNT(~(the_column ^ user_preferences)) 的速度非常快地计算匹配,这将计算列和给出用户偏好的掩码(如果 PHP 给您处理 64 位整数的问题,您可以使用两个 32 位的列,将两个位计数相加仍然非常快)。

【讨论】:

【参考方案2】:

我会使用两张桌子。一个用于项目,一个用于与项目匹配的布尔标志。仅在“标志”表中输入项目的匹配项。 然后,要获取项目的匹配数,只需计算“标志”表中与“项目”表中的 itemId 匹配的记录数。

【讨论】:

如果你走这条路,你还可以在WHERE 子句中使用外连接和IS NULL 来计算“负匹配”;但是,与我建议的 BIT_COUNT 相比,我仍然认为这是一种迂回的方法。【参考方案3】:

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

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

我很确定如果它找不到任何匹配项,您将不得不恢复到 PHP 运行搜索以找到 39 的匹配项,依此类推。递归函数将是执行此操作的好方法。

例如

表 xOption 身份证、姓名

table yOption 身份证、姓名

表 xOption_yOption xOption_id, yOption_id

这方面的另一个好处是您可以稍后轻松地将更多 X 或 Y 选项添加到您的网格中,并且您也可以存储有关选项的更多详细信息。

别忘了也使用索引。

【讨论】:

以上是关于针对 PHP 中的数据检索优化的 MySQL 数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

PHP 优化MySQL数据库中的所有表

MySql优化之索引

mysql性能优化总结

Mysql 优化 -- 数据库结构

mysql 一次插入几万条数据应该怎么做优化

mysql处理海量数据时的一些优化查询速度方法