2010-09-03

MySQL Como optimizar resultados aleatorios sin perder perforan.

Crear un RAND que sea optimo cuando tenes muchos registros en la base de datos. Ya que el ejemplo tiplico que esta por todos lados cuando tenes una base de datos muy grande pierder performan.

Ejemplo tipico de una fila aleatoria QUE NO ES OPTIMO:

  1. “SELECT * FROM producto ORDER BY rand(” . time() . ” * ” . time() . “) LIMIT 3″;

  2. # O este otro ejemplo
  3.  
  4. “SELECT * FROM producto ORDER BY rand() LIMIT 3″;

Ejemplo 1: Tiene mejor rendimiento cuando tenes muchos mas datos "ES OPTIMO".

  1. SELECT
  2. RAND() as aleatorio,
  3. producto.*
  4. FROM
  5. producto
  6. WHERE
  7. producto.id < (SELECT  ABS(FLOOR(MAX(producto.id)/RAND((CAST(SECOND(NOW())AS UNSIGNED)+1)/RAND()))) FROM producto LIMIT 1)
  8. ORDER BY aleatorio
  9. LIMIT 3 
 Ejemplo 2: Esta tiene un poco mas de performan frente al ejemplo anterior

  1. SELECT  
  2. RAND() as aleatorio, 
  3. P.* 
  4. FROM producto P 
  5. JOIN (SELECT ABS(FLOOR(MAX(producto.id)/RAND((CAST(SECOND(NOW())AS UNSIGNED)+1)/RAND()))) AS ID FROM producto LIMIT 1) AS x ON P.id < x.ID 
  6. ORDER BY aleatorio 
  7. LIMIT 3;
 Ejemplo 3.A: Este tiene mas performan que el ejemplo 1 y 2.


  1. SELECT * FROM 
  2. (SELECT RAND() as aleatorio, producto.* FROM producto WHERE productoid like '%' LIMIT 100) AS P 
  3. ORDER BY P.aleatorio 
  4. LIMIT 3


Ejemplo 3.B: Si queres tener mejor performan en el "Ejemplo 3.A"; no tenes que llamar a todos los campos " producto.* " solo a los que necesitas. 


  1. SELECT * FROM 
  2. (SELECT RAND() as aleatorio, productoid, marca, nombre FROM producto WHERE productoid like '%' LIMIT 100) AS P 
  3. ORDER BY P.aleatorio 
  4. LIMIT 3

    No hay comentarios: