2009-06-03 20 views
10

Estoy usando PHP y MySQL. En mi programa hay una consulta de selección que implica uniones. Al ejecutarlo en el servidor local que funciona bien, pero cuando subo en mi servidor y tratar de ejecutarlo entonces se genera el siguiente error:MySQL: "El SELECT examinará más de MAX_JOIN_SIZE filas"

The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

¿Cómo puedo corregir esto?

+0

¿Cuál es el valor de SELECT @@ MAX_JOIN_SIZE en nuestra ¿servidor? SELECCIONE @@ MAX_JOIN_SIZE; tal vez es poco razonable o su consulta podría ser ... subóptima. – VolkerK

+0

Una buena respuesta a este problema está aquí: http://stackoverflow.com/a/950576/325365 –

Respuesta

8

intente ejecutar como una consulta previa ejecución de su selecto:

SET SQL_BIG_SELECTS=1 

Lo que tienes es ejecutar sobre un enorme conjunto de datos? Si no, esto debería resolverse de una manera diferente.

0

Me encontré con el mismo problema. Es un sitio drupal así que no es de extrañar que se haya caído.

Fue una consulta de estilo antiguo, es decir, Select blah From table1, table2, table3 Where table1.id=table2.id And table2.some = 'thing'

Como @VolkerK dice, la solución era mover las cláusulas WHERE que se filtraban resultados Tabla2 antes de lo que acertaron tabla1 a Tabla2 (efectivamente las cláusulas de unirse a), disminuyendo así la cantidad de registros que deben coincidir en la tabla2 con la tabla1.

17

Al usar PHP, SQL_BIG_SELECTS = 1 se debe establecer en una consulta separada antes de su consulta principal. Por ejemplo:

$mysqli = new mysqli("localhost", "root", "password", "db"); 

$mysqli->query("SET SQL_BIG_SELECTS=1"); //Set it before your main query 

$results = $mysqli->query("SELECT a, b, c FROM test"); 
while($row = $results->fetch_assoc()){ 
    echo '<pre>'; 
    print_r ($row); 
    echo '</pre>'; 
} 
+0

Sí, funciona bien. Gracias... – Chinmay235

0

Para mí, la solución fue agregar una clave de índice a todas las columnas que las uniones solían coincidir.

0

Si está utilizando el controlador DOP, establezca la PDO::MYSQL_ATTR_INIT_COMMAND en sus driver_options matriz cuando la construcción de una nueva base de datos manejar

así:

$dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET SESSION SQL_BIG_SELECTS=1')); 
Cuestiones relacionadas