PHP和SQL:代码非常慢

时间:2016-10-20 16:06:07

标签: php mysql sql

$unique = array();
$sql = "SELECT ID, TitleName, ArtistDisplayName, Mix FROM values_to_insert as A
        WHERE A.ID = ";

//Get a single row from our data that needs to be inserted...
while($result = $conn->query(($sql. $count)))
{

    //Get the $data of the single row query for inserting.
    $data = mysqli_fetch_row($result);
    $count++;

    //SQL to get a match of the single row of $data we just fetched...
    $get_match = "SELECT TitleName_ti, Artist_ti, RemixName_ti from titles as B
                    Where B.TitleName_ti = '$data[1]'
                    and B.Artist_ti = '$data[2]'
                    and B.RemixName_ti = '$data[3]' 
                    LIMIT 1";

    //If this query returns a match, then push this data to our $unique value array.
    if(!$result = $conn->query($get_match))
    {
        //If this data has been pushed already, (since our data includes repeats), then don't 
        //put a repeat of the data into our unique array. Else, push the data.
        if(!in_array($unique, $data))
        {
            echo 'Pushed to array: ' . $data[0] . "---" . $data[1] . "</br>";
            array_push($unique, $data);
        }
        else
            echo'Nothing pushed... </br>';
    }
}

这需要5分钟以上,甚至没有任何内容打印到屏幕上。我很好奇吃了这么多时间吃什么,可能是一种替代方法或功能,无论它一直在吃什么。我想一些正确方向的指针会很棒。

此代码基本上获取表'A'的所有行,一次一个。检查表'B'中是否匹配,如果有,那么我不想要$ data,但如果没有,我会检查数据本身是否重复,因为我的表' A'有一些重复值。

表A有60,000行 表B有200,000行

1 个答案:

答案 0 :(得分:2)

查询中的查询很少是个好主意

但是您的脚本似乎存在多个问题。在SQL中执行整个操作可能更容易,并且每次都将结果推送到数组。 SQL可以删除重复项: -

<?php 

$unique = array();
$sql = "SELECT DISTINCT A.ID, 
                A.TitleName, 
                A.ArtistDisplayName, 
                A.Mix 
        FROM values_to_insert as A
        LEFT OUTER JOIN titles as B
        ON B.TitleName_ti = A.ID
        and B.Artist_ti = A.TitleName
        and B.RemixName_ti = A.ArtistDisplayName
        WHERE B.TitleName_ti IS NULL
        ORDER BY a.ID";

if($result = $conn->query(($sql)))
{
    //Get the $data of the single row query for inserting.
    while($data = mysqli_fetch_row($result))
    {
        array_push($unique, $data);
    }
}

关于您的原始查询。

你有一个计数(我假设它被初始化为0,但是如果一个角色然后会做奇怪的事情),并获得具有该值的记录。如果第一个id为1,000,000,000,那么在找到要处理的记录之前,您已经完成了1b个查询。您可以通过删除WHERE子句并按ID排序来获取ID顺序中的所有行。

然后,您只需从第二个查询中获取单个记录,其中详细信息匹配,但仅在未找到记录时才处理它们。您不使用任何返回的值。您可以通过执行LEFT OUTER JOIN来获取匹配项,并检查WHERE子句中是否没有匹配项来完成此操作。

编辑 - 正如您所指出的,您似乎用于匹配记录的字段似乎在逻辑上不匹配。我已按照你的方式使用它们,但我希望你真的想将B.TitleName_ti与A.TitleName,B.Artist_ti与A.ArtistDisplayName和B.RemixName_ti匹配到A.Mix