افزايش سرعت insert در ديتابيس mysql - تفاوت موتورهاي InnoDB و MyISAM و عمليات Bulk Insert (اختصاصي)
افزايش سرعت insert در ديتابيس mysql - تفاوت موتورهاي InnoDB و MyISAM و عمليات Bulk Insert
چه عنوان هيبريدي شد ! . خلاصه و مفيد : وقتي يه تيبل ميسازيد هميشه مواظب باشيد كه موتور ذخيره سازي مناسب با كاري كه اون تيبل ميخواد انجام بده رو انتخاب كنيد اگر با phpmyadmin (حفظ الله من التحريم) كار ميكنيد و ديفالت روي InnoDB هست مواظب باشيد كه چيكار داريد ميكنيد كلي مقاله خوب و خلاصه در نت هست ميتونين بخونين كه كجا بايد از اين استفاده كنيد كجا از MyISAM حالا منم اينجا يه چندتا فرقش رو ميگم در MyISAM بحث كليد خارجي يا ترنزكشن وجود نداره كه البته خيلي مهمه اما سرعت كار اون بسيار بيشتر از نوع Innodb هست . همچنين بر خلاف InnoDB كه قفل كردن اون ركورد بيس هست ايشون تيبل بيس هستند ! يعني براي هر عمليات اينسرت يا اپديت كل تيبل قفل ميشه تا ايشون كارش رو انجام بده بعد دوباره تيبل در دسترس كوري هاي بعدي قرار ميگيره يعني اگر همزمان 10 يوزر بخوان يه چيزي رو در تيبل شما درج كنند بايد برن توي صف تا دونه دونه كارشون انجام بشه در حالي كه در innodb فقط ركورد مربوطه قفل ميشه و اگر اون 10 درخواست مربوط به يك ركورد خاص نباشن هر 10 تا همزمان انجام ميشن همچنين در MyIsam تعداد ركوردهاي يك جدول ذخيره ميشه و شما در دستور select count(*) كه استفاده ميكنيد اين موتور هر بار ركوردها رو شمارش نميكنه بلكه تعدادش رو ذخيره كرده و به شما پس ميده (خوبه !) اما در انواع ديگر موتور ها هر بار بايد سرشماري بشه : نقل قول:
اما تفاوت اصلي بعدي FULLTEXT indexing هست كه در MyISAM ساپورت ميشه اما در Innodb ساپورت نميشه (ميتونيد بخونيد كه فول تكست سرچ چيه ) . در پست بعدي تجربه خودم رو مينويسم در مورد اين دو همچنين بالك اينسرت |
تفاوت MyISAM vs INnoDB موتور ديتابيس MYSQL - دستور Bulk insert و خواندن اطلاعات از فايل LOAD DATA INFILE
تفاوت MyISAM vs INnoDB موتور ديتابيس MYSQL - دستور Bulk insert و خواندن اطلاعات از فايل LOAD DATA INFILE
اول خيلي سريع بگم كه در موتور Innodb بنده اعداد 1 تا 1000 رو توسط php در جدول درج كردم از 30 ثانيه بيشتر طول كشيد و خطاي تايم اوت 30 ثانيه رو داد و حدود 650 تاشو درج كرده بود در حالي كه با دستور LOAD DATA IN FILE 100 هزار عدد رو در كمتر از 1 ثانيه به داخل ديتابيس فرستادم ! (در همون innodb). {شیت شدن} کد:
LOAD DATA INFILE 'c:\\1.txt' INTO TABLE `num` در ضمن توليد اون 100000 عدد در پي اچ پي حدود 1 دقيقه طول كشيد اما در كمتر از 1 ثانيه ديتابيس تونست اونو لود كنه در همون Innodb كه ميخوايم بگيم نسبت به myisam كندتر هست . همين تست رو براي Myisam گرفتم حدود 10 برابر سريعتر بود !: _باوش اعداد رو دو برابر كردم يعني 200 هزار عدد رو طي : 199999 rows inserted. ( Query took 0.1062 sec ) به داخل جدولي از نوع myisam فرستادم ! . (يك دهم ثانيه 200 هزار اينسرت انجام داد ) و اين 200 هزار تا با innodb : 199999 rows inserted. ( Query took 1.9816 sec ) يك نكته : تا اونجايي كه من اطلاع دارم Bulk insert با insert معمولي متفاوت هست حداقل در اس كيو ال سرور مايكروسافت خود من بارها از دستور بالك كپي و BCP.exe براي خواندن اطلاعات از فايلها استفاده كرده ام براي مثال دستور در MS SQL SERVER (لااقل بعد از 2005 ) استفاده ميشه (BCP.exe هم فوق العاده س ) کد:
BULK INSERT myDatabase.MyTable FROM 'C:\MyTextFile.txt' WITH FIELDTERMINATOR = ',' اما ايشون در اينجا بالك اينسرت رو با اينسرت معمولي يكي گرفته ! و تازه بر خلاف ادعاي اوليه خودش كه لود از فايل در ماي اس كيو ال بسيار (اكسترملي) سريع هست در بنچماركش اين نتيجه رو گرفته كه فرقي نكرده اند چندان و حتي اينسرت معمولي براش بهتر بوده . با اين حال براي خود بنده اين دو خيلي متفاوت بود داكيومنت MYSQL : نقل قول:
براي بالا بردن ظرفيت bulk insert mysql : Go ahead and add this to my.cnf [mysqld] bulk_inset_buffer_size=256M You could also set it just for your session before launching extended INSERTs استفاده از بالك اينسرت و خواندن اطلاعات از فايل در ديتابيس MYSQL وآدرس دهي فايل مورد نظر در دستور LOAD DATA INFILE LOAD DATA INFILE 'C:/DataSet.csv' INTO TABLE test.LargeDataSet S TERMINATED BY '\r\n'; FIELDS TERMINATED BY ',' LINE حتما حواستون باشه كه ادرس فايل رو وقتي وارد ميكنيد بايد از / استفاده كنيد و نه \ (مطابق مثال بالا) تيبلتون رو بايد مناسب محتويات فايل بسازيد دستور بالا رو نگاه كنيد متوجه ميشيد . |
تفاوت innodb و myisam و insert و LOAD DATA INFILE
تفاوت innodb و myisam و insert و LOAD DATA INFILE
خلاصه : اون 1000 عددي كه توسط php در يك جدول از نوع INNODB وارد كردم و 600 تاش رو در 30 ثانيه وارد كرد به دو طريق ميشه سريعتر وارد كرد اول اينكه موتور جدول رو به MYISAM عوض كرد ( تقريبا زير 1 ثانيه طول كشيد تا 1000 عدد رو وارد كنه ) يا اينكه اعداد رو در داخل فايل بريزيد و با دستور لود از فايل با همون موتور قبلي innodb اونو وارد كنيد (بازم زير 1 ثانيه طول كشيد ) -------------------- How to change your table Engine type from MyISAM to Innodb? You do so by simply issuing the "ALTER TABLE" DDL statement: نقل قول:
http://c0935082.cdn.cloudfiles.racks...DB_article.png Log into the PHPMyAdmin utility through your control panel. If you are unsure how, please see Working with a MySQL database for instruction on how to login to PHPMyAdmin. Select the database which contains the Table-Name Click on the SQL tab Paste in the query provided above. Be sure to replace table-name with the correct name of your table Click the GO button.
======================= MySQL Engines: InnoDB vs. MyISAM – A Comparison of Pros and Cons The 2 major types of table storage engines for MySQL databases are InnoDB and MyISAM. To summarize the differences of features and performance,
Advantages of InnoDB
|
اکنون ساعت 12:57 AM برپایه ساعت جهانی (GMT - گرینویچ) +3.5 می باشد. |
Powered by vBulletin® Version 3.8.4 Copyright , Jelsoft Enterprices مدیریت توسط کورش نعلینی
استفاده از مطالب پی سی سیتی بدون ذکر منبع هم پیگرد قانونی ندارد!! (این دیگه به انصاف خودتونه !!)
(اگر مطلبی از شما در سایت ما بدون ذکر نامتان استفاده شده مارا خبر کنید تا آنرا اصلاح کنیم)