join_buffer_size> = 4 M n'est pas conseillé?

Je reçois ce message de MysqlTunner.pl:

join_buffer_size> = 4 M Ceci n'est pas conseillé

D'autre part, j'ai lu dans le guide my.cnf de Debian sur jont_buffer_size que:

Ce tampon sert à optimiser les JOIN complets (JOINs sans index). Ces JOIN sont très mauvais pour la performance dans la plupart des cas de toute façon, mais la définition de cette variable à une grande valeur réduit l'impact sur les performances. Voir la variable d'état "Select_full_join" pour un count de JOINs complets. Atsortingbué par thread si une jointure complète est trouvée

Je me request donc lequel devrais-je croire? Actuellement, j'ai mis join_buffer_size = 64M dans le cadre des efforts pour faire face au problème d'évolutivité d'un site à fort trafic dont les requêtes ne sont pas particulièrement optimisées. J'apprécie vos remarques à ce sujet.

join_buffer_size = 64 Mo est un peu fou, c'est + 64 Mo d'atsortingbué à chaque nouveau fil.

La taille du tampon qui est utilisée pour les parsings d'indices simples, les parsings d'index de plage et les jointures qui n'utilisent pas d'index et effectuent ainsi des parsings de tables complètes. Normalement, la meilleure façon d'get des jointures rapides est d'append des index. Augmentez la valeur de join_buffer_size pour get une jointure complète plus rapide lorsque l'ajout d'index n'est pas possible.

Je dirais que vous devriez réduire join_buffer_size à une valeur entre 128K et 256K tout en ajoutant des index à vos tables et en utilisant la memory que vous venez d'save pour augmenter key_buffer_size > + 10x.

Plus de memory ne traduit pas toujours plus de vitesse, exemples courants: sort_buffer_size , read_buffer_size , read_rnd_buffer_size et table_open_cache . Recherche le sur Google.

Ils semblent tous deux me dire la même chose. Ils vous disent tous deux que les JOINES FULL sont MAUVAIS .

  • Mysqltuner fait remarquer que quelque chose au sujet de votre système est mauvais, dans ce cas, il faut avoir un tampon de jointure grand est un signe que vous avez quelque chose de mal à propos de votre database.
  • La documentation vous dit que c'est mauvais, mais si vous ne pouvez pas modifier votre code, append de la memory vous permettra d'accepter le mal.

Avez-vous vérifié la variable Select_full_join ? Êtes-vous en train de voir cette augmentation de countur? Êtes-vous sûr de conserver le code ou de crier aux personnes responsables de la réparation, ce n'est pas une option?

Ne pas augmenter les tampons par connection!

Tous les tampons dans my.cnf ne sont atsortingbués qu'une fois pour l'instance du server. Certains tampons sont atsortingbués pour chaque connection. Pour plus d'informations à l' adresse https://haydenjames.io/my-cnf-tuning-avoid-this-common-pitfall/ :

Citation:

Les tampons tels que join_buffer_size, sort_buffer_size, read_buffer_size et read_rnd_buffer_size sont atsortingbués par connection. Par conséquent, un paramètre de read_buffer_size = 1M et max_connections = 150 request à MySQL d'allouer – à partir du démarrage – 1 Mo par connection x 150 connections. Pendant plus d'une décennie, le défaut rest à 128K. L'augmentation de la valeur par défaut n'est pas seulement une perte de memory du server, mais n'utilise pas les performances. Dans presque tous les cas, il est préférable d'utiliser les valeurs par défaut en supprimant ou en commentant ces quatre lignes de configuration tampon. Pour une approche plus graduelle, réduisez-les de moitié pour libérer de la RAM perdue, continue de les réduire vers les valeurs par défaut dans le time. J'ai réellement vu un débit amélioré en réduisant ces tampons. Mais il n'y a vraiment pas de gains de performance liés à l'augmentation de ces tampons, sauf dans le cas de trafic très élevé et / ou d'autres circonstances particulières. Évitez de les augmenter de façon arbitraire!

Accès rapide à la memory

Contrairement à la logique commune, l'access à la memory n'est pas O (1).

Plus de RAM que vous avez, plus lent est l'access à toutes datatables de cette RAM.

Donc, en utilisant less de RAM peut effectivement fournir un access plus rapide à la RAM – ceci est une règle générale, non seulement s'applique à MySQL. S'il vous plaît, voir The Myth of RAM – pourquoi une memory random lue est O (√N)

Maintenant, revenons à MySQL join_buffer_size.

Tuning MySQL join_buffer_size

Le join_buffer_size est atsortingbué pour chaque jointure complète entre deux tables. À partir de la documentation de MySQL, join_buffer_size est décrit comme suit: "La taille minimale du tampon utilisé pour les parsings d'index simples, les parsings d'index de plage et les jointures qui n'utilisent pas d'index et donc effectuer des balayages de arrays complets". Il poursuit en disant: " Le time de répartition de la memory peut provoquer des baisses de performances importantes si la taille globale est supérieure à celle requirejse par la plupart des requêtes qui l'utilisent. "Le tampon de jointure est atsortingbué aux lignes de table de cache lorsque la jointure ne peut pas utiliser un index. Si vos bases de données souffrent de nombreuses jointures effectuées sans index, elles ne peuvent être résolues en augmentant seulement join_buffer_size. Le problème est "les jointures effectuées sans index" et donc la solution pour des jointures plus rapides est d'append des index.

Modifiez la configuration MySQL pour save les requêtes sans index, afin que vous puissiez find de telles requêtes et append des index et / ou modifier l'application qui envoie génère de telles mauvaises questions. Vous devez activer "log-queries-not-using-index" Ensuite, searchz les jointures non indexées dans le journal de requêtes lent.