ORDER BY RAND que causa una carga muy alta

Tengo la siguiente consulta

$samecars = $this->QueryResult("SELECT * FROM carads where STATUS='1' and DEL='0' and TITLE !='' and IMAGE1 != '' and IMAGE1 != '-1' and PRICE BETWEEN $pricelow and $pricehigh order by RAND() LIMIT 0,3"); 

Cuando elimino RAND() la consulta se ejecuta casi al instante; si agrego el RAND() , demorarán unos 10-30 segundos.

Hay aproximadamente 1 millón de filas en las mesas de caramelos. Necesito RAND () para usar la visualización aleatoria.

Más detalles:

QueryResult ve así

 public function QueryResult($strQuery) { $this->connector(); $query = mysqli_query($this->link, $strQuery); $arr = array(); if ($query) { while ($result = mysqli_fetch_object($query)) { array_push($arr, $result); } } $this->close(); return $arr; } 

TAMBIÉN probé agregar en SQL el siguiente comando de ejemplo

 SELECT * FROM carads where STATUS='1' and DEL='0' and TITLE !='' and IMAGE1 != '' and IMAGE1 != '-1' and PRICE BETWEEN 8000 and 15000 order by RAND() LIMIT 0,3" 

y RAND () se resalta en rojo y cuando lo ejecuto a través de #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"' at line 3 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"' at line 3

Solutions Collecting From Web of "ORDER BY RAND que causa una carga muy alta"

1. Muestreo de la ruleta rusa

La razón por la que RAND() causa problemas es porque se consultan todas las filas de la tabla en lugar de, por ejemplo, las tres primeras. Además, la clasificación lleva tiempo.

Una idea para acelerar el procesamiento es usar el muestreo de la ruleta rusa:

 SELECT * FROM carads where STATUS='1' and DEL='0' and TITLE !='' and IMAGE1 != '' and IMAGE1 != '-1' and PRICE BETWEEN $pricelow and $pricehigh AND RAND() < 0.001 LIMIT 0,3 

donde 0.001 es bastante pequeño. El problema con este método es que los artículos no se recogerán de manera uniforme (los primeros artículos tienen más posibilidades). Además, la probabilidad debería depender del tamaño de la tabla (por lo tanto, ocasionalmente, una herramienta de administración debería recalcular la probabilidad). Sin embargo, es una solución pragmática al problema.

2. PHP hace (la mayoría) del trabajo

Como solo hay tres filas, puede ejecutar el siguiente procedimiento:

  1. Primero consulta la base de datos para encontrar el número de filas
  2. Genera tres números aleatorios distintos entre 0 y el número de filas (exclusivo)
  3. Consulta las tres filas y procesa los datos.

Otra razón por la que la consulta se ejecuta lentamente es que cuando se usa una función agregada como rand (), funciones de tiempo, etc. … impide que la consulta se guarde en caché. Entonces, una buena práctica es intentar y no usar este tipo de funciones en la consulta SQL y pasarlas con php como:

 $query = "SELECT * FROM table order by " . rand(); 

en lugar de

 $query = "SELECT * FROM table order by RAND()"; 

Espero que haya sido útil.

Saludos