Stocarea fișierelor în mysql și distribuirea rapidă a acestora, documentația computerizată de la a la i

Stocarea fișierelor în MySQL și distribuirea lor rapidă

Dar această campanie clasică are multe deficiențe:
  • fișierele nu sunt șterse când se șterge intrarea corespunzătoare a bazei de date
  • probleme în timp ce încercați să actualizați fișierul în același timp
  • încălcarea sincronizării între baza de date și sistemul de fișiere la întoarcerea tranzacției
  • Când creați copii de rezervă și restaurați informațiile într-o bază de date, este posibil ca sistemul de fișiere să nu fie sincronizat
  • fișierele nu respectă restricțiile impuse de baza de date
  1. Înainte de a șterge o înregistrare, faceți o SELECT cu aceeași condiție și obțineți numele fișierelor pe care doriți să le ștergeți. Problema este că, dacă există o mulțime de fișiere șterse, această operațiune poate dura ceva timp și este bine să blocați masa pentru citire și scriere în acest moment și, în multe cazuri, acest lucru este inacceptabil.
  2. Înainte de a scoate instalate din înregistrările șterse etichetă „care urmează să fie eliminate,“ a lua toate mesajele cu această etichetă și eliminați fișierele asociate cu aceste înregistrări, și în cele din urmă șterge toate înregistrările din această etichetă. Cerere de lucru cu acest tabel ar trebui să fie dezvoltate în continuare, astfel încât acestea nu au ales setul de pavilion de înregistrare. Dezavantaje - necesitatea de a modifica setul de interogări, în afară de noi avem în scrierea proiectului la eliminarea SELECT sunt selectate destul de complexe, care nu pot fi convertite într-o singură UPDATE.
  3. Primele două moduri de a încerca să rezolve problema de „pierdute“ fișiere atunci când ștergeți înregistrările din baza de date, care are loc atunci când metoda de stocare a fișierelor „clasice“, dar ele nu rezolva alte probleme ale acestei abordări, așa că am încercat să vină cu soluții care compensează pozitive fișierele aspecte magazin direct în baza de date și a scăpa de dezavantajele acestei abordări.
  4. Utilizați declanșatoarele. Din păcate, MySQL nu are suport pentru lucrul cu fișiere în limba sa, astfel de comenzi ar trebui să fie implementate independent prin alegerea în sursele MySQL. Din minus - fișierele ar trebui să fie stocate pe aceeași gazdă ca baza de date, necesitatea de a finaliza MySQL, nu am găsit astfel de soluții gata făcute.
  5. Păstrați fișierele în baza de date, dar le dați direct serverului web, fără participarea la PHP. Puteți implementa acest lucru prin scrierea unui modul pe un server web (de exemplu, nginx) care vă permite să trimiteți fișiere direct din MySQL sau utilizând driverul sistemului de fișiere MySQLfs. Această abordare rezolvă toate problemele de mai sus, dar dezavantajul său este o cheltuială suplimentară pentru stocarea fișierelor în MySQL.
  6. Motor specializat de stocare pentru MySQL, care stochează înregistrările ca fișiere.













Să trăim mai în detaliu în ultimul punct. La urma urmei, ceea ce este un sistem de fișiere - este o bază de date specializată, care prin "numele fișierului" vă permite să obțineți o înregistrare - conținutul său. Adică, puteți implementa propriul mecanism de stocare pentru MySQL, în care fiecare înregistrare va avea trei câmpuri:

CREATE TABLE `data_storage` .`files` (
`id` INT NU NULL AUTO_INCREMENT PRIMARY KEY,
`calea` VARCHAR (255),
"date" blob
) ENGINE = FILES


Introduceți date într-un tabel poate fi numai în `date cu caracter, în timp ce ei pur și simplu salvate într-un fișier, un nume unic pentru acesta, în același timp, este generat automat (folosind ca id` câmp prefix`) - de exemplu, 764 533, iar în` path` introdus automat modul corect în care pentru a pune datele noastre MySQL - cum ar fi „/mnt/storage/mysqldata/76/45/33/764533_myfile.jpg“. Astfel, datele stocate într-un astfel de tabel poate fi accesat ca un simplu fișier, și în care MySQL va menține integritatea datelor. Astfel, această metodă de stocare a fișierelor este lipsit de aproape toate dezavantajele abordării clasice (altele decât restricționarea accesului, dar se poate face folosind un script simplu și titlul X-Accel-Redirect Nginx) și, în același timp, nu reduce impactul asupra performanței fișierelor clienților.
Problema este mică - nu a fost posibilă găsirea unei implementări gata a unui astfel de motor de stocare a datelor pentru MySQL, deși ideea generală este simplă. Poate că cineva de la haprolyudey vă va spune legătura cu implementarea gata a unui astfel de motor de stocare, ideea plutește la suprafață și doar cineva ar putea să o pună în aplicare.







Trimiteți-le prietenilor: