কোনও মাইএসকিউএল ডাটাবেসে বড় ডেটাসেট প্রবেশের সর্বোত্তম উপায় কী (বা সাধারণ কোনও ডাটাবেস)


9

পিএইচপি প্রকল্পের অংশ হিসাবে, আমাকে মাইএসকিউএল ডাটাবেসে একটি সারি sertোকাতে হবে। আমি স্পষ্টতই এটি করতে অভ্যস্ত, তবে এটির জন্য একটি ক্যোয়ারীতে 90 টি কলামে প্রবেশ করা দরকার। ফলাফলের ক্যোয়ারীটি ভয়াবহ এবং একচেটিয়া দেখাচ্ছে (বিশেষত আমার পিএইচপি ভেরিয়েবলগুলি মান হিসাবে সন্নিবেশ করানো):

INSERT INTO mytable (column1, colum2, ..., column90) 
VALUES
('value1', 'value2', ..., 'value90')

এবং আমি উদ্বিগ্ন যে আমি এটি সঠিক পথে চলছি না। আমার কাছে সমস্ত কিছু টাইপ করতেও দীর্ঘ সময় (বিরক্তিকর) সময় লেগেছে এবং পরীক্ষার কোডটি লেখার জন্য পরীক্ষা করা সমানই ক্লান্তিকর হবে বলে আমি ভয় করি।

পেশাদাররা কীভাবে এই কোয়েরিগুলি দ্রুত লেখার এবং পরীক্ষার বিষয়ে যায়? আমি কীভাবে প্রক্রিয়াটি দ্রুততর করতে পারি?


2
আমি আরও উদ্বিগ্ন যে টেবিলের কলামের নামগুলিতে টাইপ করতে ব্যয় করা তুচ্ছ পরিমাণের চেয়ে 90 টি কলাম রয়েছে। (BTW আমি ড্র্যাগ এবং SQL সার্ভার মধ্যে একবারে সব কলাম ড্রপ, সেখানে মাইএসকিউএল বা পিএইচপি একই কাজ করতে aplace নয় আমি আপনাকে খুঁজে পেতে পারে এটি জীবন সহজ করে তোলে যেমন কোনো ত্রুটি নেই দেখতে চেহারা চাই?।)
এইচএলজিইএম

1
আমি জানি 90 টি কলাম অনেকগুলি, তবে প্রতিটি কলাম একটি পিডিএফ ডকুমেন্টের জন্য একটি একক ক্ষেত্রের সাথে সম্পর্কিত যা আমার পপুলিভ করা উচিত এবং আমি এটি ভেঙে ফেলার উপায়টি দেখতে পাচ্ছি না বা আমি কীভাবে এটি করব would এসকিউএল সার্ভার সম্পর্কে তথ্যের জন্য ধন্যবাদ। আমি নিশ্চিত নই যে আপনি কলামগুলি বুটকে টেনে আনতে এবং নামিয়ে দেওয়ার বিষয়ে কী বোঝাতে চেয়েছেন আমি একবার দেখতে পাব।
জো

1
একটি নির্বাচিত বিবৃতি লিখুন যা প্রদত্ত টেবিলের সমস্ত কলামগুলি তালিকাভুক্ত করে এবং সেখান থেকে চলে।
জেফো

জেফ ও: আমি এটিও ব্যবহার করেছি, সঠিকভাবে করা গেলে এটি খুব শক্তিশালী কৌশল হতে পারে। আপনার একটি উত্তর হিসাবে পোস্ট করতে হবে যদি আপনি একটি কোড উদাহরণ দিতে পারেন!
হতাশ

উত্তর:


7

জো, আপনার শেষ মন্তব্যটি অনেক ব্যাখ্যা করেছে। আমি মনে করি আসল সমস্যাটি হ'ল ডেটা ডিজাইন। যখন ডকুমেন্টের ফর্ম্যাটটি পরিবর্তন হয় তখন নতুন কলামগুলির প্রয়োজন হতে পারে এবং আমার অভিজ্ঞতা নথির বিন্যাসগুলি ঘন ঘন পরিবর্তিত হয়। প্রতি প্রতি একক সারি সহ 90-কলামের টেবিলের পরিবর্তে, আমি প্রতিবেদনটি চারটি কলামযুক্ত টেবিলে সংরক্ষণ করব: রিপোর্ট_আইডি, ফর্ম্যাট_আইডি, ক্ষেত্রের নাম, ক্ষেত্র_মূল্য। প্রতিটি প্রতিবেদন 90 টি সারি দ্বারা প্রতিনিধিত্ব করবে, প্রতিবেদনের প্রতিটি ক্ষেত্রের মানের জন্য একটি। এটি আপনার কোড যথেষ্ট সরল করা উচিত।


আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. সমস্ত ক্ষেত্র (সূচক ব্যতীত) ভর্চারস, যাতে এটি আমার পক্ষে কাজ করে (এবং আমি অন্য মানগুলি যেভাবেই রূপান্তর করতে পারি)। যদিও আমি হয়ত অনেক জায়গা নষ্ট করছি কারণ ক্ষেত্রের_মূল্য কলামটির আকারটি সর্বাধিক মান (প্রায় 256 অক্ষর দীর্ঘ) এ সেট করতে হবে, তবে কিছু ক্ষেত্রের দৈর্ঘ্য ৩. এটি অবশ্যই ব্যবহার করা সহজ হবে এবং আমি বুঝতে পারি এটি কীভাবে ভবিষ্যতের প্রমাণ হিসাবে বর্ণনা করবে be
জো

4
এফডাব্লুআইডাব্লু, বেশিরভাগ ডাটাবেস সিস্টেম কেবল ডেটা সঞ্চয় করার জন্য প্রয়োজনীয় স্থান ব্যবহার করে। সুতরাং আপনি যদি একটি VARCHAR (256) ক্ষেত্রে কেবলমাত্র 3 টি অক্ষর সঞ্চয় করেন তবে 256 নয়, কেবল 3 বাইট লাগবে My ঘোষিত আকার।
TMN

@ টিএমএন এটিই ভিআরএইচআরআর-এর ভিআর মানে! পরিবর্তনশীল দৈর্ঘ্য চর। এটি ডিবি সিস্টেম নয় ডেটা টাইপের একটি ফাংশন (বা সংজ্ঞা)। এছাড়াও এটি নয় যে কোনও ভ্রোচারের পরিবর্তনশীল দৈর্ঘ্য হওয়ায়, প্রতিটি মানের জন্য দৈর্ঘ্যটি ডিবিকে জানতে হবে, সুতরাং এটি দৈর্ঘ্যটি মেটাডেটা হিসাবে সঞ্চয় করে। তার মানে ওভারহেড স্টোরেজ! সুতরাং একটি VARCHAR (1) ওভারহেডের কারণে আসলে 3 বাইট ডেটা ব্যবহার করে, 3x হিসাবে চার হিসাবে (1)!
মরনস

2
-1, আমি এই উত্তরটির সাথে একমত নই, এই ক্ষেত্রে আপনি 90 টি কলাম দিয়ে ভাল আছেন better সত্তার যদি 90 ডেটা পয়েন্ট থাকে, তবে তা হয়ে উঠুন, আপনার ডেটাটি যৌক্তিক রাখুন।
মরনস

@ টিএমএন কেবল আমার বক্তব্য স্পষ্ট করতে বলেছে, "সুতরাং যদি আপনি কোনও ভ্রচার (256) ক্ষেত্রের মধ্যে কেবল 3 টি অক্ষর সংরক্ষণ করেন তবে এটি কেবল 3 বাইট লাগবে" সত্য সত্য এটি 5 বাইট গ্রহণ করবে না 3
মরোনস

7

সাধারণভাবে, কোনও এসকিউএল ডাটাবেসে একটি বড় ডেটাসেট লোড করার দ্রুততম উপায় হল নেটিভ বাল্ক লোডিং ইন্টারফেসটি ব্যবহার করা। আমি যতদূর জানি, প্রতিটি এসকিউএল ডিবিএম-এর কমপক্ষে একটি থাকে।

মাইএসকিউএল ডক্স: বাল্ক লোডার ব্যবহার করে

আমি আছে একটি tab- অথবা SQL ঢোকান বিবৃতি মধ্যে কমা দ্বারা আলাদা করা ফাইল চালু করতে, আমি awk ব্যবহার ইনপুট ফাইল পড়তে এবং আউটপুট ফাইল লিখতে। অ্যাডাব্লিকেশন সম্পর্কে সত্যিকারের বিশেষ কিছুই নেই; এটি কেবলমাত্র আমি সবচেয়ে ভাল জানি পাঠ্য-প্রক্রিয়াকরণ ভাষা হতে পারে। পার্ল, পাইথন, রুবি, রেজিক্স, লিস্প ইত্যাদি ক্ষেত্রে কোড লিখে আপনি একই ফলাফল পেতে পারেন।


2
বিপুল সংখ্যক সারি সন্নিবেশ করানোর প্রয়োজন হলে বাল্ক লোডিং হ'ল উপায় তবে এই ক্ষেত্রে তিনি প্রচুর কলাম সহ কেবল একটি একক সারি সন্নিবেশ করছেন। বাল্ক লোডিং সাহায্য করবে না এবং সম্ভবত সোজা পদ্ধতির চেয়ে বেশি কোড লেখার প্রয়োজন হবে।
TMN

-1, এই উত্তরটি প্রশ্নের বিন্দুটি পুরোপুরি অনুপস্থিত
ডক ব্রাউন

2

আপনি যদি সহজেই কোনও এক্সেল স্প্রেডশীটে কলামের নামগুলি পেতে পারেন, আপনি বিভিন্ন প্রশ্ন এবং ডিএমএল স্টেটমেন্টের কোড তৈরি করতে এক্সেল ম্যাক্রো লিখতে পারেন, তবে কেবল অন্য কলামে মানগুলি পেস্ট করুন এবং আপনার সন্নিবেশ / আপডেট বিবৃতিটি স্বয়ংক্রিয়ভাবে আপনার জন্য তৈরি হয়ে যায়। ম্যানুয়ালি টাইপ করা এটি করার একটি খুব ধীর উপায়, সুতরাং আপনার বিদ্যমান সরঞ্জামগুলি ব্যবহার করে কৌশলগুলি খুঁজে পেতে পারেন কিনা তা দেখুন। অনেক বিকাশমুখী টেক্সট এডিটরগুলির কাছে এই জাতীয় পুনরাবৃত্ত কাজগুলিকে আরও দ্রুত এবং সহজ করার জন্য রেকর্ডিং এবং সঞ্চয় করার ক্ষমতাও রয়েছে।


2

আপনার যদি কোনও সিএসভি ফাইল থাকে তবে ডেটা আমদানি করতে আপনি লোড ডেটা ইনফিল ব্যবহার করতে পারেন ।

যদি আপনাকে 'INSERT' ক্যোয়ারী ব্যবহার করতে হয়, তবে বাল্ক সন্নিবেশগুলি করা প্রক্রিয়াটিকে ত্বরান্বিত করবে। প্রতিটি একক সারির জন্য 'INSERT' ক্যোয়ারী চালানোর পরিবর্তে, সারিগুলিকে গ্রুপ করুন, 100 বলুন এবং ক্যোয়ারি চালান run এটার মতো কিছু:

INSERT INTO theTable (col1, col2, col3,....., col89, col90) 
VALUES
(val11, val12, val13, ........, val189, val190),
(val21, val22, val23, ........, val289, val290),
.......
......
(val101, val102, val103, ........, va1089, val1090);

2

মাইএসকিউএল ডিবিতে মাল্টি-কলামগুলির ক্যোয়ারী ডেটা লেখার একটি দক্ষ উপায় হ'ল এই ডেটাগুলিকে জেএসওএন বা ওয়াইএমএল ফর্ম্যাটে রূপান্তর করা এবং তাদের একক ইউনিট হিসাবে সন্নিবেশ করা। এটি "90 টি কলাম সহ একটি টেবিলের জন্য একটি সন্নিবেশ লিখুন" তে "একটি কলাম সহ একটি সারণিতে একটি সন্নিবেশ লিখুন" তে পরিবর্তন করে।

এই পদ্ধতির ক্ষেত্রে, সমস্ত কিছুকে তার বেস উপাদানগুলিতে ভাঙার প্রয়োজন হয় না এবং একক ডাটামটি কেবল 1 কলামে সংরক্ষণ করা হয়।


@gnat: এটি একটি বিকল্প সমাধান দেয়। এটি "90 টি কলাম সহ একটি টেবিলের জন্য একটি সন্নিবেশ লিখুন" তে "একটি কলাম সহ একটি সারণিতে একটি সন্নিবেশ লিখুন" তে পরিবর্তন করে। বর্ণিত হিসাবে সমস্যাটি দেওয়া, এটি একটি বৈধ সমাধান। সমস্ত কিছু এর বেস উপাদানগুলিতে বিভক্ত হওয়ার দরকার নেই। কেবলমাত্র একই অনুরূপ উত্তর, সম্পূর্ণ এসওকিউএল ডাটাবেসকে পুরোপুরি সরিয়ে পুরো এনএসকিউএল যাওয়ার পরামর্শ দিয়েছে, যা ওভারকিল k এই উত্তরটি বলে যে আপনি একটি মিশ্র পদ্ধতির ব্যবহার করতে পারেন। এই একক ডাটামের জন্য মাত্র 1 কলাম তৈরি করুন। বিকল্পটি বাইনারি কলাম থাকতে পারে এবং পুরো পিডিএফ সঞ্চয় করতে পারে তা বিবেচনা করুন।
jmoreno

@gnat: আমি নভিফকে তার নিজের কথায় রাখার সুযোগ দেব ...
jmoreno

@ জিনাট এবং জোমোরানো - আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি আমার উত্তরের জিনাতের স্পষ্টতা পছন্দ করি এবং আমি তার স্পষ্টতার ভিত্তিতে উত্তরটি সম্পাদনা করি।
নভিফ

0

মাইএসকিউএল এর সাহায্যে আপনি insertবিবৃতিগুলির জন্য বিকল্প বাক্য গঠন ব্যবহার করতে পারেন :

insert into table
        set column1 = value1
          , column2 = value2
          , column3 = value3

1
এটি কি আসলে দ্রুত?
পেসারিয়ার

@ পেসারিয়ার না, এটি দ্রুত নয়। ঠিক অন্য বাক্য গঠন।
কাস্পার্স ফয়েগস

0

আপনার পরিস্থিতি কোনও নোএসকিউএল সমাধানের জন্য খুব ভাল ফিট দেখাচ্ছে, কারণ বৈশিষ্ট্য তালিকা যে কোনও সময় ফর্ম্যাট পরিবর্তিত হতে পারে। আপনি কি মাইএসকিউএল ব্যতীত অন্যান্য বিকল্পগুলি মূল্যায়ন করেছেন? ডায়নামোডিবি / মঙ্গোডিবি / ক্যাসান্দ্রার চারপাশে খনন করুন - এটি আরও ভাল ফিট হতে পারে।


-1

পিএইচপি এবং মাইএসকিএল ব্যবহার করে ডাটাবেসে ডেটা toোকানোর আরও কার্যকর উপায় রয়েছে। ডেটা toোকাতে আমরা লোড কম্যান্ড ব্যবহার করতে পারি। এটি ডেটা উল্লেখযোগ্যভাবে দ্রুত .োকায়।

এর জন্য fputcsv()ফাংশন ব্যবহার করে আপনার ডেটা সহ একটি ফ্ল্যাট ফাইল তৈরি করুন (উদাহরণস্বরূপ আমি .csv ফাইলটি ব্যবহার করেছি) । তারপরে LOAD কমান্ড ব্যবহার করে ডেটা .োকান। নীচের মতো কিছু অনুরূপ সিনট্যাক্স:

LOAD DATA LOCAL INFILE "C:/downloads/local/my_data_file.csv"
INTO TABLE  my_data
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

-1

নিম্নলিখিত চেষ্টা করুন। আমার জন্য কাজ করেছেন।

ফর্মের নাম অবশ্যই ডাটাবেস কলামের নামের সমান

নীচের মত মান পান:

foreach ($_GET as $formName => $value) {
    $sql = mysql_query("UPDATE table_name SET $formName = '$value' WHERE ID= $id");
}

ফোরচ লুপের আগে আপনাকে প্রথমে একটি আইডি toোকাতে হবে। আপনি পরবর্তী আইডি পেতে পারেন:

SELECT MAX(id) FROM .....

আইডিতে 1 যোগ করুন এবং এটি sertোকান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.