Оптимизируйте скрипт PHP / MySQL, чтобы уменьшить использование сервера

У меня есть веб-сайт с более чем 1000 000 просмотров страниц в день и сценарием php для отображения 2-3 рекламных баннеров на каждой странице и подсчета показов.

Для подсчета показов после каждого баннера есть изображение:

<img src="https://example.com/impression.php?client=ABC&banner=XYZ" width=1 height=1>

Это пример сценария показа:

require('global.php'); // connect to mysql, read default settings, etc

if( isset( $_GET['client'] ) ) && !empty( $_GET['client'] ) ) { $client = secure( $_GET['client'] ); } else { die('error param'); }
if( isset( $_GET['banner'] ) ) && !empty( $_GET['banner'] ) ) { $banner = secure( $_GET['banner'] ); } else { die('error param'); }

$check_client = mysqli_query( $con, "SELECT id FROM clients WHERE id = '$client' AND status = 1 LIMIT 1" ) or die( 'error mysql' );
if( mysqli_num_rows( $check_client ) == 0 ) { die('error client'); }

$check_banner = mysqli_query( $con, "SELECT campaign_id FROM banners WHERE id = '$banner' AND status = 1 LIMIT 1" ) or die( 'error mysql' );
if( mysqli_num_rows( $check_banner ) == 0 ) { die('error banner'); }
$read_campaign_id = mysqli_fetch_array( $check_banner );

$check_campaign = mysqli_query( $con, "SELECT id FROM campaigns WHERE id = '$read_campaign_id[0]' AND status = 1 LIMIT 1" ) or die( 'error mysql' );
if( mysqli_num_rows( $check_campaign ) == 0 ) { die('error campaign' );  }

$check_unique = mysqli_query( $con, "SELECT id FROM impressions WHERE datetime LIKE '$today%' AND banner = '$banner' AND ip = '$ip' ORDER BY datetime DESC LIMIT 1" ) or die( 'error mysql');
if( mysqli_num_rows( $check_unique ) == 1 ) { $unique = 0; } else { $unique = 1; }

mysqli_query( $con, "INSERT INTO impressions ( client, campaign, banner, datetime, unique, ip, page ) VALUES ( '$client', '$read_campaign_id[0]', '$banner', '$now', '$unique', '$ip', '$url' )" ) or die( 'error mysql' );

header( 'Content-type: image/png' );
header( $path . '/img/pixel.png' );
mysqli_close( $con );
exit;

В этом случае, что является лучший способ оптимизировать сценарий и уменьшить использование ресурсов и одновременных подключений на моем сервере?

  • Например, можно ли объединить какой-нибудь запрос MySQL в одном запросе? Я думаю, что должно быть намного быстрее, но я не уверен …
  • Другим возможным способом может быть сохранение показов в файле CSV, и каждые 2-5 минут импортировать этот файл в MySQL? но это только сохранить 1 запрос …

РЕДАКТИРОВАТЬ:
Это структура таблицы mysql (только с полезными полями для этого примера)
http://sqlfiddle.com/#!2/1ffe3/1

0

Решение

Да, вы можете выполнить все выборки в одном запросе.

Скорее запутанно (поскольку вам требуется только один ряд от каждого, и между ними нет очевидной связи), вы можете сделать это с помощью декартового произведения.

Ваша схема отстой (ГДЕ datetime НРАВИТСЯ ‘$ today%’, используя строку для хранения даты !!!!)

Почему вы упорядочиваете результат проверки $ check_unique, когда хотите увидеть, существует ли какая-либо строка?

SELECT clients.id AS client_id
, banner.campaign_id AS banner_campaign_id
, campaign_id
,(SELECT COUNT(*)
FROM impressions
WHERE impressions.datetime LIKE '$today%'
AND impressions.banner = '$banner'
AND ip = '$ip'
LIMIT 1) AS check_unique
FROM clients
INNER JOIN banners
INNER JOIN campaigns
WHERE clients.id = '$client' AND clients.status = 1
AND banners.id = '$banner' AND banners.status = 1
AND campaigns.id = '$read_campaign_id[0]' AND campaigns.status = 1
LIMIT 1

В качестве альтернативы вы можете развернуть его в СОЮЗ, но это гораздо менее весело.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]