如何让这个mysqli查询在PHP中运行得更快?

时间:2014-12-08 20:11:10

标签: php mysql sql time mysqli

$ networks是具有与逗号分隔的多个值的字符串。 示例:

$networks = "Programming,Movies,Hollywood". (There can be around 150 values or more.)    

现在Mysql查询在这里:

$query = "SELECT * FROM table 
          WHERE ( isActive = 1 AND 
                  isDeleted = 0 AND 
                  onid = '0' AND 
                  question = 0 AND 
                  ( ".$networkqur." )
                ) 
ORDER BY id DESC
LIMIT 0,100;

这里$ networkqur是:

$network = explode(',',$networks);

$networkqur = '';
for( $i = 0; $i < count($network); $i++ ){
    $networkqur .= 'networks LIKE "%'.$network[$i].'%"';
    if( $i != count($network) - 1 ){
        $networkqur .= ' OR ';
    }
}

因此有效$ networkqur变为:

$networkqur = "networks LIKE "%Programming%" OR 
               networks LIKE "%Movies%" OR 
               networks LIKE "%Hollywood%";

有效查询成为:

$query = "SELECT * FROM posts
          WHERE ( isActive = 1 AND 
                  isDeleted = 0 AND 
                  onid = '0' AND 
                  question = 0 AND 
                   ( networks LIKE "%Programming%" OR 
                     networks LIKE "%Movies%" OR 
                     networks LIKE "%Hollywood% ) 
                   ) 
          ORDER BY id DESC
          LIMIT 0,100;

现在我们可以看到查询中有150个OR条件和多个AND条件,最后有Sorting。
是否可以替换此特定查询或以其他任何更快的方式执行它?

2 个答案:

答案 0 :(得分:2)

您在设计或数据库中犯了一个可怕的错误。在设计数据库时应遵循六条数据库规范化规则,并且您已经打破了第一个也是最重要的数据库 - 在每列中存储一条且只有一条信息。

除了在数据库之上实现复杂的全文索引系统之外,没有办法优化您当前的设计。此外,没有办法执行关系完整性(检查是否只存储了允许的network值。您无法索引这些值,也无法在JOIN中使用它们。此外,您有一个嵌入式字符串问题,其中寻找(例如)&#34; Holly&#34;将匹配&#34; Holly&#34;,&#34; Hollywood&#34;和&#34; Holly Hunter&#34;。

您应该将networks列拆分为单独的表格post_networks,其中包含post_id列和network列。每个帖子添加一行&amp;网络组合,在(post_id, network)上添加PRIMARY KEY,在(network, post_id)上添加一个PRIMARY KEY,您将能够更快速,更安全地执行此查询(以及更多)。

答案 1 :(得分:0)

如果您的术语列表相对固定(即不是用户生成的),那么这里的一个解决方案是构建您自己的索引表,然后对其进行检查。如果您在添加/编辑主数据时执行构建索引 的接触点,则可以极大地提高SELECT语句的速度。因此,您的索引表将包含每个记录的主键(理想情况下为PRIMARY KEY),然后是您要查找的内容的引用。然后,您可以将INDEX添加到术语列,并且由于您正在对索引列进行查找,因此速度会显着提高。

理想情况下,您永远不应该对未编制索引的数据进行查找。