【问题标题】:select value from array where array value =input从数组中选择值,其中数组值 = 输入
【发布时间】:2015-05-27 03:42:27
【问题描述】:

100,000 条记录的表格内容

CON_ID | CON_VALUE | CON_CATEGORY __________________________________ 001 |数据1 |标题 002 |数据2 |标题 003 |数据3 |过程 004 |数据4 |过程

我从数据库中读取数据表content 并复制到数组。因为我必须从content 中选择100 次。

array(100017) {
  [0]=>
  array(3) {
    ["CON_VALUE"]=>
    string(40) "data1"
    ["CON_ID"]=>
    string(32) "001"
    ["CON_CATEGORY"]=>
    string(9) "title"
  }
  [1]=>
  array(3) {
    ["CON_VALUE"]=>
    string(26) "data2"
    ["CON_ID"]=>
    string(32) "002"
    ["CON_CATEGORY"]=>
    string(9) "title"
  }
  [2]=>
  array(3) {
    ["CON_VALUE"]=>
    string(28) "data3"
    ["CON_ID"]=>
    string(32) "003"
    ["CON_CATEGORY"]=>
    string(9) "process"
  }
  [3]=>
  array(3) {
    ["CON_VALUE"]=>
    string(26) "data4"
    ["CON_ID"]=>
    string(32) "004"
    ["CON_CATEGORY"]=>
    string(9) "process"
  }    
}

例如: 我要select CON_VALUE from Content where CON_ID=001 and CON_CATEGORY='title'

我使用 foreach

foreach($GLOBALS['contentTable'] as $R)
{ 
    if($R['CON_ID']==$id && $R['CON_VALUE']!='' && $R['CON_CATEGORY']=='PRO_TITLE' )
    {         
        return $R["CON_VALUE"];
    }
}

但是这个 foreach 很慢(大约 10 秒)

问题:如何提高搜索速度?还是有更好的方法来获取基于值的值数组?

【问题讨论】:

  • 为什么不能使用给定的 select 语句只从数据库中选择您需要的数据而不是全部 100000 行?
  • 我必须从表中选择大约 100 次
  • 好的,创建条件数组并使用 IN 语句。 100K 行只会占用大量 RAM 和 CPU 时间来运行。

标签: php arrays


【解决方案1】:

由于您的foreachloop 是分开的,并且在数据库和脚本之间传输大数据需要很长时间(正如您所注意到的),您应该在从数据库读取时减少给定的结果集。

你正在写你需要从数据库中选择 100 次,所以我假设你的意思是你需要 100 个不同的行。 (否则只能选择一行并使用变量 100 次)。

按照我的意愿去做

您问题措辞的第二个假设:我假设只有con_idcon_category 的组合是唯一的。

首先,我将通过 foreachloop 创建 SQL 语句,以便仅在选择时创建,目标是让您的 100 行进行选择:

select * from content where (con_value = 'data1' and con_category = 'title') or (con_value = 'data2' and con_category = 'title') ...

为了改进 SQL 优化器的工作,您还应该在 con_idcon_category 两个列上添加一个 index

CREATE INDEX CIndex ON Content (con_id, con_category)

这应该会大大改善您的选择。

如果可能,进一步改进1) 如果con_id 是唯一的,则应仅通过IN (...) 子句选择id 和this。 再次使用带有 foreach 的 php 创建语句,或者如果可能的话,通过 implode 从基本信息中创建语句(也许是 $idlist = implode(",", $arrayofIDs); 所以你会得到 ​​p>

select * from content where con_id in ('001', '002')

然后您应该为其添加唯一索引以改进搜索。如果此 col 是您的主键 col 将其定义为 this 并且默认情况下它具有唯一索引。

2) 从您显示的结果集中,您的 con_id col 是字符串。如果可以,请将您的 con_id col 更改为数值,然后这样做!数字搜索比字符串搜索快得多!

3) 从您显示的结果集中,您的 con_category col 是字符串,但只有键值。如果可以,请将其更改为键,因此将“title”替换为 1,将“process”替换为 2,依此类推。然后在上面创建一个索引。因为它是数字 col 而不是字符串 col,所以您的搜索再次得到改进。

希望我的回答对你有所帮助。我认为你可以通过改进你的 SQL 来达到你的目标,这样你就可以扔掉复制庞大的结果集。并且在 100000 行内进行数据库侧搜索对于数据库来说不是挑战 - 这是他们的日常工作!

【讨论】:

  • 感谢重播,现在我从数据库中获取日志,并使用不同的 CON_ID 和 CON_CATEGORY 从内容中选择了 867 次。 CON_ID不明确,不同时间不同,无法优化sql查询。
猜你喜欢
  • 2015-10-17
  • 2012-12-14
  • 2020-01-05
  • 2016-09-30
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多