Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhập tệp CSV lớn vào MySQL

hãy thử tối ưu hóa các tập lệnh của bạn trước. Trước hết, đừng bao giờ chạy các truy vấn đơn lẻ khi nhập trừ khi bạn không có lựa chọn nào khác, chi phí mạng có thể là một kẻ giết người.

Hãy thử một cái gì đó như (rõ ràng là chưa được kiểm tra và được mã hóa trong hộp văn bản SO, chọn dấu ngoặc vuông khớp với e.c.t.):

$url = 'http://www.example.com/directory/file.csv';
if (($handle = fopen($url, "r")) !== FALSE) 
{
fgetcsv($handle, 1000, ",");

$imports = array();

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{
    $EvID = $data[0];
    $Ev = $data[1];
    $PerID = $data[2];
    $Per = $data[3];
    $VName = $data[4];
    $VID = $data[5];
    $VSA = $data[6];
    $DateTime = $data[7];
    $PCatID = $data[8];
    $PCat = $data[9];
    $CCatID = $data[10];
    $CCat = $data[11];
    $GCatID = $data[12];
    $GCat = $data[13];
    $City = $data[14];
    $State = $data[15];
    $StateID = $data[16];
    $Country = $data[17];
    $CountryID = $data[18];
    $Zip = $data[19];
    $TYN = $data[20];
    $IMAGEURL = $data[21];
    $URLLink = $data[22];

        $data[7] = strtotime($data[7]);
        $data[7] = date("Y-m-d H:i:s",$data[7]);

    if((($PCatID == '2') && (($CountryID == '217') or ($CountryID == '38'))) || (($GCatID == '16') or ($GCatID == '19') or ($GCatID == '30') or ($GCatID == '32'))) 
    {

    $imports[] = "('".md5($EventID.$PerformerID)."','".addslashes($data[0])."','".addslashes($data[1])."','".addslashes($data[2])."','".addslashes($data[3])."','".addslashes($data[4])."',
                    '".addslashes($data[5])."','".addslashes($data[6])."','".addslashes($data[7])."','".addslashes($data[8])."','".addslashes($data[9])."',
                '".addslashes($data[10])."','".addslashes($data[11])."','".addslashes($data[12])."','".addslashes($data[13])."','".addslashes($data[14])."',
                    '".addslashes($data[15])."','".addslashes($data[16])."','".addslashes($data[17])."','".addslashes($data[18])."','".addslashes($data[19])."',
                '".addslashes($data[20])."','".addslashes($data[21])."')";



    }
}

$importarrays = array_chunk($imports, 100);
foreach($importarrays as $arr) {

 if(!mysql_query("INSERT IGNORE INTO TNDB_CSV2 
                (id, EvID, Event, PerID, Per, VName,
                     VID, VSA, DateTime, PCatID, PCat,                
                CCatID, CCat, GCatID, GCat, City,
                     State, StateID, Country, CountryID, Zip,
                TYN, IMAGEURL) VALUES ".implode(',', $arr)){

     die("error: ".mysql_error());

 }

 }

fclose($handle);
}

Thử với số lượng trong array_chunk, quá lớn và nó có thể gây ra các vấn đề như truy vấn quá dài (vâng, có giới hạn có thể định cấu hình trong my.cnf), quá nhỏ và chi phí không cần thiết.

Bạn cũng có thể bỏ việc sử dụng gán $ data [x] cho các biến vì điều đó thật lãng phí vì script quá nhỏ, chỉ cần sử dụng $ data [x] trực tiếp trong truy vấn e.c.t. (sẽ không đưa ra một cải tiến lớn, nhưng tùy thuộc vào kích thước nhập của bạn, nó có thể tiết kiệm một chút).

Điều tiếp theo sẽ là sử dụng các bản cập nhật / chèn có mức ưu tiên thấp, hãy xem phần này để biết thêm thông tin về điều đó giúp bạn bắt đầu: Làm cách nào để ưu tiên cho các truy vấn nhất định?

sau tất cả những điều đó, bạn có thể nghĩ đến tối ưu hóa cấu hình mysql, nhưng đó là cách để google giải thích thực sự vì các cài đặt tốt nhất là khác nhau đối với mọi người và các tình huống riêng của họ

Chỉnh sửa: Một điều khác mà tôi đã làm trước đây là nếu bạn có nhiều khóa được thiết lập không cần thiết cho quá trình nhập, bạn có thể tạm thời bỏ các khóa đó và thêm chúng trở lại khi tập lệnh hoàn tất. Điều này cũng có thể mang lại những cải thiện tốt về thời gian, nhưng khi bạn làm việc trên cơ sở dữ liệu trực tiếp, có những cạm bẫy phải giải quyết nếu bạn đi theo lộ trình đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nếu bảng không tồn tại, hãy thực hiện một truy vấn dài

  2. Mysql - chuỗi nhiều chỉ mục cột

  3. Ngày của bảng tổng hợp mysql (dữ liệu dọc sang ngang)

  4. Cách định cấu hình nhóm kết nối chuỗi JTA eclipselink

  5. làm thế nào để sử dụng hàm mysql now () trong cakephp cho các trường ngày tháng?