Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
  • 0
boreas

Optimizar consulta de recomendación

Question

Hola, ya que Isidro sigue desaparecido en alguna isla del caribe y nadie sabe su paradero abro este tema para ver si entre todos podemos resolver esto. (aclaro nuevamente que no soy programador, soy un apasionado).

 

La función en cuestión es la que comparte los posts y el problema es el siguiente. Si yo tengo un par de seguidores puedo compartir un post en cuestión de segundos, todo bien, pero si tengo por ejemplo 800 tarda un par de minutos lo cuál no está bueno ya que además sobrecarga el servidor de tantas consultas...

 

/**
     * @name setSpam
     * @access public
     * @param none
     * @return string
     * @info ESTA FUNCION ES PARA REALIZAR RECOMENDACIONES
	*/
	public function setSpam(){
		global $tsCore, $tsUser, $tsActividad;
		//
		$postid = $_POST['postid'];
        // TIENE SEGUIDORES?
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.$tsUser->uid.'\'  AND f_type = \'1\' LIMIT 1');
        $seguidores = db_exec('num_rows', $query);
        // YA LO HA RECOMENDADO?
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.(int)$postid.'\' AND f_user = \''.$tsUser->uid.'\' AND f_type = \'3\' LIMIT 1');
        $recomendado = db_exec('num_rows', $query);
        
        if($seguidores < 1) return '0-Debes tener al menos un seguidor';
        if($recomendado > 0) return '0-No puedes recomendar el mismo post m&aacute;s de una vez.'; 
		//
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT post_user FROM p_posts WHERE post_id = \''.(int)$postid.'\' LIMIT 1');
		$data = db_exec('fetch_assoc', $query);
		
		//
		if($tsUser->uid != $data['post_user']){
            // GUARDAMOS EN FOLLOWS PUES ES LA RECOMENDACION PARA SU SEGUIDORES! xD
			db_exec(array(__FILE__, __LINE__), 'query', 'INSERT INTO u_follows (f_id, f_user, f_type, f_date) VALUES (\''.(int)$postid.'\', \''.$tsUser->uid.'\', \'3\', \''.time().'\') ');
			// NOTIFICAR
			if($this->setFollowNotificacion(6, 1, $tsUser->uid, $postid)) {
                $tsActividad->setActividad(4, $postid);
                return '1-La recomendaci&oacute;n fue enviada.';
			}
		} else return '0-No puedes recomendar tus posts.';
	}

¿Alguna idea?

  • Like 1

Share this post


Link to post
Share on other sites

21 answers to this question

Recommended Posts

  • 2

Pensándolo hoy mejor sin sueño, sí que puedes optimizar esa consulta muchísimo si evitas mover los datos entre mysql y php. En tu código las funciones que se encargan de seleccionar e insertar las notificaciones son setFollowNotification y setNotification respectivamente. Tendrás que sustituirlas por una consulta que seleccione e inserte las notificaciones directamente en la base de datos, sin tener que seleccionar los datos e iterarlos en php para hacer múltiples inserts. Es más fácil de lo que parece, sería algo así:

db_exec(array(__FILE__, __LINE__), 'query', "
INSERT INTO u_monitor (user_id, obj_user, obj_uno, obj_dos, obj_tres, not_type, not_date)
SELECT f_user, '{$tsUser->id}', '{$postId}', 0, 0, 6, 
FROM u_follows
WHERE f_id = '{$f_id}' AND f_type = '{$f_type}'
");

Haciendo así los inserts tarda poco menos de 2 segundos en insertar medio millón de filas. Haciendo los inserts por separado petó el script después de 5 minutos y solo hizo 84 mil xD

Por cierto, $f_id es $tsUser->uid y $f_type es 1, que se me ha olvidado sustituirlo en el código.

  • Like 1
  • Thanks 3

Share this post


Link to post
Share on other sites
  • 0

Envia la noti a los ultimos 30 conectados de la lista de amigos y la recomendacion directo como un enlace en su muro 

Share this post


Link to post
Share on other sites
  • 0
hace 1 hora, Rhuan dijo:

Pensándolo hoy mejor sin sueño, sí que puedes optimizar esa consulta muchísimo si evitas mover los datos entre mysql y php. En tu código las funciones que se encargan de seleccionar e insertar las notificaciones son setFollowNotification y setNotification respectivamente. Tendrás que sustituirlas por una consulta que seleccione e inserte las notificaciones directamente en la base de datos, sin tener que seleccionar los datos e iterarlos en php para hacer múltiples inserts. Es más fácil de lo que parece, sería algo así:

db_exec(array(__FILE__, __LINE__), 'query', "
INSERT INTO u_monitor (user_id, obj_user, obj_uno, obj_dos, obj_tres, not_type, not_date)
SELECT f_user, '{$tsUser->id}', '{$postId}', 0, 0, 6, 
FROM u_follows
WHERE f_id = '{$f_id}' AND f_type = '{$f_type}'
");

Haciendo así los inserts tarda poco menos de 2 segundos en insertar medio millón de filas. Haciendo los inserts por separado petó el script después de 5 minutos y solo hizo 84 mil xD

Por cierto, $f_id es $tsUser->uid y $f_type es 1, que se me ha olvidado sustituirlo en el código.

Deberá quedar así o hice algo mal?

 

public function setSpam(){
		global $tsCore, $tsUser, $tsActividad;
		//
		$postid = $_POST['postid'];
        // TIENE SEGUIDORES?
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.$tsUser->uid.'\'  AND f_type = \'1\' LIMIT 1');
        $seguidores = db_exec('num_rows', $query);
        // YA LO HA RECOMENDADO?
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.(int)$postid.'\' AND f_user = \''.$tsUser->uid.'\' AND f_type = \'3\' LIMIT 1');
        $recomendado = db_exec('num_rows', $query);
        
        if($seguidores < 1) return '0-Debes tener al menos un seguidor';
        if($recomendado > 0) return '0-No puedes recomendar el mismo post m&aacute;s de una vez.'; 
		//
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT post_user FROM p_posts WHERE post_id = \''.(int)$postid.'\' LIMIT 1');
		$data = db_exec('fetch_assoc', $query);
		
		//
		if($tsUser->uid != $data['post_user']){
            // GUARDAMOS EN FOLLOWS PUES ES LA RECOMENDACION PARA SU SEGUIDORES! xD
			db_exec(array(__FILE__, __LINE__), 'query', "
            INSERT INTO u_monitor (user_id, obj_user, obj_uno, obj_dos, obj_tres, not_type, not_date)
            SELECT f_user, '{$tsUser->id}', '{$postId}', 0, 0, 6, 
            FROM u_follows
            WHERE f_id = '{$tsUser->uid}' AND f_type = '1'");
			// NOTIFICAR
			if($this->setFollowNotificacion(6, 1, $tsUser->uid, $postid)) {
                $tsActividad->setActividad(4, $postid);
                return '1-La recomendaci&oacute;n fue enviada.';
			}
		} else return '0-No puedes recomendar tus posts.';
	}

 

Share this post


Link to post
Share on other sites
  • 0

Lo has hecho mal. Te he dicho que sustituyas la función setFollowNotification por la consulta y has sustituido la consulta de arriba que no tiene nada que ver xD

 

Debería quedar así:

	public function setSpam(){
		global $tsCore, $tsUser, $tsActividad;
		//
		$postid = $_POST['postid'];
		// TIENE SEGUIDORES?
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.$tsUser->uid.'\'  AND f_type = \'1\' LIMIT 1');
		$seguidores = db_exec('num_rows', $query);
		// YA LO HA RECOMENDADO?
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.(int)$postid.'\' AND f_user = \''.$tsUser->uid.'\' AND f_type = \'3\' LIMIT 1');
		$recomendado = db_exec('num_rows', $query);
		
		if($seguidores < 1) return '0-Debes tener al menos un seguidor';
		if($recomendado > 0) return '0-No puedes recomendar el mismo post m&aacute;s de una vez.'; 
		//
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT post_user FROM p_posts WHERE post_id = \''.(int)$postid.'\' LIMIT 1');
		$data = db_exec('fetch_assoc', $query);
		
		//
		if($tsUser->uid != $data['post_user']){
			// GUARDAMOS EN FOLLOWS PUES ES LA RECOMENDACION PARA SU SEGUIDORES! xD
			db_exec(array(__FILE__, __LINE__), 'query', 'INSERT INTO u_follows (f_id, f_user, f_type, f_date) VALUES (\''.(int)$postid.'\', \''.$tsUser->uid.'\', \'3\', \''.time().'\') ');
			// NOTIFICAR
			$query = db_exec(array(__FILE__, __LINE__), 'query', "
			INSERT INTO u_monitor (user_id, obj_user, obj_uno, obj_dos, obj_tres, not_type, not_date)
			SELECT f_user, '{$tsUser->uid}', '{$postid}', 0, 0, 6, ".time()."
			FROM u_follows
			WHERE f_id = '{$tsUser->uid}' AND f_type = 1
			");
			// COMPROBAR
			if($query) {
				$tsActividad->setActividad(4, $postid);
				return '1-La recomendaci&oacute;n fue enviada.';
			}
		} else return '0-No puedes recomendar tus posts.';
	}

 

  • Thanks 1

Share this post


Link to post
Share on other sites
  • 0
hace 7 minutos, Rhuan dijo:

Lo has hecho mal. Te he dicho que sustituyas la función setFollowNotification por la consulta y has sustituido la consulta de arriba que no tiene nada que ver xD

 

Debería quedar así:

	public function setSpam(){
		global $tsCore, $tsUser, $tsActividad;
		//
		$postid = $_POST['postid'];
		// TIENE SEGUIDORES?
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.$tsUser->uid.'\'  AND f_type = \'1\' LIMIT 1');
		$seguidores = db_exec('num_rows', $query);
		// YA LO HA RECOMENDADO?
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.(int)$postid.'\' AND f_user = \''.$tsUser->uid.'\' AND f_type = \'3\' LIMIT 1');
		$recomendado = db_exec('num_rows', $query);
		
		if($seguidores < 1) return '0-Debes tener al menos un seguidor';
		if($recomendado > 0) return '0-No puedes recomendar el mismo post m&aacute;s de una vez.'; 
		//
		$query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT post_user FROM p_posts WHERE post_id = \''.(int)$postid.'\' LIMIT 1');
		$data = db_exec('fetch_assoc', $query);
		
		//
		if($tsUser->uid != $data['post_user']){
			// GUARDAMOS EN FOLLOWS PUES ES LA RECOMENDACION PARA SU SEGUIDORES! xD
			db_exec(array(__FILE__, __LINE__), 'query', 'INSERT INTO u_follows (f_id, f_user, f_type, f_date) VALUES (\''.(int)$postid.'\', \''.$tsUser->uid.'\', \'3\', \''.time().'\') ');
			// NOTIFICAR
			$query = db_exec(array(__FILE__, __LINE__), 'query', "
			INSERT INTO u_monitor (user_id, obj_user, obj_uno, obj_dos, obj_tres, not_type, not_date)
			SELECT f_user, '{$tsUser->uid}', '{$postid}', 0, 0, 6, ".time()."
			FROM u_follows
			WHERE f_id = '{$tsUser->uid}' AND f_type = 1
			");
			// COMPROBAR
			if($query) {
				$tsActividad->setActividad(4, $postid);
				return '1-La recomendaci&oacute;n fue enviada.';
			}
		} else return '0-No puedes recomendar tus posts.';
	}

 

Te amo

Share this post


Link to post
Share on other sites
  • 0
hace 49 minutos, camila dijo:

boreas como lo soluciono. A mi me pasa eso

Te lo puse en tu web. Probalo y me decís.

  • Thanks 1

Share this post


Link to post
Share on other sites
  • 0
hace 54 minutos, boreas dijo:

Te lo puse en tu web. Probalo y me decís.

gracias...yo vació desde el cpanel todos los días para que sea mas rápido eso....ahora ya mañana después de recomendar unos post ahí te aviso si funciono. PD muchas gracias

Share this post


Link to post
Share on other sites
  • 0

Funciona genial. No se puede hacer lo mismo para los post, cuando creas un post, los usuarios que tienen muchos seguidores tardan en crear un post, tarda como 1 minuto. Yo vació todos los días la tabla u_ monitor para que no me pase eso, no hay una solución mejor?

Share this post


Link to post
Share on other sites
  • 0
On 22/1/2020 at 21:33, Rhuan dijo:

Pensándolo hoy mejor sin sueño, sí que puedes optimizar esa consulta muchísimo si evitas mover los datos entre mysql y php. En tu código las funciones que se encargan de seleccionar e insertar las notificaciones son setFollowNotification y setNotification respectivamente. Tendrás que sustituirlas por una consulta que seleccione e inserte las notificaciones directamente en la base de datos, sin tener que seleccionar los datos e iterarlos en php para hacer múltiples inserts. Es más fácil de lo que parece, sería algo así:

db_exec(array(__FILE__, __LINE__), 'query', "
INSERT INTO u_monitor (user_id, obj_user, obj_uno, obj_dos, obj_tres, not_type, not_date)
SELECT f_user, '{$tsUser->id}', '{$postId}', 0, 0, 6, 
FROM u_follows
WHERE f_id = '{$f_id}' AND f_type = '{$f_type}'
");

Haciendo así los inserts tarda poco menos de 2 segundos en insertar medio millón de filas. Haciendo los inserts por separado petó el script después de 5 minutos y solo hizo 84 mil xD

Por cierto, $f_id es $tsUser->uid y $f_type es 1, que se me ha olvidado sustituirlo en el código.

Esto funciona perfecto , se quedaba un rato largo pensando

Cuando agregas un post pasa lo mismo , con muchos seguidores se hace casi imposible publicar un post ..

Creo que el problema es similar al que solucionaste 

Esta linea esta en c.post

// AGREGAR AL MONITOR DE LOS USUARIOS QUE ME SIGUEN
                // $tsMonitor->setFollowNotificacion(5, 1, $tsUser->uid, $postID);

¿como se podria mejorar ? Gracias

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Patrocinador



  • ×