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

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

2
สาเหตุของการสืบค้นที่ช้าเป็นครั้งคราว?
เรากำลังใช้งาน MySQL 5.1 บน Windows Server 2008 R2 เราทำการวิเคราะห์บางอย่างในฐานข้อมูลของเราล่าช้าและพบสิ่งรบกวนที่เราไม่สามารถอธิบายได้ เราเพิ่มรหัสเพื่อเข้าสู่ระบบเมื่อเรามีการสืบค้นที่ใช้เวลานาน (> 2000ms) ผลลัพธ์น่าประหลาดใจ (และอาจเป็นคำอธิบายสำหรับการหยุดชะงักของเรา) แบบสอบถามเป็นครั้งคราวซึ่งโดยปกติจะใช้เวลาน้อยมาก (<10ms) ใช้เวลาตั้งแต่ 4 ถึง 13 วินาที เพื่อความชัดเจนนี่คือข้อความค้นหาที่ทำงานอย่างต่อเนื่อง (หลาย ๆ ครั้งต่อวินาที) และไม่ได้รับผลกระทบจากเวลาในการค้นหาเหล่านี้ เราผ่านดัชนีของเราเพื่อค้นหาข้อผิดพลาดที่ชัดเจนและไม่มีโชคมาก ปรับปรุง ตารางผู้คน: | people | CREATE TABLE `people` ( `people_id` bigint(20) NOT NULL AUTO_INCREMENT, `company_id` bigint(20) NOT NULL, `name` varchar(255) DEFAULT NULL, `password` …

2
ปัญหาในการถอดรหัสการหยุดชะงักในบันทึกสถานะของ Innodb
เรากำลังเข้าถึง MySQL จากตัวเชื่อมต่อ Microsoft ADO.NET บางครั้งเราเห็นการหยุดชะงักต่อไปนี้ในสถานะ Innodb ของเราและไม่สามารถระบุสาเหตุของปัญหาได้ ดูเหมือนว่าธุรกรรม (2) กำลังรอและถือล็อกเดียวกันอยู่หรือไม่ ------------------------ LATEST DETECTED DEADLOCK ------------------------ 110606 5:35:09 *** (1) TRANSACTION: TRANSACTION 0 45321452, ACTIVE 0 sec, OS thread id 3804 starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 368, 1 …

3
วิธีการใช้งบเตรียมไว้ใน MySQL เก็บขั้นตอน?
ฉันกำลังใช้ mysql และฉันจำเป็นต้องใช้คอลัมน์ curid ที่ส่งคืนโดยคำสั่งที่เตรียมไว้ในแบบสอบถามภายหลัง ฉันใช้คำสั่งที่เตรียมไว้เพราะเมื่อฉันอ่านมันเป็นวิธีเดียวที่จะส่งผ่านตัวแปรไปยังส่วนคำสั่ง LIMIT ฉันมีขั้นตอนการจัดเก็บที่นี่: DROP PROCEDURE IF EXISTS fixbalance; CREATE PROCEDURE fixbalance (userid INT) BEGIN DECLARE i INT DEFAULT 0; DECLARE balance INT DEFAULT 0; DECLARE idcnt INT; SET idcnt = (SELECT COALESCE(COUNT(id), 0) FROM coupon_operations WHERE user_id = userid); IF idcnt <> 0 THEN WHILE …

3
ปัญหากับแบบสอบถามย่อย MySQL
ทำไมแบบสอบถามนี้ DELETE FROM test WHERE id = ( SELECT id FROM (SELECT * FROM test) temp ORDER BY RAND() LIMIT 1 ); บางครั้งลบ 1 แถวบางครั้ง 2 แถวและบางครั้งไม่มีอะไร ถ้าฉันเขียนมันในรูปแบบนี้: SET @var = ( SELECT id FROM (SELECT * FROM test) temp ORDER BY RAND() LIMIT 1 ); DELETE FROM test WHERE …
16 mysql 

3
เหตุใดการนำเข้าไฟล์. 12 GB .sql ใช้เวลานานกว่า 36 ชั่วโมง
ฉันรอแล้ว 36 ชั่วโมงเพื่อนำเข้าไฟล์. sql ขนาด 12 GB ด้วยtype site.sql | mysqlคำสั่งง่ายๆ ฉันสามารถเห็นการibdata1เติบโตยังคงอยู่ในขณะนี้เกือบ 40 GB เมื่อพิจารณาถึงทริกเกอร์และขั้นตอนการจัดเก็บอยู่ที่ส่วนท้ายของ. sql ฉันคิดว่า MySQL ควรเพิ่มข้อมูลและดัชนีสำคัญ site.sql ถูกสร้างโดยใช้คำสั่งนี้จากเซิร์ฟเวอร์อื่น: mysqldump -R -e --databases site --add-drop-database --add-create-database --add-drop-table -C --single-transaction --triggers ใช้เวลานานเท่าไหร่
16 mysql  mysql-5  mariadb 

5
เหตุใดเธรด MySQL จึงแสดงสถานะ“ การเพิ่มรายการ” บ่อยครั้งเมื่อปิดคิวการสืบค้น
เมื่อฉันรันSHOW PROCESSLISTมักจะมีเธรด INSERT / UPDATE จำนวนมากในสถานะ "การปล่อยไอเท็ม" คู่มือ MySQL แสดงให้เห็นว่าอย่างน้อยส่วนหนึ่งของเหตุผลสำหรับเธรดที่อยู่ในสถานะนี้เกี่ยวข้องกับแคชคิวรี - ซึ่งสันนิษฐานว่ามันจะทำให้คิวรีแคชใช้งานไม่ได้เนื่องจากข้อมูลที่เปลี่ยนแปลง อย่างไรก็ตามฉันquery_cache_sizeถูกตั้งค่าเป็น 0 ซึ่งควรปิดการใช้งานแคชแบบสอบถามทั้งหมด มีเหตุผลอื่นอีกไหมที่จะมีเธรดจำนวนมากในสถานะนี้ ตารางที่เกี่ยวข้องใช้เอ็นจิ้นการจัดเก็บข้อมูล InnoDB
16 mysql  innodb 

1
มีทางเลือก "สร้างหรือแทนที่ขั้นตอน" ใน MySQL หรือไม่
มีรุ่น "สร้างหรือแทนที่โพรซีเดอร์" สำหรับ MySQL หรือไม่ ฉันไม่สามารถทำเช่นนี้หรือสคริปต์การวางขั้นตอนหากมีอยู่ก่อนที่จะคอมไพล์ใหม่โดยไม่ได้รับข้อความแสดงข้อผิดพลาดว่ามีขั้นตอนการจัดเก็บอยู่ DELIMITER $$ -- would love to be able to drop procedure if exists db.sp_tmp_90days; -- or use "create or replace" create procedure db.sp_tmp_90days() BEGIN drop table db.tmp_90days; create table db.tmp_90days ( user_name varchar(128), first_name varchar(50), last_name varchar(50), system varchar(10), last_login datetime ); alter table …

2
ค่าคอลัมน์ที่ว่างเปล่าใช้พื้นที่เก็บข้อมูลเดียวกันกับค่าคอลัมน์ที่เต็มไปหรือไม่?
ฉันมีตารางที่มี 2 คอลัมน์ varchar(38)ประเภทของคอลัมน์ทั้งมีการตั้งค่า ถ้าฉันสร้างแถวที่มีค่าว่างสำหรับคอลัมน์ใดคอลัมน์หนึ่งจะใช้พื้นที่เก็บข้อมูลเดียวกันหรือไม่ถ้าค่านั้นไม่ว่างเปล่า? กล่าวอีกนัยหนึ่ง MySQL จะจองพื้นที่เก็บข้อมูลสำหรับคอลัมน์ (ขึ้นอยู่กับประเภท) เมื่อสร้างแถวหรือไม่


3
ประโยชน์ของการใช้บูลีนมากกว่า TINYINT (1) คืออะไร
จากคู่มือ MySQL บอกว่า: บูลบูลลีน ประเภทเหล่านี้เป็นคำพ้องความหมายสำหรับ TINYINT (1) ค่าศูนย์ถือเป็นเท็จ ค่าที่ไม่ใช่ศูนย์ถือว่าเป็นจริง: ฉันสร้างคอลัมน์บูลีนด้วย0เป็นค่าเริ่มต้น 2แล้วฉันจะปรับปรุงค่าไป ฉันคาดหวังว่า MySQL จะยอมรับอย่างใดอย่างหนึ่ง0หรือ1เพราะมันเป็นบูลีน อย่างไรก็ตาม MySQL ไม่ได้มีข้อผิดพลาดหรือป้องกันไม่ให้ฉันทำการอัปเดต หากบูลีนทำงานเหมือนกับ TINYINT (1) ทุกอย่างจะสร้างความแตกต่างไม่ว่าฉันจะใช้ TINYINT (1) หรือบูลีนหรือไม่?
16 mysql  datatypes 

2
MySQL - ความแตกต่างระหว่างการใช้ count (*) และ information_schema.tables สำหรับการนับแถว
ฉันต้องการวิธีที่รวดเร็วในการนับจำนวนแถวในตารางของฉันที่มีหลายล้านแถว ฉันพบโพสต์ " MySQL: วิธีที่เร็วที่สุดในการนับจำนวนแถว " ใน Stack Overflow ซึ่งดูเหมือนว่าจะช่วยแก้ปัญหาของฉันได้ Bayuahให้คำตอบนี้: SELECT table_rows "Rows Count" FROM information_schema.tables WHERE table_name="Table_Name" AND table_schema="Database_Name"; ซึ่งฉันชอบเพราะมันดูเหมือนการค้นหาแทนที่จะสแกนดังนั้นมันควรจะเร็ว แต่ฉันตัดสินใจทดสอบกับมัน SELECT COUNT(*) FROM table เพื่อดูว่ามีความแตกต่างด้านประสิทธิภาพมากน้อยเพียงใด น่าเสียดายที่ฉันได้รับคำตอบต่าง ๆดังที่แสดงด้านล่าง: คำถาม ทำไมคำตอบต่างกันประมาณ 2 ล้านแถว? ฉันเดาว่าการค้นหาที่ดำเนินการสแกนเต็มตารางนั้นเป็นจำนวนที่แม่นยำกว่า แต่มีวิธีที่ฉันสามารถรับหมายเลขที่ถูกต้องได้โดยไม่ต้องเรียกใช้แบบสอบถามที่ช้านี้หรือไม่ ฉันวิ่งANALYZE TABLE data_302ซึ่งเสร็จสมบูรณ์ภายใน 0.05 วินาที เมื่อฉันเรียกใช้แบบสอบถามอีกครั้งตอนนี้ฉันได้รับผลลัพธ์ที่ใกล้เคียงกับ 34384599 แถว แต่ก็ยังไม่เหมือนกันselect count(*)กับ 34906061 แถว วิเคราะห์ตารางที่ส่งคืนทันทีและดำเนินการในพื้นหลังหรือไม่ ฉันรู้สึกว่ามันคุ้มค่าที่จะกล่าวถึงนี่คือฐานข้อมูลทดสอบและไม่ได้ถูกเขียนถึงในขณะนี้ …
16 mysql  mysql-5.6  count 

2
วิธีที่ดีที่สุดในการออกแบบฐานข้อมูลและตารางเพื่อเก็บบันทึกการเปลี่ยนแปลง?
ฉันต้องตั้งค่าคุณลักษณะประวัติในโครงการเพื่อติดตามการเปลี่ยนแปลงก่อนหน้านี้ สมมติว่าฉันมีสองตารางตอนนี้: NOTES TABLE (id, userid, submissionid, message) SUBMISSIONS TABLE (id, name, userid, filepath) ตัวอย่าง:ฉันมีแถวในบันทึกย่อและผู้ใช้ต้องการเปลี่ยนข้อความ ฉันต้องการติดตามสถานะก่อนการเปลี่ยนแปลงและหลังการเปลี่ยนแปลง อะไรจะเป็นวิธีที่ดีที่สุดในการตั้งค่าคอลัมน์ในแต่ละตารางเหล่านี้ซึ่งจะบอกว่ารายการนั้นเป็นรายการ "เก่า" 0 ถ้าใช้งานอยู่หรือ 1 ถ้าถูกลบ / มองไม่เห็น ฉันยังต้องการสร้างAUDIT TRAILตารางhistory ( ) ซึ่งเก็บidสถานะก่อนหน้าidของสถานะใหม่ซึ่งตารางนี้ id เหล่านั้นเกี่ยวข้องกับอะไร

2
สำรอง / กู้คืนผู้ใช้ / รหัสผ่าน / สิทธิ์
ฉันย้ายจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งและฉันต้องการสำรองฐานข้อมูลทั้งหมด + ผู้ใช้ / สิทธิ์ / รหัสผ่านจากเซิร์ฟเวอร์ MySQL ของฉัน ฉันพบว่าการสำรองฐานข้อมูลโดยใช้mysqldumpแต่ฉันไม่สามารถหาวิธีการสำรองข้อมูลผู้ใช้ทั้งหมดและสิทธิ์ที่กำหนด มีวิธีในการบรรลุผลนี้หรือฉันต้องตั้งค่านี้ใหม่บนเซิร์ฟเวอร์ใหม่หรือไม่?

2
เข้าร่วมการสืบค้นใช้เวลา 11 นาทีเพื่อเรียกใช้บนตาราง 300,000 แถว
แบบสอบถามด้านล่างใช้เวลาในการดำเนินการมากกว่า 11 นาที SELECT `c`.*, `e`.`name` AS `employee_name`, `e`.`emp_no`, `d`.`code` AS `department_code`, IF(ew.code IS NOT NULL, ew.code, egw.code) AS shift_code, IF(ew.code IS NOT NULL, ew.time_in_from, egw.time_in_from) AS time_in_from, IF(ew.code IS NOT NULL, ew.time_out_to, egw.time_out_to) AS time_out_to, IF(ew.code IS NOT NULL, ew.next_day, egw.next_day) AS next_day FROM `tms_emp_badge_card` AS `c` LEFT JOIN …


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