我正在构建一个需要管理各种对象的应用程序(目前只有3个,但可能会随着时间的推移而增加)。所有这些对象都使用相同的格式具有唯一ID,但没有其他共同属性。
所以我为每个对象创建了一个表,但是我想知道如何通过ID进行优化搜索。我想从一开始就构建一个好的进程,因为总行数可能会变得非常高,而且我不希望在几个月内重写代码,因为它会变得太慢。
我想到了NoSQL数据库,但我需要使用MySQL。 PHP代码使用Laravel 4和Eloquent ORM。
假设我想要ID为abcd-123456
的项目,我不知道要查询哪个表,所以我想到了这个:
CommonIndex
)CommonIndex
表中查找表名,存储在$tableName
变量中$tableName::find('abcd-123456')
检索最终数据(使用与我的表完全相同的模型)但我担心当我必须以300k +行搜索我的ID时,这个过程会变得迟钝
有关如何改进此流程或构建新流程的任何想法?
谢谢!
编辑:更多信息:
ab-1 de-3 hi-5
表2 cd-2 gh-4 jk-6
等...)答案 0 :(得分:4)
问题:
抱歉,我无法添加评论,因为我还没有50个代表,但我有一些问题:
ids来自哪里?它来自外部系统吗?或者你给他们ids?
为什么需要按ID搜索?出于内部目的或用户将使用这些ID?
ids真的按字母顺序排列吗?数字会更有效率。
您会同时搜索多个ID还是逐个搜索?
一种可能的解决方案:
你可以做的一件简单的事情(根据你的需要),只使用一个有2列的表:
但是有缺点。查看此URL以获取利弊: http://www.mysqlperformanceblog.com/2010/01/21/when-should-you-store-serialized-objects-in-the-database/
(例如,如果你需要搜索除你的id之外的其他属性,它将无法工作。如果你需要经常更新数据库,那么它也不是更有效率)
在PHP中序列化和反序列化对象非常容易:
$a = your_object;
$s = serialize($a);
// save data into database. $s is now your object, but in a string format.
// retreive the value from your database ($s)
$s = get_from_database($id);
$a = unserialize($s);
// do whatever you want now with your object
另一个解决方案是你提到的那个,但我不会存储表名。数字效率更高。
更新:
由于你无法真正存储序列化对象,我认为你建议的是最好的方法。 MySQL的300k是可管理的,只需确保您的id列上有索引。
此外,如果经常搜索特定的列组(例如,用户经常按id,名字和姓氏搜索),您将需要在两列上使用复合索引(需要更多磁盘)空间艰难)。
如果你想确定查询(1获取表格和第2次获取数据)将是有效的,你可以轻松输入带有小PHP脚本(带插入的循环)或数据的300K条目发电机(我找到了这个:http://www.generatedata.com/)。
我会在2个表中输入300k(在“索引”表和一个对象表中)并测试进行2次查询所需的时间,一个在“索引”表上,另一个在对象表上
您可以尝试的另一件事是使用存储过程(您可以根据存储过程中对象的类型选择表)。
答案 1 :(得分:0)
单查询解决方案存在一个基本问题:您不知道每个对象返回的列,因为列取决于类型。
使用CommonIndex
表的方法听起来像是一种合理的方法。请确保在每个对象表上编入id
列索引。
我确实感到惊讶的是,共享id
的通用格式的对象没有共同的任何字段。如果有共同字段,那么这些字段将进入CommonIndex
。