คำถามติดแท็ก innodb

InnoDB: เครื่องมือจัดเก็บ ACID ที่สอดคล้องกับ MySQL

2
innodb_flush_method = O_DIRECT vs O_DSYNC ผลกระทบต่อประสิทธิภาพใน ext3 กับพาร์ติชันดิสก์ LVM
ในหนึ่งในสภาพแวดล้อมการผลิตของฉันเรามีสองอินสแตนซ์ที่ทำงานบนคลัสเตอร์ RedHat โดยมีหนึ่งอินสแตนซ์การผลิตที่เกี่ยวข้องกับคลัสเตอร์ เรามีหน่วยความจำหลัก 125G พร้อมพูลบัฟเฟอร์ InnoDB 24G ซึ่งครอบครองโดย instance1 & 12G ที่ครอบครองโดย instance2 ซึ่งไม่เกี่ยวข้องกับคลัสเตอร์ RedHat ทั้งข้อมูลและบันทึกธุรกรรมอยู่บนพาร์ติชั่นดิสก์ LVM พร้อมระบบไฟล์ ext3 สำหรับการเพิ่มประสิทธิภาพการทำงานที่ดีขึ้นและ I / O throughput ที่ฉันได้ตัดสินใจที่จะเปลี่ยนแปลงไปinnodb_flush_methodO_DIRECT อ้างอิงจากเอกสารของ MySQL: ที่ข้อมูล InnoDB และไฟล์เข้าสู่ระบบตั้งอยู่บน SAN จะได้รับพบว่าการตั้งค่าinnodb_flush_methodเพื่อO_DIRECTประสิทธิภาพสามารถลดง่ายSELECTงบโดยปัจจัยที่สาม หมายถึงการที่มีประสิทธิภาพสูง MySQL Ver 2 และ 3 มันบอกว่านักพัฒนา InnoDB innodb_flush_method=O_DSYNCพบข้อบกพร่องเกี่ยวกับการใช้ O_SYNCและO_DSYNCคล้ายกับfsync()และfdatasync(): O_SYNCซิงค์ทั้งข้อมูลและเมตาดาต้าในขณะที่O_DSYNCซิงค์ข้อมูลเท่านั้น ถ้านั่นดูเหมือนคำอธิบายมากมายโดยไม่มีคำแนะนำนี่คือคำแนะนำ: ถ้าคุณใช้ระบบปฏิบัติการยูนิกซ์เหมือนระบบปฏิบัติการและควบคุม RAID ของคุณมี writecache O_DIRECTแบตเตอรี่สำรองเราขอแนะนำให้คุณใช้ …

1
เหตุใด DELETE จึงช้ากว่า SELECT มากแล้วจึงลบตาม id
ฉันมีตาราง InnoDB ที่ค่อนข้างยุ่ง (200,000 แถวฉันเดาได้ว่ามีหลายสิบข้อความค้นหาต่อวินาที) เนื่องจากข้อผิดพลาดฉันได้รับ 14 แถวที่มีที่อยู่อีเมลไม่ถูกต้อง (เหมือนกัน) และต้องการลบทิ้ง ฉันลองDELETE FROM table WHERE email='invalid address'และได้รับ "เกินเวลารอการล็อค" หลังจากนั้นประมาณ 50 วินาที สิ่งนี้ไม่น่าประหลาดใจนักเนื่องจากคอลัมน์แถวไม่ได้จัดทำดัชนี อย่างไรก็ตามฉันทำSELECT id FROM table WHERE email='invalid address'และใช้เวลา 1.25 วินาที วิ่งDELETE FROM table WHERE id in (...)คัดลอกรหัสจากผลลัพธ์ SELECT ใช้เวลา 0.02 วินาที เกิดอะไรขึ้น? ใครสามารถอธิบายได้ว่าเหตุใด DELETE ที่มีเงื่อนไขจึงช้าลงจนหมดเวลา แต่การเลือก SELECT จากนั้นการลบด้วย id นั้นเร็วมาก …

2
แบบสอบถามทั้งสองนี้จะส่งผลให้เกิดการหยุดชะงักหากดำเนินการตามลำดับหรือไม่
นี่เป็นสาเหตุของคำถามอื่น ๆ ของฉันแต่ฉันคิดว่ามันคุ้มค่าที่จะแยกทั้งสองออกจากกันเนื่องจากฉันมีสมมติฐานตามบันทึกต่อไปนี้ที่ฉันชอบที่จะปลอมแปลงหรือตรวจสอบ สมมติฐานของฉันคือว่าการหยุดชะงักอื่น ๆเป็นผลมาจากการสอบถามต่อไปนี้โดยมีการซ่อนแบบสอบถามดั้งเดิมที่อยู่บนพื้นฐานของความเข้าใจของฉันสถานะ Innodb แสดงเฉพาะธุรกรรมล่าสุด (ถูกต้องหรือไม่) จากบันทึกฉันได้ตรวจสอบรหัสของเราและพบว่ามีการค้นหาสองรายการต่อไปนี้ตามลำดับ: db.Execute("UPDATE people SET iphone_device_id=NULL WHERE iphone_device_id=@0 AND people_id<>@1", DeviceID, m_User.people_id); // I have hard coded this query in this snippet to simplify things db.Execute("UPDATE people SET company_id = 444, name = 'Dad', password = '<pass>', temp_password = NULL, reset_password_hash = NULL, …

2
InnoDB เก็บข้อมูลธุรกรรมไว้ก่อนที่จะส่งมอบที่ไหน
ฉันได้ทำการทดสอบบางอย่างโดยใช้READ_COMMITTEDและREAD_UNCOMMITTEDที่บ้านโดยใช้เทคโนโลยี JDBC ฉันเห็นว่าREAD_UNCOMMITTEDจริง ๆ แล้วสามารถอ่านข้อมูลที่ไม่มีข้อผูกมัดเช่นข้อมูลจากธุรกรรมบางรายการที่ยังไม่ได้รับการยืนยัน คำถาม ข้อมูลที่ไม่ได้รับการจัดเก็บอยู่ที่ไหนเช่นการREAD_UNCOMMITTEDทำธุรกรรมสามารถอ่านข้อมูลที่ปราศจากข้อผูกมัดจากการทำธุรกรรมอื่นได้หรือไม่ เหตุใดจึงเป็นไปไม่ได้ที่การREAD_COMMITTEDทำธุรกรรมในการอ่านข้อมูลที่ไม่มีข้อผูกมัดนั่นคือการ "อ่านสกปรก" กลไกอะไรบังคับใช้ข้อ จำกัด นี้

2
ความสัมพันธ์แบบหนึ่งต่อหนึ่งเป็นมาตรฐานหรือไม่
พิจารณาว่าเรามีชุดข้อมูลสถิติขนาดใหญ่สำหรับบันทึก เช่น 20-30 INTคอลัมน์ มันจะดีกว่าหรือไม่ที่จะเก็บทั้งชุดไว้ในตารางเดียวเนื่องจากทั้งหมดนั้นเป็นของระเบียนหรือสร้างตารางอื่นที่เชื่อมโยงกับความสัมพันธ์แบบหนึ่งต่อหนึ่ง ข้อได้เปรียบของอดีตคือการหลีกเลี่ยงJOINและเข้าถึงข้อมูลสถิติทั้งหมดสำหรับบันทึกที่เกี่ยวข้องได้อย่างรวดเร็ว ข้อได้เปรียบของหลังคือการทำให้คอลัมน์เป็นระเบียบ คอลัมน์แรกนั้นเป็นแบบอ่านอย่างละเอียดและแบบที่สองเป็นแบบเขียนมาก แน่นอนฉันคิดว่ามันไม่มีผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพเนื่องจากฉันใช้ InnoDB กับการบล็อกระดับแถว โดยทั่วไปฉันต้องการทราบว่าเป็นประโยชน์หรือไม่ในการแยกชุดข้อมูลที่แตกต่างกันสำหรับบันทึกเดียว?

5
MySQL - วิธีที่เร็วที่สุดในการเปลี่ยนตารางสำหรับ InnoDB
ฉันมีตาราง InnoDB ที่ฉันต้องการแก้ไข ตารางมีแถว ~ 80M และออกจากไม่กี่ดัชนี ฉันต้องการเปลี่ยนชื่อของคอลัมน์ใดคอลัมน์หนึ่งและเพิ่มดัชนีอีกสองสามรายการ วิธีที่เร็วที่สุดที่จะทำคืออะไร (สมมติว่าฉันสามารถประสบแม้กระทั่งการหยุดทำงาน - เซิร์ฟเวอร์เป็นทาสที่ไม่ได้ใช้)? คำว่า "ธรรมดา" alter tableคือทางออกที่เร็วที่สุดหรือไม่? ในเวลานี้สิ่งที่ฉันสนใจคือความเร็ว :)

1
ดูการหยุดชะงักหลายครั้งที่ผ่านมา
ฉันเห็นว่าฉันสามารถดูการหยุดชะงักล่าสุดใน mysql / innodb แต่มีวิธีดูการหยุดชะงักที่ผ่านมาหรือไม่ เรามีปัญหาการหยุดชะงักสองประการประเด็นหนึ่งมีความสำคัญ การหยุดชะงักที่สำคัญน้อยกว่าเกิดขึ้นวันละหลายครั้งดังนั้นจึงกลายเป็นการหยุดชะงัก "ล่าสุด"

2
ROLLBACK ไม่ทำงานหลังจาก INSERT INTO สร้างตารางปลายทางใหม่
ฉันกำลังทำงานกับสคริปต์ PHP ซึ่งนำเข้าไฟล์ CSV ( customers.csv) ลงในตาราง MySQL (customers ) ก่อนที่จะแทรกเนื้อหาของไฟล์ CSV ลงในตาราง mysql ฉันสำรองข้อมูลcustomersตารางดั้งเดิมก่อน ฉันกำลังห่อกระบวนการนำเข้าทั้งหมด (รวมถึงการสำรองข้อมูล) ในธุรกรรม mysql (เพื่อพิจารณากรณีที่ CSV เสียหายที่ไหนสักแห่งที่อยู่ตรงกลางและเพื่อให้แน่ใจว่าการนำเข้านั้นเป็นอะตอม) ปัญหาคือว่าย้อนกลับดูเหมือนจะไม่ทำงานเมื่อฉันเรียกมันว่าหลังจากที่INSERT INTOคำสั่ง: เมื่อตรวจสอบฐานข้อมูลผ่านทาง phpMyAdmin ฉันสามารถดูตารางที่สร้างขึ้นใหม่และแถวภายในมันยังคงอยู่หลังจาก roollback นี่คือบันทึกการทำงาน: [2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] [] [2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] [] [2015-01-19 14:08:28] DEBUG: CREATE TABLE …

2
ค้นหาระยะเวลารวมของแต่ละแถวที่ต่อเนื่องกัน
เวอร์ชั่น MySQL รหัสจะทำงานใน MySQL 5.5 พื้นหลัง ฉันมีโต๊ะอย่างหนึ่งดังต่อไปนี้ CREATE TABLE t ( id INT NOT NULL AUTO_INCREMENT , patient_id INT NOT NULL , bed_id INT NOT NULL , ward_id INT NOT NULL , admitted DATETIME NOT NULL , discharged DATETIME , PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; ตารางนี้เป็นเรื่องเกี่ยวกับผู้ป่วยในโรงพยาบาลและเก็บเตียงที่ผู้ป่วยแต่ละรายใช้เวลาสักพักขณะเข้ารับการรักษาในโรงพยาบาล วอร์ดแต่ละคนอาจมีหลายเตียงและผู้ป่วยแต่ละรายอาจย้ายไปที่เตียงที่แตกต่างกันภายในวอร์ดเดียวกัน …

1
ทำไมการเพิ่มอัตโนมัติถึงกระโดดเกินจำนวนแถวที่แทรกเข้าไป
ฉันรู้สึกยุ่งเหยิงมากจากพฤติกรรมแปลก ๆ นี้ที่ฉันเห็นในauto_incrementค่าที่บันทึกไว้ใน bidID ของตารางการเสนอราคาหลังจากทำการแทรกจำนวนมากโดยใช้ขั้นตอนที่เก็บไว้: INSERT INTO Bids (itemID, buyerID, bidPrice) SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice) FROM Items WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows; ตัวอย่างเช่นหากauto_incrementค่า bidID คือ 101 เมื่อเริ่มต้นและฉันแทรก 100 แถวค่าสิ้นสุดจะกลายเป็น 213 แทนที่จะเป็น 201 อย่างไรก็ตาม BidIDs ของแถวที่แทรกเหล่านั้นจะทำงานตามลำดับสูงสุด 201 มีการตรวจสอบดังต่อไปนี้ …

2
เปลี่ยนเป็น Innodb_flush_log_at_trx_commit แบบไดนามิก
สิ่งนี้เกี่ยวข้องกับคำถามนี้ มันจะช่วยให้ได้ประสิทธิภาพที่ดีขึ้นสำหรับตาราง InnoDB ตามคู่มือ MySQL , innodb_flush_log_at_trx_commitเป็นตัวแปรแบบไดนามิกทั่วโลก ดังนั้นฉันสามารถเปลี่ยนได้โดยใช้คำสั่ง SET GLOBAL และดูเหมือนว่าจะทำงานได้ mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2; Query OK, 0 rows affected mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | 2 | +--------------------------------+-------+ 1 row in set แต่มันไม่ได้เปลี่ยนการตั้งค่า MySQL จริง เมื่อฉันอัปเดตmy.cnfและรีสตาร์ทเซิร์ฟเวอร์ MySQL มันทำงานได้ ดังนั้นฉันไม่สามารถเปลี่ยนตัวแปรโกลบอลในขณะใช้งาน ฉันชอบค่าเริ่มต้นinnodb_flush_log_at_trx_commit=1แต่ฉันต้องการเปลี่ยนเป็น …

4
MySQL InnoDB ล็อคกุญแจหลักในการลบแม้ใน READ COMMITTED
คำนำ แอปพลิเคชันของเราทำงานหลายเธรดที่ดำเนินการDELETEค้นหาแบบขนาน แบบสอบถามมีผลต่อข้อมูลที่แยกได้เช่นไม่ควรมีความเป็นไปได้ที่DELETEเกิดขึ้นพร้อมกันในแถวเดียวกันจากกระทู้แยก อย่างไรก็ตามตามเอกสาร MySQL ใช้ล็อคที่เรียกว่า 'คีย์ต่อไป' สำหรับDELETEงบซึ่งล็อคทั้งคีย์การจับคู่และช่องว่างบางส่วน สิ่งนี้นำไปสู่การล็อกที่ตายแล้วและทางออกเดียวที่เราพบคือใช้READ COMMITTEDระดับการแยก ปัญหา ปัญหาเกิดขึ้นเมื่อรันDELETEคำสั่งที่ซับซ้อนด้วยJOINs ของตารางขนาดใหญ่ ในบางกรณีเรามีตารางที่มีคำเตือนที่มีเพียงสองแถว แต่แบบสอบถามจำเป็นต้องวางคำเตือนทั้งหมดที่อยู่ในเอนทิตี้บางแห่งจากINNER JOINตาราง ed แยกสองตาราง แบบสอบถามมีดังนี้: DELETE pw FROM proc_warnings pw INNER JOIN day_position dp ON dp.transaction_id = pw.transaction_id INNER JOIN ivehicle_days vd ON vd.id = dp.ivehicle_day_id WHERE vd.ivehicle_id=? AND dp.dirty_data=1 เมื่อตาราง day_position มีขนาดใหญ่พอ (ในกรณีทดสอบของฉันมีแถว 1448) ธุรกรรมใด …

3
การรั่วไหลของประสิทธิภาพ INNODB อยู่ที่ไหน
ฉันมีปัญหาแปลก ๆ ซึ่งฉันไม่สามารถแก้ไขได้ ฉันเป็นโปรแกรมเมอร์เว็บมากกว่าผู้ดูแลเซิร์ฟเวอร์ / ฐานข้อมูลดังนั้นฉันหวังว่าจะมีใครบางคนที่นี่ที่สามารถช่วยฉันได้ สถานการณ์ ฉันทำงานในระบบที่จัดการจำนวนมากupdate, insertและdeleteการร้องขอ ด้วยเหตุนี้ฉันจึงเลือก INNODB เป็นเครื่องมือเก็บข้อมูลสำหรับความสามารถในการล็อคแถว เรากำลังอัปเดต 60,000 ระเบียนทุก ๆ 10 นาทีโดยใช้ Gearman เพื่อทำงานของเราบนเซิร์ฟเวอร์ที่แตกต่างกัน รหัสอยู่ใน PHP และเราใช้ Zend Framework ปัญหา SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction เราได้รับข้อผิดพลาดด้านบนเกือบทุก 30 นาทีจากหนึ่งในคนงาน Gearman ของเรา mysql_report MySQL 5.1.63-0+squeeze1 uptime 15 9:52:12 Tue Sep …

1
ประสิทธิภาพของ InnoDB INSERT
สวัสดีฉันกำลังเรียกใช้ Percona Server เวอร์ชันล่าสุด รุ่นเซิร์ฟเวอร์: 5.5.24-55 Percona Server (GPL), Release 26.0 ฉันมีซีพียู 10 กล่องของคุณสมบัติเหล่านี้ processor : 0 vendor_id : AuthenticAMD cpu family : 16 model : 9 model name : AMD Opteron(tm) Processor 6128 stepping : 1 microcode : 0x10000d9 cpu MHz : 800.000 cache size : 512 KB มันมี …

6
ป้องกันการรีเซ็ต auto_increment id ในฐานข้อมูล Innodb หลังจากเซิร์ฟเวอร์รีสตาร์ท
ฉันเพิ่งอ่านว่าเนื่องจาก InnoDB คำนวณค่า AUTO_INCREMENT ใหม่เมื่อเซิร์ฟเวอร์รีสตาร์ตระเบียนใด ๆ ที่อยู่ท้ายสุดของรายการรหัสอาจมีการนำ ID กลับมาใช้ใหม่ ปกติแล้วนี่ไม่ใช่ปัญหาเพราะเมื่อผู้ใช้ลบทุกอย่างที่เกี่ยวข้องกับ ID จะถูกลบออกจากตารางอื่นด้วย แต่ฉันจงใจปล่อยให้โพสต์ฟอรัมของพวกเขากำพร้าติดป้ายว่า "โพสต์โดย = ผู้ใช้ # 123 =" ดังนั้นการสนทนาที่ผ่านมาจะถูกเก็บไว้ เห็นได้ชัดว่าควรใช้ ID ซ้ำนี่จะเป็นปัญหา ฉันไม่เคยมีปัญหานี้มาก่อนเพราะมีผู้ใช้ใหม่เพียงพอที่จะทำให้ ID ไม่สามารถนำมาใช้ซ้ำได้ด้วยวิธีนี้ อย่างไรก็ตามในการสมัครสมาชิกโครงการใหม่ของฉันนั้นหายากและการลบผู้ใช้ที่ไม่ได้ใช้งานบ่อย (โดยเฉพาะอย่างยิ่งเนื่องจากบัญชี "Open Alpha" ใช้งานได้ล่าสุดเป็นเวลาสามวันในการแสดงตัวอย่าง) และการใช้ ID ดังกล่าวได้เกิดขึ้นสามครั้งในขณะนี้ ฉันได้ "แก้ไข" ปัญหาด้วยการบันทึกค่าที่ถูกต้องสำหรับ AUTO_INCREMENT ที่อื่นและใช้สิ่งนั้นแทนการพึ่งพาค่าภายใน มีวิธีการที่แท้จริงที่จะให้ InnoDB จดจำค่าสุดท้ายจริงหรือไม่
11 mysql  innodb 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.