การใช้ข้อมูลโหลด MySQL
ในฐานข้อมูลวิธีที่พบบ่อยที่สุดในการเขียนข้อมูลคือการเขียนผ่าน SQL Insert และนอกจากนี้เพื่อกู้คืนฐานข้อมูลผ่านไฟล์สำรอง ไฟล์สำรองนี้เป็นสคริปต์ SQL ใน MySQL แต่จริง ๆ แล้วมันถูกดำเนินการในคำสั่งแทรกแบทช์
ในทางปฏิบัติพบปัญหาสองประเภท: หนึ่งคือการนำเข้าข้อมูลเช่นการนำเข้าข้อมูลจาก Word, Excel Table หรือเอกสาร TXT (ข้อมูลนี้โดยทั่วไปมาจากเอกสารที่ป้อนโดยบุคลากรที่ไม่ใช่ด้านเทคนิคผ่านเครื่องมือสำนักงาน); อีกอย่างคือการแลกเปลี่ยนข้อมูลเช่นการแลกเปลี่ยนข้อมูลระหว่างฐานข้อมูล MySQL, Oracle และ DB2
สิ่งนี้ประสบปัญหา: มีความแตกต่างในสคริปต์ฐานข้อมูล SQL และ SQL Exchange นั้นลำบากมากขึ้น อย่างไรก็ตามฐานข้อมูลเกือบทั้งหมดรองรับการส่งออกข้อมูลข้อความ (LOAD) (EXPORT) การใช้สิ่งนี้เราสามารถแก้ปัญหาการแลกเปลี่ยนข้อมูลและนำเข้าปัญหาที่กล่าวถึงข้างต้น
คำสั่ง Load DatainFile ของ MySQL ใช้ในการอ่านแถวจากไฟล์ข้อความที่ความเร็วสูงและโหลดลงในตาราง ชื่อไฟล์จะต้องเป็นสตริงตัวอักษร ต่อไปนี้เป็นคำอธิบายตัวอย่างของ MySQL5 ซึ่งแสดงวิธีการใช้คำสั่ง LoadData ของ MySQL เพื่อใช้การนำเข้าข้อมูลข้อความ
หมายเหตุ: ข้อความที่กล่าวถึงที่นี่คือข้อความที่มีรูปแบบที่แน่นอนเช่นสาขาข้อความแต่ละบรรทัดจะถูกคั่นด้วยสัญลักษณ์เดียวกัน ฯลฯ ดังนั้นจึงมีหลายวิธีในการรับข้อความดังกล่าวเช่นการบันทึกคำและตาราง Excel ลงในข้อความหรือไฟล์ CSV
ในโครงการสภาพแวดล้อมที่ใช้คือการอัปโหลดไฟล์ CSV อย่างรวดเร็ว ระบบดั้งเดิมใช้ฐานข้อมูล DB2 จากนั้นฟังก์ชั่นคล้ายกับ loadData ของ MySQL เรียกว่า sysproc.db2load อย่างไรก็ตาม LoadData ไม่สามารถใช้ในขั้นตอนการจัดเก็บ MySQL ได้ วิธีนี้เรียกว่าในรหัส Java เมื่อใช้วิธีการ
ตัวอย่างการใช้งาน:
เตรียมแบบฟอร์มทดสอบ
SQL มีดังนี้:
ใช้การทดสอบ; สร้างตาราง `test` (` id` int (10) ที่ไม่ได้ลงนามไม่ใช่ null auto_increment, `a` int (11) ไม่ใช่ null,` b` bigint (20) ไม่ได้ลงนามไม่เป็นโมฆะ `c` bigint (20) ไม่ได้ลงนาม null, คีย์หลัก (`id`), คีย์` a_b` (`a`,` b`)) เครื่องยนต์ = innoDB auto_increment = 1 charset = utf8
รหัส Java มีดังนี้:
แพ็คเกจ com.seven.dbtools.dbtools; นำเข้า org.apache.log4j.logger; นำเข้า org.springframework.jdbc.core.jdbctemplate; นำเข้า java.io.bytearrayinputstream; นำเข้า Java.Io.inputstream; java.sql.sqlexception; นำเข้า javax.sql.datasource;/** * @author เจ็ด * @since 07.03.2013 */คลาสสาธารณะ bulkloaddata2mysql {ส่วนตัว JDBCTEMPLATE ส่วนตัว JDBCTEMPLATE; การเชื่อมต่อส่วนตัว conn = null; โมฆะสาธารณะ setDataSource (DataSource DataSource) {this.jdbctemplate = ใหม่ jdbctemplate (DataSource); } สาธารณะคงที่ public InputStream getTestDatainputStream () {StringBuilder builder = new StringBuilder (); สำหรับ (int i = 1; i <= 10; i ++) {สำหรับ (int j = 0; j <= 10,000; j ++) {builder.append (4); builder.append ("/t"); builder.append (4 + 1); builder.append ("/t"); builder.append (4 + 2); builder.append ("/t"); builder.append (4 + 3); builder.append ("/t"); builder.append (4 + 4); builder.append ("/t"); builder.append (4 + 5); builder.append ("/n"); }} byte [] bytes = builder.toString (). getBytes (); InputStream คือ = ใหม่ byteArrayInputStream (ไบต์); ผลตอบแทนคือ; } / ** * * โหลดข้อมูลจำนวนมากจาก inputstream ไปยัง mysql * / public int publkloadfrominputstream (สตริง loaddatasql, inputstream dataastream) พ่น sqlexception {ถ้า (dataastream == null) {logger.info ("อินพุต กลับ 0; } conn = jdbctemplate.getDataSource (). getConnection (); คำสั่ง PreparedStatement = conn.preperestatement (loadDatasQl); int result = 0; if (stement.iswrapperfor (com.mysql.jdbc.statement.class)) {com.mysql.jdbc.preparedstatement mysqlstatement = statement.unwrap (com.mysql.jdbc.preparedStatement.class); MySqlStatement.setLocalInfileInputStream (DataStream); result = mysqlstatement.executeUpdate (); } ผลตอบแทนผลลัพธ์; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {String testsql = "โหลดข้อมูลในท้องถิ่น infile 'sql.csv' ไม่สนใจในการทดสอบตารางการทดสอบ (a, b, c, d, e, f)"; inputStream dataastream = getTestDatainputStream (); bulkloadData2MySql dao = ใหม่ bulkloadData2MySql (); ลอง {long begintime = system.currentTimeMillis (); int rows = dao.bulkloadfrominputstream (testsql, dataastream); endtime long = system.currentTimeMillis (); logger.info ("นำเข้า" + rows + "ข้อมูลแถวลงใน mysql และค่าใช้จ่าย" + (endtime - begintime) + "MS!"); } catch (sqlexception e) {e.printstacktrace (); } system.exit (1); -คำใบ้:
รหัสในตัวอย่างใช้วิธี SetLocalInfileInputStream ซึ่งจะละเว้นชื่อไฟล์โดยตรงและนำเข้าสตรีม IO ลงในฐานข้อมูล ในการใช้งานจริงคุณสามารถอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์จากนั้นอ่านไฟล์แล้วนำเข้าไฟล์ ในเวลานี้ควรลบพารามิเตอร์ท้องถิ่นของข้อมูลโหลดและชื่อไฟล์ควรเป็นชื่อของเส้นทางที่สมบูรณ์แบบ
ในที่สุดก็มีการแนบไวยากรณ์ของ Infile Data
โหลดข้อมูล [low_priority | พร้อมกัน] [local] infile 'file_name.txt' [แทนที่ | ละเว้น] ลงในตาราง tbl_name [ฟิลด์ [สิ้นสุดโดย 'สตริง'] [[ตัวเลือก] ล้อมรอบด้วย 'char'] [หลบหนีโดย 'char']] [บรรทัด [เริ่มต้นด้วย 'สตริง'] [ยกเลิกโดย 'สตริง']]
สรุป
LoadData เป็นคำสั่งที่มีประโยชน์มาก เร็วกว่าที่จะนำเข้าข้อมูลจากไฟล์มากกว่าคำสั่งแทรก เอกสาร MySQL บอกว่ามันเร็วขึ้นประมาณ 20 เท่า อย่างไรก็ตามมีตัวเลือกมากมายสำหรับคำสั่ง แต่ส่วนใหญ่ไม่สามารถใช้งานได้ หากคุณต้องการจริงๆเพียงอ่านเอกสารอย่างเป็นทางการเมื่อใช้งาน