web-dev-qa-db-fra.com

MySQL - SQL_BIG_SELECTS

Bonjour, j’ai enquêté sur SQL_BIG_SELECTS, mais la documentation de MySQL jusqu’à présent n’a pas été très utile. Je cherche un moyen de prévenir des erreurs comme celle ci-dessous.

ERREUR 1104: Le SELECT examinerait trop d'enregistrements et prendrait probablement beaucoup de temps. Vérifiez votre WHERE et utilisez SET OPTION SQL_BIG_SELECTS = 1 si le SELECT est correct.

  1. À combien de lignes MySQL décide-t-il qu'une requête est un "BIG SELECT"?
  2. Une indexation appropriée résoudra-t-elle généralement ce problème?
  3. SQL_BIG_SELECTS est-il considéré comme un "dernier recours" ou est-ce une bonne pratique?
  4. Comment quelqu'un définirait-il "SQL_BIG_SELECTS = 1" dans la configuration (sans avoir à exécuter la requête)?
  5. Existe-t-il d'autres alternatives intéressantes à connaître?

Merci d'avance!

26
Matt
  1. MySQL détermine si une requête est ou non une 'grosse sélection' basée sur la valeur de 'max_join_size'. Si la requête est susceptible d’examiner plus que ce nombre de lignes, elle le considérera comme un «gros choix». Utilisez "show variables" pour afficher la valeur de la taille maximale de la jointure.

  2. Je crois que l'indexation et en particulier une bonne clause où empêchera ce problème de se produire.

  3. SQL_BIG_SELECTS est utilisé pour empêcher les utilisateurs d’exécuter accidentellement des requêtes trop volumineuses. Vous pouvez le régler sur mysql.cnf ou utiliser l'option de ligne de commande au démarrage.

  4. Vous pouvez définir SQL_BIG_SELECTS dans my.cnf ou au démarrage du serveur. Il peut également être défini session par session avec SET SESSION SQL_BIG_SELECTS=1.

  5. Pas que je puisse penser. Je voudrais juste vérifier votre requête pour vous assurer que vous en avez vraiment besoin. Il est activé par défaut sur nos serveurs et max_join_size est très volumineux.

39
jonstjohn

Vous ne pouvez pas set SQL_BIG_SELECTS dans my.cnf ou au démarrage du serveur car il s'agit d'un paramètre de session uniquement. J'utilise MySQL 5.0.60.

2
Bing Liu

Comme quelqu'un a déjà posté, vous ne pouvez pas définir SQL_BIG_SELECTS sur my.cnf au démarrage du serveur. Ce genre de variable ne supporte pas ça.

J'ai eu le même problème avec une application Symfony montrant cette erreur gênante:

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

Mais vous pouvez augmenter le nombre de varialbe

max_join_size qui est liée à sql_big_selects

J'ai pu le réparer en exécutant une commande en tant qu'utilisateur privilégié de MySQL:

# SET GLOBAL max_join_size=18446744073709551615;

Ou vous pouvez l'inclure dans my.cnf car max_join_size est autorisé à être configuré dans le fichier de configuration.

J'espère que cela pourra aider quelqu'un d'autre.

1
Rubendob

J'avais plus de 2000k enregistrements dans la base de données, et ma requête était très sélective avec une comparaison exhaustive pour la suppression des doublons et la mise à jour de certains champs ... La même chose m'a été dite par mysql (version actuelle à la date de réponse), et J'ai fini par utiliser index sur 2 champs impliqués dans la clause where ... cela devrait également aider les autres ... les étapes qui ont fonctionné pour moi sont les suivantes:

  1. Définir l'index sur le champ
  2. TABLE D'ANALYSE
  3. lancer la requête

HTH

0
Zaffar Saffee

Suivre la commande fonctionne pour moi

SET GLOBAL max_join_size=18446744073709551615;

Mais qu'est-ce que j'ai besoin de mettre dans le fichier my.cnf au lieu de la commande?

0
Musa