Sebagai bagian dari proyek PHP, saya harus memasukkan baris ke dalam database MySQL. Saya jelas terbiasa melakukan ini, tetapi ini diperlukan memasukkan ke dalam 90 kolom dalam satu permintaan. Kueri yang dihasilkan terlihat mengerikan dan monolitik (terutama menyisipkan variabel PHP saya sebagai nilainya):
INSERT INTO mytable (column1, colum2, ..., column90)
VALUES
('value1', 'value2', ..., 'value90')
dan saya khawatir saya tidak melakukan hal ini dengan cara yang benar. Saya juga butuh waktu yang lama (membosankan) untuk mengetik semuanya dan menguji penulisan kode tes akan sama membosankannya, saya khawatir.
Bagaimana cara profesional menulis dan menguji pertanyaan ini dengan cepat? Apakah ada cara saya bisa mempercepat proses?
php
mysql
efficiency
Joe
sumber
sumber
Jawaban:
Joe, komentar terakhirmu banyak menjelaskan. Saya pikir masalah sebenarnya adalah desain data. Kolom baru mungkin diperlukan ketika format dokumen berubah, dan dalam pengalaman saya format dokumen cenderung berubah sering. Alih-alih tabel 90 kolom, dengan satu baris per laporan, saya akan menyimpan data laporan dalam tabel dengan empat kolom: report_id, format_id, field_name, field_value. Setiap laporan akan diwakili oleh 90 baris, satu untuk setiap nilai bidang dalam laporan. Ini harus menyederhanakan kode Anda.
sumber
Secara umum, cara tercepat untuk memuat dataset besar ke dalam database SQL adalah dengan menggunakan antarmuka pemuatan massal asli. Sejauh yang saya tahu, setiap SQL dbms memiliki setidaknya satu.
Dokumen MySQL: Menggunakan Bulk Loader
Jika saya harus mengubah file tab- atau dibatasi koma menjadi pernyataan SQL INSERT, saya menggunakan awk untuk membaca file input dan menulis file output. Tidak ada yang spesial tentang awk; kebetulan itu adalah bahasa pemrosesan teks yang saya tahu paling baik. Anda bisa mendapatkan hasil yang sama dengan menulis kode dalam Perl, Python, Ruby, Rexx, Lisp, dan sebagainya.
sumber
Jika Anda dapat dengan mudah memasukkan nama kolom ke dalam spreadsheet Excel, Anda bisa menulis makro Excel untuk menghasilkan kode untuk berbagai pertanyaan dan pernyataan DML, lalu cukup tempelkan nilai ke dalam kolom lain dan pernyataan insert / update Anda dibuat secara otomatis untuk Anda. Mengetik secara manual adalah cara yang sangat lambat untuk melakukannya, jadi lihat apakah Anda dapat menemukan trik menggunakan alat yang ada. Banyak editor teks yang berorientasi pengembang juga memiliki kemampuan untuk merekam dan menyimpan makro untuk membuat pekerjaan berulang seperti ini jauh lebih cepat dan lebih mudah.
sumber
Jika Anda memiliki file csv, Anda dapat menggunakan LOAD DATA INFILE ... untuk mengimpor data.
Jika Anda harus menggunakan kueri 'INSERT', melakukan insert massal akan mempercepat prosesnya. Alih-alih menjalankan kueri 'INSERT' untuk setiap baris, kelompokkan baris, ucapkan 100 dan jalankan kueri. Sesuatu seperti ini:
sumber
Cara efisien untuk menulis data kueri multi-kolom ke dalam MySQL DB adalah mengubah data ini ke dalam format JSON atau YAML dan menyisipkannya sebagai satu unit. Itu mengubah "tulis sebuah sisipan untuk tabel dengan 90 kolom" menjadi "tuliskan sisipan ke dalam tabel dengan satu kolom".
Dalam pendekatan ini, tidak semua yang perlu dipecah menjadi komponen dasar itu, dan datum tunggal disimpan hanya ke dalam 1 kolom.
sumber
Dengan MySQL Anda dapat menggunakan sintaks alternatif untuk
insert
pernyataan:sumber
Skenario Anda terlihat sangat cocok untuk solusi NoSQL, karena daftar atribut dapat berubah kapan saja formatnya berubah. Sudahkah Anda mengevaluasi opsi selain MySQL? Gali di sekitar DynamoDB / MongoDB / Cassandra - yang mungkin lebih cocok.
sumber
Ada cara yang lebih efisien untuk memasukkan data ke dalam basis data menggunakan php dan mysql. Kita dapat menggunakan LOAD COMMAND untuk memasukkan data. Ini menyisipkan data yang sangat cepat.
Untuk ini buat file flat (misalnya saya menggunakan file .csv) dengan data Anda menggunakan
fputcsv()
fungsi. Kemudian masukkan data menggunakan perintah LOAD. Sintaks beberapa yang mirip seperti di bawah ini:sumber
Coba yang berikut ini. Bekerja untukku.
Nama formulir harus sama dengan nama kolom basis data
Dapatkan nilainya seperti di bawah ini:
Pertama-tama Anda harus memasukkan ID sebelum loop foreach. Anda bisa mendapatkan id berikutnya dengan melakukan:
tambahkan 1 ke id dan masukkan.
sumber