Я записал этот код, чтобы сравнить две таблицы и узнать разницу, но она очень медленная, обычно приходится сравнивать строки 4k. на самом деле требуется 3 минуты. благодаря
$query = $pdo->query("select * from tab1 order by date_time ASC"); $calls = array(); foreach($query as $row){ //check the differences $from = substr($row['from'],4,15); //remove prefix $date_time = date('Ymd H:i:s' , strtotime('-2 minute',strtotime($row['date_time']))); //decrese of 2 min the time to match all time differences $duration = $pdo->query( "select duration , abs(duration - ".$row['duration'].") as duration_diff , price from tab2 where date_time between '".$date_time."' and '".$row['date_time']."' and from like '%".$row['from']."' and duration >0 order by duration_diff" )->fetch(); //highlight the differences if ($row['duration'] > $duration['duration'] ): $color = "#ff0000"; elseif ($row['duration'] < $duration['duration'] ): $color = "#ff9900"; else: $color = "#fff"; endif; $calls[] = array( "date_time" => $row['date_time'], "from" => $row['from'], "to" => $row['to'], "duration_tab1" => $row['duration'], "duration_tab2" => $duration['duration'], "price_tab1" => $row['price'], "price_tab2" => substr($duration['price'],0,6), "color" => $color); }
Все поля в структуре таблицы являются varchar, нет индексов. Какие индексы на каких полях необходимо добавить для повышения производительности? благодаря
В вашем коде есть N + 1 Mysql Query.
Поскольку строки 4k не слишком много, я предлагаю вам получить всю таблицу1 и таблицу2. И сделайте сравнение в PHP-коде. Это должно быть быстрее.
$query = $pdo->query("select * from tab1 order by date_time ASC"); $query1 = $pdo->query("select * from tab2 order by date_time ASC"); ....
Вытягивание значения в землю php из запроса в цикле, а затем вложение этого значения в другой запрос, выполняемый в цикле, является анти-шаблоном.
Ваша база данных не нормализована – что вызывает множество осложнений для вас.
Ваша база данных очень слабо связана, что усложняет сложность.
Вы не указали никаких деталей структуры таблицы и индексов.
В вашей задаче проблемы не учитывается относительная мощность наборов данных – например, что происходит, если в tab2 нет соответствующих строк.
Если вы исправили свою схему, то было бы тривиально выполнять объединение в базе данных. Как бы то ни было, я крайне сомневаюсь в том, будет ли ваш код воспроизводить воспроизводимые результаты. Однако те же результаты можно получить, используя функцию, чтобы вытащить соответствующие записи из таблицы 2, что-то вроде ….
CREATE FUNCTION tab2data(pfrom VARCHAR , pdate_time DATETIME , pduration FLOAT) RETURNS VARCHAR BEGIN DECLARE result VARCHAR(200); SELECT CONCAT(tab2.duration, '#', ABS(tab2.duration-pduration), '#', tab2.date_time, '#', tab2.price, '#', tab2.`from`, '#', tab2.`to`, '#') INTO result FROM tab2 WHERE `from` LIKE CONCAT('%',pfrom) AND date_time BETWEEN pdate_time AND pdate_time + INTERVAL 2 MINUTE AND duration>0 ORDER BY ABS(tab2.duration-pduration) LIMIT 0,1; return result; END;