10
votes

Combien de variables de liaison puis-je utiliser dans une requête SQL dans MySQL 5?

Y a-t-il une limite au nombre de variables de liaison que je peux utiliser dans une requête dans MySQL 5? Je suppose qu'il y a, mais je ne trouve aucune information dans le manuel de référence ou en googling.

La seule chose que je pouvais trouver qui fournit des informations du tout se trouve dans la référence de l'API C: http://dev.mysql.com/doc/refman/5.0/ FR / mysql-stmt-bind-résultat.html

Cela semble impliquer que la mémoire est la seule limite, mais qui semble un peu soupçonnée.

Mise à jour : il y a une limite! xxx

Cela me donne quelque chose de mieux à rechercher!


4 commentaires

Juste curieux, combien souhaitez-vous passer? ;-)


Autant que possible. :) Ce que j'essaie d'accomplir est de déplacer certaines données d'une base de données sur un serveur à une base de données de type Warehouse de données sur une autre. J'ai une série de requêtes en cascade, ce qui signifie que je sélectionne des enregistrements d'une table qui ont des identifiants pour les enregistrements dans une autre table, que je peux ensuite sélectionner par ID. Je veux que mes lots aussi grands que possible, mais pas plus grand (pour tordre le conseil d'Einstein).


Vous voulez probablement une API client qui simule des déclarations préparées sur le côté client - il est généralement plus efficace et évite de telles limites. Toutefois, pour les inserts de lot, j'irais probablement avec l'assemblage de grandes instructions d'insertion ou l'utilisation de données de charge (locales) infilières.


Merci Mark. Je finissais finalement faire mon moyen de charger des données infilières. Le grand truc de lot s'applique toujours à mes sélections, bien sûr.


4 Réponses :


-4
votes

de http: //dev.mysql .Com / Doc / Refman / 5.0 / FR / SQL-Syntaxe-Préparé-Status.html :

garde contre trop de préparé Déclarations créées simultanément, réglez le Max_prepared_stmt_count System variable.

Selon le max_prepared_stmt_count Documentation, la valeur par défaut est 16_382 et la plage admissible est 0 (qui désactive complètement les instructions préparées), à 1_000_000.


1 commentaires

Ceci est le nombre de déclarations préparées et non le nombre de variables de liaison.



16
votes

Le nombre maximal d'espaces réservés pour les valeurs dans une instruction préparée est la valeur maximale d'un entier non signé de 16 bits, ou spécifiquement: 65 536.

Ceci peut être vu dans le code MySQL ici: SQL / SQL_PREPARE.CC: P>

static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }


3 commentaires

Quelle version de mysql est-ce? Ce code semble contredire la documentation citée dans ma réponse: dev.mysql.com/doc/refman/5.0/fr/...


Ceci est définitivement vrai pour l'arborescence source de 5.1 au 19/18/12, car je travaille actuellement avec ce code.


Juste pour ajouter une dernière chose: comme si j'étais occupé à s'éloigner de MySQL 5.1 de toute façon, je suis allé de l'avant et j'ai changé la ligne mentionnée dans la réponse à uint_max32. Au début rougeur, il semble "travailler". Donc, je ne sais pas pourquoi la limite était là en premier lieu.



4
votes

Il y a une limite 65 535 (2 ^ 16-1) Placez les titulaires dans mariadb 5.5 qui est censé avoir un comportement identique comme MySQL 5.5 .

Je ne sais pas le cas échéant, je l'ai testé sur PHP 5.5.12 en utilisant MySQLI / MYSQLND.


0 commentaires

0
votes

the Documentation MARIADB dit que la limite par défaut est de 16.382. Et en fonction de la version, il existe une limite difficile au 4,294.967.295 (> = Mariadb 10.3.6) ou 1.048.576 (<= Mariahb 10.3.5).


0 commentaires