săriți copierea în tabelul tmp de pe disc mysql (Programare, Mysql, Sql)

user765368 a intrebat.

Am o întrebare pentru interogări mysql mari. Este posibil să săriți peste copierea în tabelul tmp pe disc pasul pe care mysql îl face pentru interogări mari sau este posibil să îl faceți să meargă mai repede? pentru că acest pas durează mult prea mult timp pentru a primi rezultatele interogărilor mele înapoi. Am citit pe pagina MySQL că mysql efectuează acest lucru pentru a economisi memorie, dar nu mă interesează să economisesc memorie, vreau doar să primesc rezultatele interogărilor mele înapoi RAPID, am suficientă memorie pe mașina mea. De asemenea, tabelele mele sunt indexate corespunzător, deci nu acesta este motivul pentru care interogările mele sunt lente.

Aveți nevoie de ajutor?

Vă mulțumesc

Comentarii

  • Nu sunt expert MySql, dar probabil că ar fi mai bine să optimizați interogarea și/sau schema. –  > Por mxmissile.
  • Votez pentru a închide acest lucru ca „nu este o întrebare reală”. Întrebarea nu include interogarea SQL de optimizat și nici schema de SHOW CREATE TABLE pentru a arăta ce indexuri, nici EXPLAIN raport care să arate planul de optimizare curent. –  > Por Bill Karwin.
  • Trebuie să fiu de acord cu @Bill Karwin în ceea ce privește necesitatea de a vedea interogările, declarațiile de creare a tabelelor și/sau planurile EXPLAIN. Răspunsul meu ar rezolva problema pe care o vedeți, dar ar permite ca interogările proaste să umfle memoria RAM. Cunoscând natura interogărilor dvs. ar elimina probabil necesitatea de a reconfigura fie RAM, fie mysql. –  > Por RolandoMySQLDBA.
  • @ închideți votanții, vă rugăm să aruncați o privire la răspunsul minunat la această întrebare și să vă gândiți câți vizitatori ar fi putut aduce această întrebare la SO. Votați Lăsați deschis! –  > Por fancyPants.
2 răspunsuri
RolandoMySQLDBA

Există două lucruri pe care le puteți face pentru a diminua impactul prin acest lucru

OPȚIUNEA #1 : Creșteți variabilele tmp_table_size și/sau max_heap_table_size

Aceste opțiuni vor guverna cât de mare poate fi o tabelă temporară în memorie înainte de a fi considerată prea mare și de a fi paginată pe disc ca o tabelă temporară MyISAM. Cu cât aceste valori sunt mai mari, cu atât este mai puțin probabil să obțineți „copierea în tabela tmp pe disc”. Vă rugăm să vă asigurați că serverul dvs. are suficientă memorie RAM și max_connections este configurat moderat, în cazul în care o singură conexiune DB are nevoie de multă memorie RAM pentru propriile tabele temporare.

OPȚIUNEA #2 : Utilizați un disc RAM pentru tabelele tmp

Ar trebui să puteți configura un disc RAM în Linux și apoi să setați tmpdir în mysql să fie folderul în care este montat discul RAM.

Pentru început, configurați un disc RAM în sistemul de operare

Creați un dosar în Linux numit /var/tmpfs

mkdir /var/tmpfs

Apoi, adăugați această linie în /etc/fstab (de exemplu, dacă doriți un disc RAM de 16GB)

none                    /var/tmpfs              tmpfs   defaults,size=16g        1 2

și reporniți serverul.

Notă : Este posibil să faceți un disc RAM fără a reporni. Amintiți-vă doar să adăugați în continuare linia menționată mai sus la /etc/fstab pentru a avea discul RAM după o repornire a serverului.

Acum pentru MySQL:

Adăugați această linie în /etc/my.cnf

[mysqld]
tmpdir=/var/tmpfs

și reporniți mysql.

OPȚIUNEA #3 : Obțineți cât mai repede tabela tmp în RAM Disk (presupunând că ați aplicat mai întâi OPȚIUNEA #2)

Este posibil să doriți să forțați tabelele tmp în discul RAM cât mai repede posibil, astfel încât MySQL să nu se învârtă în jurul roților migrând tabelele tmp mari în memorie într-un disc RAM. Adăugați acest lucru în /etc/my.cnf:

[mysqld]
tmpdir=/var/tmpfs
tmp_table_size=2K

și reporniți mysql. Acest lucru va face ca și cel mai mic tabel temporar să fie adus la existență chiar în discul RAM. Ați putea rula periodic ls -l /var/tmpfs pentru a vedea cum apar și dispar tabelele temporare.

Încercați !!!

ATENȚIE

Dacă nu vedeți nimic altceva decât tabele temporare în /var/tmpfs 24/7, acest lucru ar putea avea un impact asupra funcționalității/performanței sistemului de operare. Pentru a vă asigura că /var/tmpfs nu este suprapopulat, căutați să vă acordați interogările. Odată ce faceți acest lucru, ar trebui să vedeți mai puține tabele tmp care se materializează în /var/tmpfs.

Comentarii

  • Alte câteva puncte, dacă sunteți pe linux (în special pe Ubuntu) S-ar putea să fie nevoie să adăugați calea tmpdir-ului dvs. la armura aplicației în (/etc/apparmor.d/usr.sbin.mysqld) De asemenea, nu uitați să modificați chmod 777 la adresa respectivă! –  > Por Dan.
  • Când încerc acest lucru pe un server ubuntu lamp primesc job failed to start când încerc să repornesc mysql. Apoi îl schimb înapoi la /tmp implicit și pornește bine. @Dan Ați putea da un exemplu pentru partea pe care o adăugați la user.sbin.mysqld ? Mulțumesc.  > Por vikingben.
  • Doar pentru referință, a trebuit să fac următoarele pe ubuntu, pe lângă adăugarea în /etc/apparmor.d/usr/sbin.mysqld, a trebuit să adaug și în /etc/apparmor.d/abstractions/user-tmp, de asemenea, adăugat în același format ca și dosarul tmp original. –  > Por vikingben.
  • Nu văd fișiere atunci când execut ls -l. Am citit că mysql creează fișierul, rm‘s it și apoi scrie în el după ce este rm‘d. Este acesta cazul? Interogarea mea, care scrie într-un tabel temporar, nu și-a îmbunătățit performanța atunci când a utilizat această strategie. Încă mai am ~5 secunde de timp de „copiere în tabelul tmp de pe disc”. Cum pot verifica configurația mea? –  > Por Ryan Griffith.
  • Cum pot afla dimensiunea directorului tmpfs de care are nevoie mysql? și în ce dimensiune mysql merge să folosească tempdir? –  > Por Mohammad Ali Akbari.
hsibboni

De asemenea, puteți sări peste copierea în tabelul tmp pe disc partea (nu a primit răspuns în răspunsul selectat)

  1. Dacă evitați anumite tipuri de date :

Suport pentru tipurile de date cu lungime variabilă (inclusiv BLOB și TEXT) care nu sunt acceptate de MEMORY.

de la https://dev.mysql.com/doc/refman/8.0/en/memory-storage-engine.html (sau https://mariadb.com/kb/en/library/memory-storage-engine/ dacă utilizați mariadb).

  1. Dacă tabelul temporar este suficient de mic : așa cum se spune în răspunsul selectat, puteți

    creșteți variabilele tmp_table_size și/sau max_heap_table_size

Dar dacă vă împărțiți interogarea în interogări mai mici (faptul că nu aveți interogarea nu ajută la analizarea problemei dvs.), puteți face ca aceasta să încapă în interiorul unui tabel temporar de memorie.

Tags:,