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

MySQL ทุกรุ่น (ไม่ใช่ Microsoft SQL Server) โปรดเพิ่มแท็กเฉพาะเวอร์ชันเช่น mysql-5.7 หากเกี่ยวข้องกับคำถาม

2
วิธีการใช้ล็อคในแง่ดีอย่างถูกต้องใน MySQL
หนึ่งจะใช้ล็อคในแง่ดีอย่างถูกต้องใน MySQL ได้อย่างไร ทีมของเราได้อนุมานว่าเราต้องทำ # 4 ด้านล่างมิฉะนั้นอาจมีความเสี่ยงที่เธรดอื่นสามารถอัปเดตบันทึกรุ่นเดียวกัน แต่เราต้องการตรวจสอบว่านี่เป็นวิธีที่ดีที่สุด สร้างเขตข้อมูลเวอร์ชันบนตารางที่คุณต้องการใช้การล็อคในแง่ดีสำหรับคอลัมน์ชื่อ = "รุ่น" เมื่อเลือกตรวจสอบให้แน่ใจว่าได้รวมคอลัมน์รุ่นแล้วจดบันทึกเวอร์ชัน ในการอัปเดตครั้งต่อ ๆ ไปคำสั่งการอัปเดตควรออก "โดยที่ version = X" โดยที่ X คือรุ่นที่เราได้รับใน # 2 และตั้งค่าฟิลด์เวอร์ชันระหว่างคำสั่งการอัปเดตนั้นเป็น X + 1 ดำเนินการSELECT FOR UPDATEเกี่ยวกับบันทึกที่เรากำลังจะอัปเดตเพื่อให้เราเป็นอันดับที่สามารถเปลี่ยนแปลงบันทึกที่เรากำลังพยายามที่จะปรับปรุง เพื่อชี้แจงเราพยายามป้องกันสองเธรดที่เลือกเร็กคอร์ดเดียวกันในหน้าต่างเวลาเดียวกันที่พวกเขาคว้าเร็กคอร์ดเวอร์ชันเดียวกันจากการเขียนทับกันถ้าพวกเขาพยายามและอัพเดตเร็กคอร์ดในเวลาเดียวกัน เราเชื่อว่าหากเราไม่ทำ # 4 มีโอกาสที่ถ้าทั้งสองเธรดป้อนธุรกรรมของตนในเวลาเดียวกัน (แต่ยังไม่ได้ออกการอัปเดต) เมื่อพวกเขาไปอัปเดตเธรดที่สองที่จะใช้ UPDATE ... โดยที่ version = X จะทำงานกับข้อมูลเก่า เราคิดถูกต้องหรือไม่ว่าเราต้องทำการล็อกในแง่ร้ายเมื่อทำการอัพเดตแม้ว่าเราจะใช้ฟิลด์เวอร์ชั่น / การล็อคในแง่ดี
13 mysql  locking 

1
MySQL: ธุรกรรมจะล็อกแถวหรือไม่
ฉันไม่เคยลองใช้ธุรกรรม MySQL มาก่อนฉันแค่ต้องการชี้แจงบางอย่าง หากผู้ใช้สองคนเรียกใช้แบบสอบถามในเวลาที่แน่นอน MySQL จะจัดการเรื่องนี้อย่างไร เช่นผู้ใช้พยายามอัปเดตบันทึก user1: อัปเดตชุดตารางคอลัมน์ = คอลัมน์ - 4 โดยที่ column_id = 1; user2: อัปเดตชุดคอลัมน์ตาราง = คอลัมน์ - 7 โดยที่ column_id = 1; ตอนนี้ถ้าฉันใช้ทรานแซกชัน MySQL จะเลือกแบบสอบถามที่จะถูกดำเนินการก่อนและล็อกผู้ใช้รายที่สองจนกว่าจะมีการสืบค้นครั้งแรก จะเป็นล็อคตารางหรือล็อคแถวหรือไม่? จะเป็นอย่างไรถ้าผู้ใช้รายที่สามออกคำสั่ง select? MySQL จะคืนค่าอะไร? ป.ล. นี้จะอยู่ที่ Innodb

4
ประเภทข้อมูลสำหรับหมายเลขโทรศัพท์: VARCHAR, INT หรือ BIGINT หรือไม่
ดังนั้นนี่จะเป็นคำถามจำลองของปี แต่ฉันต้องถามเนื่องจากไม่ใช่ครั้งแรกที่ฉันผ่านสิ่งนี้ ดูคำจำกัดความของตารางต่อไปนี้: ลองดูที่คอลัมน์from_numberซึ่งเป็นVARCHAR(45)ตอนนี้ แต่มันจะถือหมายเลขโทรศัพท์ เนื่องจากฉันไม่ทราบว่ามีกี่หมายเลขโทรศัพท์ที่สามารถมีได้ทั่วโลกดังนั้นฉันจึงพยายามครอบคลุมเกือบทั้งหมด ฉันต้องการให้สมบูรณ์ของฐานข้อมูลมากที่สุดเท่าที่เป็นไปได้ดังนั้นฉันคิดว่าVARCHARไม่ได้เป็นประเภทที่เหมาะสมสำหรับการถือชนิดของข้อมูลนี้ - บางทีฉันกำลังผิดคุณบอกฉัน - ดังนั้นฉันคิดในการเปลี่ยนแปลงหรือแม้กระทั่งINTBIGINT เมื่อฉันกำหนดคอลัมน์ใน Workbench ฉันควรระบุจำนวนระหว่างวงเล็บ()ไม่ใช่ทุกกรณี แต่ในรายการที่ฉันพูดถึงก่อนหน้านี้ฉันต้องทำ ดังนั้นถ้าฉันทำสิ่งนี้: BIGINT()ฉันได้รับข้อผิดพลาดนี้: ซึ่งให้คำแนะนำฉันไปอ่านเล็กน้อยเกี่ยวกับประเภท MySQL นี้ที่นี่ โดยทั่วไปข้อมูลนี้คือ: จำนวนเต็มขนาดใหญ่ ... ช่วงที่ไม่ได้ลงชื่อคือ 0 ถึง 18446744073709551615 ซึ่งทำให้ฉันถาม: สิ่งที่ฉันควรตั้งค่าสำหรับวงเล็บเมื่อฉันกำหนดBIGINT()ประเภท (ฉันใช้ BIGINT เพราะฉันไม่ทราบว่า INT สามารถถือตัวเลขได้มากเท่าที่โทรศัพท์มี - บางทีฉันก็ผิดด้วย) วิธีใดที่เหมาะสมในการสร้าง | ออกแบบคอลัมน์ในฐานข้อมูล MariaDB / MySQL อย่างไรก็ตามฉันต้องการทราบความคิดเห็นประสบการณ์และแน่นอนฉันต้องการคำตอบ หมายเหตุ:ฉันใช้ MySQL Workbench รุ่นล่าสุดเพื่อสร้างไดอะแกรม ER ฉันใช้ MariaDB …

4
คีย์หลัก 5+ คอลัมน์ไม่ดีสำหรับตารางขนาดใหญ่ (100 ล้าน+) หรือไม่
ฉันกำลังอ่านเกี่ยวกับปัญหา DB ของชีวิตจริงและโครงการหนึ่งมี 100 ล้านแถวรวมตารางที่มีคอลัมน์ 5 คอลัมน์เป็นหลัก ฉันคิดว่านี่เป็นสิ่งที่ไม่ดี แต่ทุกคนสามารถบอกฉันได้ว่าทำไม ตารางนั้นเป็นตารางการรวบรวม / การรวมขนาดเล็กดังนั้น 5 คอลัมน์จึงเป็นเช่น (วัน, market_id, product_id ... ) ตอนแรกฉันคิดว่าคีย์หลัก 5 คอลัมน์ไม่เหมาะ แต่ยิ่งฉันคิดฉันก็ไม่สามารถคิดหาเหตุผลที่ดีได้ นี่เป็นการสนทนาช่วงดึกกับวิศวกรของ บริษัท ครึ่งหนึ่ง มีคนพูดถึงเรื่องนี้ว่าเป็นการออกแบบที่ไม่ดีวิศวกรอาวุโสคนหนึ่งเห็นด้วย แต่ก็ไม่มีใครโดดขึ้นไปเลย ดังนั้นพยายามค้นคว้าเรื่องด้วยตัวเอง!

4
ผลลัพธ์การค้นหาข้อความแบบเต็มในเวลาจำนวนมากใน 'การกำหนดค่าเริ่มต้น FULLTEXT'
ขณะนี้ฉันกำลังพยายามเรียกใช้แบบสอบถามบางอย่างเทียบกับการถ่ายโอนข้อมูลของความคิดเห็นของ Stack Overflow นี่คือลักษณะของสคีมา: CREATE TABLE `socomments` ( `Id` int(11) NOT NULL, `PostId` int(11) NOT NULL, `Score` int(11) DEFAULT NULL, `Text` varchar(600) NOT NULL, `CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `UserId` int(11) NOT NULL, PRIMARY KEY (`Id`), KEY `idx_socomments_PostId` (`PostId`), KEY `CreationDate` (`CreationDate`), FULLTEXT KEY `Text` (`Text`) …

3
วิธีแทรกค่าลงในตารางจากสองตารางที่แตกต่างกันอย่างไร
ฉันมีสามโต๊ะ students table ------------------------------------ id(PK, A_I) | student_name | nationality teachers table ------------------------------------ id(PK, A_I) | teacher_name | email classroom table ---------------------- id(PK, A_I) | date | teacher_id(FK to teachers.id) | student_id(FK to students.id) ถ้าฉันได้รับชื่อครู ( davidตัวอย่าง) และ student_id ( 7ตัวอย่าง) และขอให้ใส่teacher_idลงในclassroomตารางตามidในteachersตารางฉันจะทำ: insert into classroom (date, teacher_id, student_id) select '2014-07-08', …

1
ประโยชน์ของ Barracuda และการบีบอัด
ฉันได้อ่านเกี่ยวกับรูปแบบไฟล์ของ MySQL Antelope และ Barracuda เมื่อไม่นานมานี้และฉันสงสัยว่าฉันจะได้รับประโยชน์จากการมี Barracuda และการบีบอัดข้อมูลหรือไม่ เซิร์ฟเวอร์ของฉันใช้แอนทีโลปอยู่เพราะเป็นค่าเริ่มต้นของ MySQL ฉันมีปัญหากับหน่วยความจำหลายครั้งเนื่องจากฐานข้อมูลขนาดใหญ่ที่ฉันมี ฐานข้อมูลของฉันเพิ่มขึ้นทุกวัน ดูเหมือนว่าการบีบอัดจะให้ประโยชน์กับคนไม่กี่คนเช่น: http://www.mysqlperformanceblog.com/2008/04/23/real-life-use-case-for-barracuda-innodb-file-format/ ฉันเข้าใจว่าหน่วยความจำและพื้นที่ดิสก์สามารถลดลงได้ แต่ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งนี้หรือไม่ (อ้างอิงจากบทความ): "~ 5% โหลด CPU ตามด้านบน (จาก 80-100% ส่วนใหญ่รอ I / O) 0.01 เวลาค้นหาเฉลี่ยวินาทีโดยคีย์หลัก (จาก 1-20 วินาทีก่อนการแปลง) " ฉันคิดว่าสองสิ่งนี้จะไม่ดีขึ้นเพราะถ้าข้อมูลถูกบีบอัดเซิร์ฟเวอร์ต้องคลายการบีบอัดเพื่อรับข้อมูลต้นฉบับอีกครั้งดังนั้นจึงไม่เหมาะสมที่การใช้งาน CPU จะเพิ่มขึ้นใช่ไหม สิ่งนี้มีประโยชน์กับคุณในแอปพลิเคชันแบบอ่าน / เขียนหรือไม่ คุณจะแนะนำให้ฉันเปลี่ยนเป็น Barracuda และการบีบอัดไหม คุณตระหนักถึงปัญหาของ Barracuda หรือไม่? ดูเหมือนว่าคำตอบของคำถามต่อไปนี้จะกล่าวถึงปัญหาบางอย่าง แต่เนื่องจากมาจาก 2011 ฉันจะบอกว่าได้รับการแก้ไขแล้วในตอนนี้: …

3
อินสแตนซ์ MySQL ถ่วงเวลา“ กำลังทำดัชนี SYNC”
ปัญหา อินสแตนซ์ของ MySQL 5.6.20 ที่ทำงานอยู่ (ส่วนใหญ่เป็นเพียง) ฐานข้อมูลที่มีตาราง InnoDB กำลังแสดงแผงลอยเป็นครั้งคราวสำหรับการดำเนินการอัปเดตทั้งหมดเป็นระยะเวลา 1-4 นาทีกับ INSERT, UPDATE และ DELETE ทั้งหมดที่เหลืออยู่ในสถานะ "Query end" เห็นได้ชัดว่าโชคร้ายที่สุด บันทึกการสืบค้นที่ช้าของ MySQL กำลังบันทึกแม้กระทั่งแบบสอบถามที่ไม่สำคัญมากที่สุดด้วยเวลาสอบถามที่ไม่ได้ใช้งานหลายร้อยรายการที่มีการประทับเวลาเดียวกันสอดคล้องกับเวลาที่แผงลอยได้รับการแก้ไข: # Query_time: 101.743589 Lock_time: 0.000437 Rows_sent: 0 Rows_examined: 0 SET timestamp=1409573952; INSERT INTO sessions (redirect_login2, data, hostname, fk_users_primary, fk_users, id_sessions, timestamp) VALUES (NULL, NULL, '192.168.10.151', NULL, 'anonymous', '64ef367018099de4d4183ffa3bc0848a', …

2
วิธีปิดการใช้งานบริการ MySQL เริ่มต้นเมื่อเริ่มต้น Windows7
เมื่อฉันเปิดเดสก์ท็อปของฉัน (Windows 7 SP1) ฉันมักจะพบว่าหน่วยความจำ 2 หรือ 3 GB ถูกใช้งานอยู่ในกระบวนการ MySQL อยู่แล้ว ฉันไม่สนใจว่าต้องใช้หน่วยความจำมากแค่ไหนในฐานข้อมูลถ้าเป็นจริงเรียกใช้แบบสอบถาม แต่ฉันทำถ้าเป็นแอพที่ฉันยังไม่เริ่มเอง สำหรับเรื่องนั้นฉันแทบจะไม่ใช้ MySQL ยกเว้นเมื่อฉันพัฒนาเว็บแอพบางตัวในสภาพแวดล้อมท้องถิ่นของฉัน ดังนั้นจึงเป็นไปได้ที่จะหยุดตะกละนี้ ฉันพยายามลบ MySQL ออกจากกลุ่มเริ่มต้นของฉันผ่านทางmsconfigแต่ไม่พบชื่อของที่นั่น นี่คือข้อมูลเพิ่มเติม mysql Ver 14.14 Distrib 5.6.15, for Win64 (x86_64) MySQL Server 5.6 MySQL Workbench 6.0
12 mysql  windows 

1
สร้างคีย์หลักอัตโนมัติใน CREATE TABLE … AS SELECT
CREATE TABLE ... AS SELECT...ฉันสร้างตารางโดยใช้ความซับซ้อนแบบสอบถามเลือกผ่าน ฉันจะเพิ่มคีย์หลักการสร้างอัตโนมัติในแบบสอบถามนี้ได้อย่างไร ตัวอย่างเช่น: create table `user_mv` select `user`.`firstname` as `firstname`, `user`.`lastname` as `lastname`, `user`.`lang` as `lang`, `user`.`name` as `user_name`, `group`.`name` as `group_name` from `user` inner join `user_groups` on (`user`.`user_id`=`user_groups`.`user_id`) left join `group` on (`group`.`group_id`=`user_groups`.`group_id`) where `user`.`lang`=`group`.`lang` แบบสอบถามนี้จะสร้างตารางที่มีfirstname, lastname, lang, username, group_nameคอลัมน์ ฉันต้องการให้มีidคอลัมน์ที่เป็นคีย์หลักของการสร้างอัตโนมัติ มีวิธีใดในการทำเช่นนี้โดยเปลี่ยนคิวรีนี้ ฉันรู้ว่าฉันสามารถทำได้โดยการเปลี่ยนตารางหลังจากดำเนินการแบบสอบถามนี้ แต่ถ้ามีวิธีใดที่จะทำสิ่งนี้โดยตรงในcreate tableคำสั่งฉันต้องการทราบวิธีการทำเช่นนั้น


3
อัปเดตตารางตามตารางเดียวกัน
ฉันมีตารางมีรายละเอียดสินค้าและรายละเอียดของสินค้าแต่ละคนมีและproduct_id language_idสิ่งที่ฉันต้องการจะทำคือการปรับปรุงเขตข้อมูลทั้งหมดที่มีlanguage_idของ2ให้เท่ากับเดียวกันproduct_idที่เป็นlanguage_id1 จนถึงตอนนี้ฉันได้ลองใช้แบบสอบถามต่อไปนี้ แต่ฉันได้รับข้อผิดพลาดที่ระบุว่า MySQL ไม่ต้องการอัปเดตตารางที่มีการใช้ตารางในแบบสอบถามย่อยด้วย UPDATE products_description AS pd SET pd.products_seo = ( SELECT pd2.products_seo FROM products_description AS pd2 WHERE pd2.language_id = 1 AND pd2.products_id = pd.products_id ) WHERE pd.language_id <> 1 มีวิธี "ง่าย" รอบข้อ จำกัด นี้ใน MySQL? หรือ "ลูกเล่น"? ฉันแปลกใจเล็กน้อยที่แบบสอบถามของฉันไม่ทำงานตามที่คิด
12 mysql  update 

2
เครื่องมือในการส่งออกข้อมูลด้วยข้อมูลเชิงสัมพันธ์ทั้งหมดหรือไม่ [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับผู้ดูแลฐานข้อมูล Exchange Exchange ปิดให้บริการใน5 ปีที่ผ่านมา มีเครื่องมือในการส่งออกข้อมูลจากแถวที่เลือกในตารางที่มีข้อมูลทั้งหมดที่เก็บไว้ในตารางอื่นในตารางอื่น ๆ ที่เชื่อมโยงโดยการออกแบบเชิงสัมพันธ์หรือไม่? วัตถุประสงค์คือเพื่อลดความยุ่งยากในการย้ายข้อมูลบิตระหว่างเซิร์ฟเวอร์สำหรับการย้ายข้อมูลแบบเฉพาะกิจ ฉันกำลังมองหาเครื่องมือสำหรับ MySQL InnoDB โดยเฉพาะกับคีย์ต่างประเทศที่กำหนดไว้

1
ทำไมค่าเริ่มต้น character_set_server คือ latin1
ฉันใช้ MySQL 5.5 และเมื่อฉันแสดงตัวแปรเกี่ยวกับชุดอักขระฉันมี +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ …

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แบตเตอรี่สำรองเราขอแนะนำให้คุณใช้ …

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