我正在构建一个应用程序,它需要管理各种对象(目前有3个,但时间可能会增加)。所有这些对象都具有使用相同格式的唯一ID,但没有其他共同的属性。
所以我为每个对象创建了一个表,但我想知道如何通过I进行优化搜索。我想从一开始就构建一个很好的过程,因为总行数可能会变得非常高,而且我不想在几个月内重写代码,因为它会变得太慢。
我想到了NoSQL数据库,但我需要使用MySQL。PHP代码使用Laravel 4和雄辩的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等.)发布于 2014-01-18 18:26:04
问题:
对不起,我还没有50名代表,所以我不能补充意见,但我有一些问题:
身份证是从哪里来的?是来自外部系统吗?还是你给了他们身份证?
你为什么要用身份证搜索?为了内部目的还是用户会使用这些ids?
这些ids真的是字母顺序吗?数字会更有效率。
您是同时使用多个ids进行搜索,还是一个接一个地搜索?
一个可能的解决方案:
您可以做的一件简单的事情(取决于您的需要)是只使用一个包含两个列的表:
不过也有不好的一面。查看这个URL的优缺点:http://www.mysqlperformanceblog.com/2010/01/21/when-should-you-store-serialized-objects-in-the-database/
(例如,如果您需要搜索id以外的其他属性,它将无法工作。如果您需要经常更新DB,那么它也不是更有效的方法)
在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,300 k是可管理的,只需确保id列上有索引即可。
此外,如果经常搜索特定的一组列(例如,用户通常按id、名字和姓氏进行搜索),则需要在这两列上使用复合索引(这需要更多的磁盘空间艰难)。
如果您想确保查询(1用于获取表,第2条用于获取数据)将是有效的,您可以使用一个小的php脚本(带有插入的循环)或数据生成器(我找到了这个条目:http://www.generatedata.com/)轻松地输入300 K条目。
我将在两个表中输入300k (在您的“索引”表和一个对象表中),并测试进行两个查询所需的时间,一个查询"index“表,另一个查询对象表。
您可以尝试的另一件事是使用存储过程(您可以根据存储过程中对象的类型选择表)。
发布于 2014-01-18 19:59:24
单查询解决方案有一个根本问题:您不知道每个对象返回的是哪些列,因为列取决于类型。
使用CommonIndex表的方法听起来是一种合理的方法。只需确保在每个对象表上都对id列进行了索引。
我确实感到惊讶的是,共享id通用格式的对象没有任何共同的字段。如果有公共字段,那么这些字段将放在CommonIndex中。
https://stackoverflow.com/questions/21207780
复制相似问题