Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menyimpan gambar yang diunggah pengguna secara efisien pada sistem file

Kami memiliki sistem seperti itu dalam produksi berat dengan 30.000+ file dan 20+ GB hingga saat ini...

   Column    |            Type             |                        Modifiers                         
-------------+-----------------------------+----------------------------------------------------------
 File_ID     | integer                     | not null default nextval('"ACRM"."File_pseq"'::regclass)
 CreateDate  | timestamp(6) with time zone | not null default now()
 FileName    | character varying(255)      | not null default NULL::character varying
 ContentType | character varying(128)      | not null default NULL::character varying
 Size        | integer                     | not null
 Hash        | character varying(40)       | not null
Indexes:
    "File_pkey" PRIMARY KEY, btree ("File_ID")

File hanya disimpan dalam satu direktori dengan File_ID integer sebagai nama file. Kami lebih dari 30.000 tanpa masalah. Saya telah menguji lebih tinggi tanpa masalah.

Ini menggunakan RHEL 5 x86_64 dengan ext3 sebagai sistem file.

Apakah saya akan melakukannya dengan cara ini lagi? Tidak. Izinkan saya berbagi beberapa pemikiran tentang desain ulang.

  1. Basis data masih merupakan "sumber utama" informasi tentang file.

  2. Setiap file sha1() di-hash dan disimpan dalam hierarki sistem file berdasarkan hash tersebut:/FileData/ab/cd/abcd4548293827394723984723432987.jpg

  3. database sedikit lebih pintar tentang menyimpan meta-informasi pada setiap file. Ini akan menjadi sistem tiga tabel:

    File :menyimpan info seperti nama, tanggal, ip, pemilik, dan penunjuk ke Blob (sha1)
    File_Meta :menyimpan pasangan kunci/nilai pada file, tergantung pada jenis file. Ini mungkin termasuk informasi seperti Image_Width, dll...
    Blob :menyimpan referensi ke sha1 beserta ukurannya.

Sistem ini akan menghapus duplikat konten file dengan menyimpan data yang direferensikan oleh hash (beberapa file dapat mereferensikan data file yang sama). Akan sangat mudah untuk melakukan backup sync database file menggunakan rsync.

Selain itu, batasan direktori tertentu yang berisi banyak file akan dihilangkan.

Ekstensi file akan disimpan sebagai bagian dari hash file unik. Misalnya, jika hash untuk file kosong adalah abcd8765 ... Sebuah .txt yang kosong file dan kosongkan .php file akan merujuk ke hash yang sama. Sebaliknya, mereka harus merujuk ke abcd8765.php dan abcd8765.txt . Mengapa?

Apache, dll. dapat dikonfigurasi untuk secara otomatis memilih jenis konten dan aturan caching berdasarkan ekstensi file. Penting untuk menyimpan file dengan nama yang valid dan ekstensi yang mencerminkan konten file.

Soalnya, sistem ini benar-benar dapat meningkatkan kinerja dengan mendelegasikan pengiriman file melalui nginx. Lihat http://wiki.nginx.org/XSendfile .

Saya harap ini membantu dalam beberapa cara. Hati-hati.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sql Query - Membatasi hasil kueri

  2. Simpan Aksen di Database MySQL

  3. Panduan Merancang Database Untuk Notifikasi Di MySQL

  4. Membaca lembar XLSX untuk memberi makan tabel MySQL menggunakan PHPExcel

  5. mysql Hitung beberapa kemunculan entri multipleks