MySQL – SQL_BIG_SELECTS

Hola, he estado investigando SQL_BIG_SELECTS, pero la documentación de MySQL hasta ahora ha sido bastante inútil. Estoy buscando información para evitar que aparezcan errores como el de abajo.

ERROR 1104: El SELECT examinaría demasiados registros y probablemente lleve mucho tiempo. Compruebe su WHERE y use SET OPTION SQL_BIG_SELECTS = 1 si SELECT está bien

  1. ¿En cuántas filas decide MySQL que una consulta es “BIG SELECT”?
  2. ¿La indexación correcta generalmente resolverá este problema?
  3. ¿SQL_BIG_SELECTS se considera un “último recurso” o es una buena práctica?
  4. ¿Cómo podría alguien configurar “SQL_BIG_SELECTS = 1” en la configuración (sin tener que ejecutar la consulta)?
  5. ¿Hay alguna otra alternativa que valga la pena conocer?

¡Gracias por adelantado!

  1. MySQL determina si una consulta es o no una ‘gran selección’ en función del valor de ‘max_join_size’. Si es probable que la consulta tenga que examinar más que este número de filas, la considerará una ‘gran selección’. Use ‘Mostrar variables’ para ver el valor del tamaño máximo de unión.

  2. Creo que la indexación y una cláusula where particular evitarán que este problema ocurra.

  3. SQL_BIG_SELECTS se usa para evitar que los usuarios ejecuten accidentalmente consultas excesivamente grandes. Está bien configurarlo en ON en mysql.cnf o usar la opción de línea de comando al inicio.

  4. Puede establecer SQL_BIG_SELECTS en my.cnf o en el inicio del servidor. También se puede configurar por sesión con SET SESSION SQL_BIG_SELECTS=1 .

  5. No es que yo pueda pensar. Solo verificaría su consulta para asegurarse de que realmente necesita usarla. Nuestros servidores lo tienen activado por defecto, y max_join_size es muy grande.

No puede establecer SQL_BIG_SELECTS en my.cnf o en el inicio del servidor, ya que es un parámetro de solo sesión. Estoy usando MySQL 5.0.60.

Como alguien ha publicado antes, no puede establecer SQL_BIG_SELECTS en my.cnf al inicio del servidor. Este tipo de variable no es compatible con eso.

Tuve el mismo problema con una aplicación de Symfony que muestra este molesto error:

 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 

Pero puedes boost el número de varialbe

max_join_size que está relacionado con sql_big_selects

Pude arreglarlo ejecutando un comando como usuario mysql privilegiado:

 # SET GLOBAL max_join_size=18446744073709551615; 

O puede incluirlo en my.cnf porque max_join_size puede establecerse en el archivo de configuración

Bueno, espero que esto pueda ayudar a alguien más.

El siguiente comando funciona para mí

 SET GLOBAL max_join_size=18446744073709551615; 

¿Pero qué debo poner en mi archivo.cnf en lugar del comando? Por cierto, estoy usando “5.6.12 MySQL Community Server”

Tenía más de 2000k registros en db, y mi consulta era grande-seleccionar con una comparación exhaustiva para la eliminación de duplicaciones y la actualización de cierto campo … Me dijeron lo mismo por mysql (versión actual en la fecha de respuesta), y terminé usando index en 2 campos involucrados en where clause … esto debería ayudar a otros también … los pasos que funcionaron para mí fueron:

  1. Establecer índice en el campo
  2. ANALIZAR TABLA
  3. ejecutar la consulta

HTH

 SET SESSION SQL_BIG_SELECTS =1;# MySQL returned an empty result set (ie zero rows). SELECT a.`HACtrl` , b.`HBCtrl` , c.`HDCtrl` FROM `HO110BLote` AS a LEFT JOIN `HO113BPago` AS b ON ( b.HBHACtrl = a.HACtrl ) LEFT JOIN `HO113BRecibos` AS c ON ( c.HDHBCtrl = b.HBCtrl ) WHERE HAManzana = '03' AND HALote = '09' LIMIT 0 , 100