SQL_BIG_SELECTS

Hace un tiempo desarrollamos una tienda online. El caso es que hasta ahora había estado funcionando sin ningún problema ni error. Pero ayer nos llega un email del cliente diciéndonos que la tienda ha dejado de funcionar.

Sorprendidos accedemos a la tienda, y efectivamente cuando seleccionabas una categoría la web mostraba un error. El mensaje de error que salía en la página decía lo siguiente:

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

Cargo la base de datos en local y como en otras muchas ocasiones, funciona. ¡Pues nada, será alguna opción de configuración del servidor!, tras investigar por el maravilloso mundo de internet (con google a la cabeza por supuesto) y darle un poco a la cabeza encontramos la solución.

El problema viene porque la tienda ya tiene un volumen considerable de artículos (unos 2660) y de categorías y en una de las consultas se hacen bastantes relaciones entre ellas.

Ese error es debido a la variable de MySQL SQL_BIG_SELECTS

SQL_BIG_SELECTS
Con valor 0, MySQL aborta los comandos SELECT que probablemente tardarán mucho tiempo (esto es, comandos para los que el optimizador estima que el número de registros examinados excede el valor de max_join_size). Esto es útil cuando un comando WHERE no aconsejable se ejecuta. El valor por defecto para una nueva conexión es 1, que permite todos los comandos SELECT .

Si cambia la variable de sistema max_join_size a un valor distinto a DEFAULT, SQL_BIG_SELECTS se pone a 0.

Para solucionar el error basta con ejecutar la consulta

SET SQL_BIG_SELECTS=1

antes de ejecutar la consulta original problemática y listo!

El problema de todo radica en que cuando se desarrolla un sitio el testeo que se hace suele ser con un volumen pequeño de información, y que que cuando realmente el proyecto lleva un tiempo y ya tiene mucha información pueden surgir este tipo de problemillas.