Оптимизация на много бавен код

alex95_bg_2

Registered
Имам този код:
Код:
$end = @mktime(0, 0, 0, date("m"), date("d")+1, date("Y")); 
$start = @strtotime("-12 days",$end);

for($i=1;$i<=12;$i++) {
$time = @strtotime("+1 day",$start);

$query = mysql_query("SELECT ip FROM visits WHERE id_site='$id_site' AND date>$start AND date<$time GROUP BY ip") or die(mysql_error());
$num = mysql_num_rows($query);

if($i == 1) $max = $num;

if($max < $num) $max = $num;

$data[] = $num;

$xlabels[] = @date("j M",$start);

$start = @strtotime("+1 day",$start);

}
работи си ОК, но е мноого бавен
бави го GROUP BY заявката, в таблицата има 127261 записа но и факта, че се изпълнява 12 пъти
Аз не се сещам за друг начин но възможно ли е този код да се оптимизира - например да е без цикъл а изкарването с интервали да е в заявката :)

Има индекс на полето ip

Много ще съм ви благодарен
 
До колкото разбирам искаш просто да вземеш броя на уникалните IP-та, затова опитай и това:

$query = mysql_query("SELECT count(distinct(ip)) FROM visits WHERE id_site='$id_site' AND date BETWEEN $start AND $time") or die(mysql_error());
$num = mysql_result($query, 0);
 
Немога да ти го напиша, понеже ни те знам другия код и структурата на таблицата. Обаче докато правех моя брояч доста се мъчих и измислих ето това. Първо

Това

for($i=1;$i<=12;$i++) {
$time = @strtotime("+1 day",$start);

го правиш на
$time = strtotime("+12 days",$start);

И изпълняваш 1 път заявката, обаче групираш и по

GROUP BY FROM_UNIXTIME(`date`, '%d.%m.%Y')

Така ще групира резултатите от всеки 1 ден. Нещо такова ще стане

SELECT ip, COUNT(*) AS `pose6teniq`, COUNT(`ip`) AS `unikalni` FROM visits WHERE id_site='$id_site' AND date>$start AND date<$time GROUP BY ip, FROM_UNIXTIME(`date`, '%d.%m.%Y')

И после ползваш pose6teniq за импресиите, а unikalni за уникалните за всеки ден. То за 12 дни ще са 12 реда изкарани.

Също mysql_num_rows е много бавно нещо. По-добре ползвай това, което съм ти дал по-горе (COUNT(..) AS `....`) - то е в пъти по-бързо.
 
мерси storm, сега ще я погледна заявката :)
знам, направих го с COUNT в сегашния вариант но е същия резултат горе/долу

а за @ бях сетнал друга таймзона, на сървъра не дава грешки а само на бозата ми докато бях на нея
 
заявката връща доста повече резултати :?
би ли ми обяснил логикат аза да помисля зашо? :)

аа ето я структuрата:
Код:
mysql> USE wstats_main;
Database changed
mysql> DESCRIBE visits;
+--------------+------------------+------+-----+-----------------+----------------+
| Field        | Type             | Null | Key | Default         | Extra          |
+--------------+------------------+------+-----+-----------------+----------------+
| id           | int(10) unsigned | NO   | PRI | NULL            | auto_increment | 
| id_site      | int(10)          | NO   |     |                 |                | 
| date         | int(10)          | NO   |     |                 |                | 
| ip           | int(10)          | NO   | MUL |                 |                | 
| url          | varchar(255)     | NO   |     |                 |                | 
| ref          | varchar(255)     | NO   |     |                 |                | 
| resolut      | varchar(32)      | NO   |     |                 |                | 
| browser_name | varchar(32)      | NO   |     |                 |                | 
| country      | varchar(255)     | NO   |     | Unknown|Unknown |                | 
| os           | varchar(32)      | NO   |     |                 |                | 
+--------------+------------------+------+-----+-----------------+----------------+
10 rows in set (0.00 sec)

Код:
CREATE TABLE IF NOT EXISTS `visits` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `id_site` int(10) NOT NULL,
  `date` int(10) NOT NULL,
  `ip` int(10) NOT NULL,
  `url` varchar(255) NOT NULL,
  `ref` varchar(255) NOT NULL,
  `resolut` varchar(32) NOT NULL,
  `browser_name` varchar(32) NOT NULL,
  `country` varchar(255) NOT NULL default 'Unknown|Unknown',
  `os` varchar(32) NOT NULL,
  UNIQUE KEY `id` (`id`),
  KEY `ip` (`ip`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=132033 ;

:)
 
Код:
SELECT COUNT(*) AS BROI FROM visits WHERE TIMESTAMPDIFF(DAY,FROM_UNIXTIME(`date`),CURRENT_TIMESTAMP())<13 GROUP BY ip ORDER BY BROI DESC;
Edit: или
Код:
SELECT ip,`date`,COUNT(*) AS BROI FROM visits WHERE TIMESTAMPDIFF(DAY,FROM_UNIXTIME(`date`),CURRENT_TIMESTAMP())<13 GROUP BY ip,`date` ORDER BY BROI DESC;
:?:
 

Back
Горе