View Categories

Optimizarea și repararea MySQL cu phpMyAdmin

Acest articol te conduce, pas cu pas, prin tot ce poți face direct din phpMyAdmin pentru a-ți menține baza de date sănătoasă și rapidă: verificare, analiză, optimizare, reparații, indici, charset, collation, plus câteva rețete SQL utile. E scris pentru MySQL/MariaDB moderne și presupune că ai acces la phpMyAdmin și la un utilizator cu drepturi suficiente.

1) Înainte să începi (bază solidă)

  • Backup obligatoriu. Exportă baza (SQL) din phpMyAdmin: intră în baza de date → Export → „Personalizat” → include DROP + CREATE.
  • Fereastră de mentenanță. Operațiuni ca „Optimize/Analyze” blochează uneori tabelele. Fă-le când traficul e mic.
  • Cunoaște engine-ul.
    • InnoDB: implicit în MySQL 8+. „REPAIR TABLE” practic nu se aplică; „OPTIMIZE” reconstruiește tabelul (echivalent ALTER TABLE ... FORCE).
    • MyISAM: suportă REPAIR TABLE, dar ia în calcul migrarea la InnoDB.
  • Spațiu liber pe disc. Reconstrucția tabelelor cere spațiu temporar.
  • Permisiuni. Ai nevoie de ALTERINDEXLOCK TABLES etc. pentru multe operațiuni.

2) Unde găsești totul în phpMyAdmin

  • Selectează baza în coloana din stânga.
  • Tab-uri principale: StructureSQLSearchQueryOperationsExport/Import.
  • La nivel de bază de date: poți bifa mai multe tabele și folosi meniul With selected (jos) → Optimize tableAnalyze tableCheck tableRepair table.
  • La nivel de tabel: tab Operations → secțiunea Table maintenance (aceleași acțiuni).
  • Tab Structure (al tabelului): administrarea indicilor și a coloanelor.

3) Întreținerea de bază: Check / Analyze / Optimize / Repair

3.1 Check (verificare)

  • Ce face: rulează CHECK TABLE pentru corupții/erori evidente.
  • Cum: bifează tabelele → With selected → Check table.
  • Echivalent SQL:CHECK TABLE `nume_tabel` EXTENDED;
  • Interpretează rezultatul: status = OK e bine; orice altceva cere acțiuni (Optimize/Repair sau intervenție la nivel de server).

3.2 Analyze (statistici pentru optimizator)

  • Ce face: ANALYZE TABLE actualizează statisticile de index; poate accelera planurile de execuție.
  • Cum: With selected → Analyze table.
  • SQL:ANALYZE TABLE `nume_tabel`;
  • Când: după mase mari de INSERT/DELETE/UPDATE, sau dacă vezi planuri EXPLAIN ciudate.

3.3 Optimize (defragmentare & spațiu)

  • Ce face: OPTIMIZE TABLE (InnoDB → reconstruiește tabelul și reface indexurile; recuperează spațiu din „Overhead”).
  • Cum: With selected → Optimize table.
  • SQL:OPTIMIZE TABLE `nume_tabel`;
  • Când: când coloana Overhead din lista de tabele e mare, după multe ștergeri sau schimbări de lungime variabilă (TEXT/VARCHAR).

3.4 Repair (numai pentru MyISAM)

  • Ce face: REPAIR TABLE încearcă să repare chei/fișiere MyISAM.
  • Cum: With selected → Repair table (activ doar la MyISAM).
  • SQL:REPAIR TABLE `nume_tabel` QUICK;
  • Atenție: pentru InnoDB, „repair” nu se face așa. Dacă un tabel InnoDB pare corupt, e necesară intervenția la nivel de server (backup/restore, opțiuni de recovery), nu phpMyAdmin.

4) Indexare și optimizarea interogărilor

4.1 Găsește și creează indici potriviți (UI)

  • Intră în Structure (tabel) → secțiunea Indexes → Create index.
  • Pentru chei compuse (multi-coloană), ordinea coloanelor contează: pune primele coloanele cele mai selective, folosite în WHERE/JOIN/ORDER BY.

4.2 Operații SQL frecvente pentru indici

-- Creează index simplu:
CREATE INDEX idx_users_email ON users(email);

-- Index compus (căutăm des după (status, created_at)):
CREATE INDEX idx_orders_status_created ON orders(status, created_at);

-- Index unic (asigură unicitate + accelerează căutările):
CREATE UNIQUE INDEX ux_users_email ON users(email);

-- Șterge un index (evită dublurile inutile):
DROP INDEX idx_vechi ON users;

-- Vezi indici existenți:
SHOW INDEX FROM users;

Tips utile:

  • Evită indici duplicat (ex: ai și INDEX(email), și UNIQUE(email)—păstrează doar UNIQUE).
  • Index pe coloane folosite în WHEREJOINORDER BY (mai ales dacă ordonezi/filtresi des).
  • Prefix index pentru coloane mari (ex: CREATE INDEX ... ON t(col(100));) dacă spațiul contează.
  • Nu supra-indexa. Fiecare index încetinește scrierile. 3–6 indici/masă e adesea rezonabil (depinde de utilizare).

4.3 EXPLAIN (și EXPLAIN ANALYZE)

În tab SQL, rulează:

EXPLAIN SELECT ...;
-- MySQL 8.0.18+ (mai detaliat):
EXPLAIN ANALYZE SELECT ...;

Ce vrei să vezi:

  • type cât mai selectiv (ideal refrangeconst, nu ALL).
  • rows mic, filtered mare.
  • Extra să evite „Using temporary; Using filesort” la interogări mari (un index adecvat pe coloanele de sortare ajută).

5) Curățenie & spațiu

  • Overhead mare? Rulează Optimize pe tabelele cu overhead ridicat.
  • Migrare la InnoDB: pentru fiabilitate și blocări row-level.ALTER TABLE nume_tabel ENGINE=InnoDB;
  • Row format potrivit (InnoDB):ALTER TABLE nume_tabel ROW_FORMAT=DYNAMIC; (util pentru coloane mari TEXT/BLOB și compresie implicită modernă)
  • AUTO_INCREMENT cu „găuri” e normal; nu re-compacta doar pentru estetică.

6) Charset & Collation (recomandat: utf8mb4)

  • De ce: suport Unicode complet (emoji, diacritice corecte).
  • Ordine sigură: server → bază → tabel → coloană. În phpMyAdmin:
    • La nivel de bază: tab Operations → Collation → alege utf8mb4_0900_ai_ci (MySQL 8) sau utf8mb4_general_ci/utf8mb4_unicode_ci (compatibil).
    • La tabelOperations → Table options → set collation; apoi convertește coloanele dacă e nevoie.
  • SQL:ALTER DATABASE nume_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; ALTER TABLE nume_tabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
  • Atenție: fă backup și verifică aplicația (driverul/ORM) să folosească același charset/collation.

7) Integritate referențială & date „orfane”

  • Activează și folosește chei externe (InnoDB) pentru consistență.
  • Găsește rânduri „orfane” (exemplu):SELECT c.* FROM comments c LEFT JOIN posts p ON p.id = c.post_id WHERE p.id IS NULL; -- comments fără post părinte
  • Adaugă constrângeri (după curățare):ALTER TABLE comments ADD CONSTRAINT fk_comments_post FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE;

8) Diagnosticare rapidă din phpMyAdmin

  • Status / Variables (la nivel de server): vezi încărcare, conexiuni, buffer pool (InnoDB).Poți executa SHOW STATUS LIKE 'Threads%';SHOW ENGINE INNODB STATUS; din tab-ul SQL pentru detalii.
  • Limitare: modificările de configurare persistente (ex. innodb_buffer_pool_size) țin de fișierul my.cnf — nu de phpMyAdmin. Poți folosi SET GLOBAL pentru teste, dar nu persistă după restart.

9) Reparații reale (când ceva s-a stricat)

  • MyISAMREPAIR TABLE din phpMyAdmin (vezi §3.4).
  • InnoDB:
    • Încearcă export & re-import din phpMyAdmin dacă tabelul e accesibil.
    • Dacă nu, e nevoie de intervenții la nivel de server (recuperare din backup, innodb_force_recoverymysqlcheck). Asta nu se face din phpMyAdmin.
  • Loguri de erori ale serverului MySQL sunt sursa adevărului pentru corupții reale.

10) „Recepte” uzuale (pas cu pas)

10.1 Optimizare rapidă a întregii baze

  1. Intră în baza dorită.
  2. Bifează Check all.
  3. Meniu With selected → Analyze table.
  4. Apoi With selected → Optimize table.
  5. Observă rezultatele (toate „OK”?).

10.2 Reindexare după volum mare de schimbări

  1. Rulează Check + Analyze (vezi mai sus).
  2. Verifică indici (tab Structure → Indexes).
  3. Adaugă/șterge indici pe baza EXPLAIN.
  4. Rulează Optimize dacă „Overhead” e mare.

10.3 Elimină indici inutili/duplicat (SQL)

-- Duplicat clasic: ai UNIQUE(email) și INDEX(email)
SHOW INDEX FROM users; 
-- Dacă vezi două intrări pe aceeași coloană, păstrează-l pe cel UNIQUE:
DROP INDEX idx_users_email ON users;

10.4 Convertire masivă la utf8mb4 (bază întreagă)

  1. Backup complet.
  2. Operations (la nivel de bază) → setează collation la utf8mb4_0900_ai_ci.
  3. Pentru fiecare tabel:ALTER TABLE nume_tabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

11) Checklist scurt pentru performanță

  •  Backup făcut.
  •  Check + Analyze rulate periodic.
  •  Optimize pe tabele cu Overhead mare.
  •  Indici existenți verificați (fără dubluri, acoperă WHERE/JOIN/ORDER).
  •  Interogări lente analizate cu EXPLAIN / EXPLAIN ANALYZE.
  •  Charset/collation corecte (utf8mb4).
  •  Integritate referențială activă (FK), date orfane curățate.
  •  Pentru probleme grave la InnoDB: plan de recovery la nivel de server (în afara phpMyAdmin).

12) Anexă — Comenzi SQL utile (copy/paste)

-- Statistici tabel + overhead
SHOW TABLE STATUS FROM nume_db LIKE 'nume_tabel';

-- Verificare/analiză/optimizare
CHECK TABLE nume_tabel EXTENDED;
ANALYZE TABLE nume_tabel;
OPTIMIZE TABLE nume_tabel;

-- (MyISAM) Reparație
REPAIR TABLE nume_tabel QUICK;

-- Informații indici
SHOW INDEX FROM nume_tabel;

-- Caută tabele fără cheie primară
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES t
LEFT JOIN (
  SELECT TABLE_SCHEMA, TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE COLUMN_KEY='PRI'
  GROUP BY TABLE_SCHEMA, TABLE_NAME
) pk USING (TABLE_SCHEMA, TABLE_NAME)
WHERE pk.TABLE_NAME IS NULL
  AND t.TABLE_SCHEMA='nume_db';

-- EXPLAIN / EXPLAIN ANALYZE pentru o interogare
EXPLAIN SELECT * FROM orders WHERE status='paid' AND created_at >= '2025-01-01';
EXPLAIN ANALYZE SELECT * FROM orders WHERE status='paid' AND created_at >= '2025-01-01';

-- Migrare la InnoDB + setări moderne
ALTER TABLE nume_tabel ENGINE=InnoDB, ROW_FORMAT=DYNAMIC;

-- Convertire charset/collation
ALTER TABLE nume_tabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

-- Index compus pentru filtrare + sortare
CREATE INDEX idx_orders_status_created ON orders(status, created_at);

13) Bun de știut (capcane comune)

  • Blocări/lacune de performanță: OPTIMIZE/ANALYZE pot bloca. Rulează în afara orelor de vârf.
  • REPAIR nu e pentru InnoDB. Dacă vezi butonul „Repair” gri, e normal.
  • Nu te baza pe „profiling” vechi. În MySQL 8, folosește EXPLAIN ANALYZE în locul SET PROFILING=1.
  • Modificările SET GLOBAL nu persistă. Pentru setări durabile, editează my.cnf (în afara phpMyAdmin).
  • Prea mulți indici = scrieri lente. Indicează cu scop.