MySQL ช้ามากในการสืบค้น SELECT ที่ง่ายมาก


10

เรามีเว็บแอพพลิเคชั่นที่ทำงานบนเครื่องเสมือนที่บันทึกข้อมูลในฐานข้อมูล MySQL 5.5 ด้วยเอ็นจิ้น InnoDB ทุกอย่างทำงานได้ดีประมาณสามปี แต่ทันใดนั้นมันก็ช้ามาก

ตัวอย่างเช่นฉันมีที่อยู่การถือครองตารางที่ง่ายมาก:

CREATE TABLE `addresses` (
  `address_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) CHARACTER SET latin1 NOT NULL,
  `firstname` varchar(64) CHARACTER SET latin1 NOT NULL,
  `street` varchar(64) CHARACTER SET latin1 NOT NULL,
  `housenumber` varchar(16) CHARACTER SET latin1 NOT NULL,
  `zip` varchar(5) CHARACTER SET latin1 NOT NULL,
  `city` varchar(64) CHARACTER SET latin1 NOT NULL,
  `email` varchar(64) CHARACTER SET latin1 NOT NULL,
  `phone` varchar(16) CHARACTER SET latin1 NOT NULL,
  `birthdate` date NOT NULL,
  PRIMARY KEY (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

ตารางนี้มีประมาณ 800 รายการซึ่งไม่มากนัก แต่เรียกใช้แบบสอบถาม

SELECT * FROM addresses

สำหรับวัตถุประสงค์ในการทดสอบดูเหมือนว่าจะไม่จบ ฉันตรวจสอบเรื่องนี้ด้วย mysql CLI บนเซิร์ฟเวอร์เอง: มันแสดงผลบางแถวของตารางแล้วรอนานมากจนกระทั่งมันแสดงผลแถวถัดไป

ดังนั้นอาจเป็นปัญหาในขั้นตอนการส่งข้อมูล แต่ฉันไม่แน่ใจ

VM มี RAM 2GB และมีการใช้งานเพียง 320MB ซีพียูยังทำงานที่ต่ำมาก 1 ถึง 2% mytop จะไม่แสดงข้อความค้นหาอื่น ๆ ที่บล็อกเซิร์ฟเวอร์ ผู้ดูแลระบบไอทีกล่าวว่าพวกเขาไม่ได้เปลี่ยนแปลงอะไรที่ด้านฮาร์ดแวร์

ฉันได้ลองแล้วบางอย่างเช่นการรีสตาร์ทเซิร์ฟเวอร์ฐานข้อมูลรีสตาร์ทเครื่องเสมือน ไม่มีอะไรช่วย

แก้ไข:

EXPLAIN SELECT * FROM addresses

ให้ผลลัพธ์นี้กับฉัน:

+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | addresses | ALL  | NULL          | NULL | NULL    | NULL |  793 |       |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

กล่องเสมือน Xen หรืออย่างอื่น? มีการตั้งค่าดิสก์โฮสต์อย่างไร มี VM อื่น ๆ ในกล่องเดียวกันที่ทำงานช้าด้วยหรือไม่ การตอบคำถามเหล่านั้นอาจเปิดเผยคำตอบ
Matt

ฉันไม่ใช่เจ้าของไฮเปอร์ไวเซอร์ดังนั้นฉันจึงไม่สามารถตอบคำถามนี้ได้ ฉันถามผู้ดูแลระบบของไฮเปอร์ไวเซอร์แล้วว่าพวกเขารู้การเปลี่ยนแปลงล่าสุดหรือไม่ แต่เขาตอบว่าไม่
tabb

หากทำได้ให้ปิด mysql และเรียกใช้เกณฑ์มาตรฐานของดิสก์และหน่วยความจำ ไม่ต้องยุ่งยาก ความคิดคือการแยกว่าเป็นปัญหากับ mysql หรืออาจเป็นปัญหาดัชนีตามที่ระบุไว้ในคำตอบด้านล่างหรือแพร่หลายมากขึ้น
แมตต์

จุดดีฉันพบว่ามันอาจไม่ใช่ปัญหา mysql การรันmysql -u username -ppassword mydb -e 'SELECT * FROM addressesกำลังเอาต์พุตช้า แต่การต่อท้าย `> test.txt` มันทำงานเร็วมาก ตอนนี้อาจเป็นคำถามที่แตกต่างกัน! ฉันจะตรวจสอบเรื่องนี้ได้อย่างไร
tabb

ติดต่อเจ้าของ hypervisor และขอให้พวกเขาตรวจสอบบันทึกข้อผิดพลาดใด ๆ ข้อผิดพลาดของดิสก์โดยเฉพาะ บอกอาการของคุณให้เขาฟัง การสำรองข้อมูลในขณะนี้.
แมตต์

คำตอบ:


13

หากโหลด cpu ต่ำแสดงว่าไม่มีปัญหากับดัชนีที่หายไปหากเป็นกรณีนี้แบบสอบถามจะต้องใช้ cpu และการเข้าถึงดิสก์มากขึ้น นอกจากนี้คุณบอกว่ามันทำงานได้ดีเป็นเวลา 3 ปี

คุณตรวจสอบความเร็วการเข้าถึงดิสก์ทั่วไป (โดยเฉพาะบนพาร์ติชันที่มีฐานข้อมูลอยู่) เช่นใช้เหมือนที่นี่dd สิ่งที่คุณกำลังอธิบายเสียงเหมือนดิสก์ที่ตายแล้วหรือการโจมตีแบบครึ่งตาย มีการสำรองข้อมูลฉันหวังว่า?


นั่นเป็นจุดที่ดี อาจเป็นสิ่งที่ง่ายเหมือนข้อผิดพลาดของดิสก์ในโฮสต์
แมตต์

9

คุณสามารถลองสองสิ่ง

  1. คุณมีการตั้งค่าดัชนีหรือไม่

การจัดทำดัชนีทำให้สามารถค้นหาระเบียนได้อย่างรวดเร็วโดยไม่ต้องทำการสแกนเต็มตารางก่อนตัดเวลาดำเนินการอย่างมาก

CREATE INDEX idx_name ON addresses(name);
  1. ก่อนเรียกใช้แบบสอบถามให้ใช้คำสำคัญอธิบายก่อน

เมื่อใช้หน้าคิวรี SELECT แล้วมันจะอธิบายว่า MySQL ตั้งใจจะใช้คิวรีอย่างไรและจำนวนแถวที่จะต้องประมวลผลก่อนที่จะเสร็จสิ้น

  1. ทำการเปลี่ยนแปลงกับ mysql.ini ของคุณหาก VM เพิ่ม RAM และกำหนดค่า mysql.ini ของคุณเพื่อดูว่าประสิทธิภาพเพิ่มขึ้นหรือไม่

มีตัวเพิ่มประสิทธิภาพ MySQL จำนวนมากที่สามารถแนะนำคุณได้

ช่วยด้วย


โอเค แต่การสร้างดัชนีบนตารางที่ค่อนข้างเล็ก (<800 แถว) ดูเหมือนจะไม่เป็นประโยชน์อย่างที่ฉันต้องการ ใช้เวลาประมาณหนึ่งนาทีจึงจะเสร็จสิ้นแบบสอบถามที่ยกมาข้างต้น การสแกนเต็มตารางของตารางเล็ก ๆ เช่นนี้ไม่ควรใช้เวลานาน
tabb

ดังนั้น ... คุณเพิ่มดัชนีหรือไม่ หากคุณไม่แน่ใจว่าปัญหาคืออะไรฉันจะเริ่มขั้นพื้นฐานและหาทางลง การเพิ่มดัชนีจะเพิ่มประสิทธิภาพก็ต่อเมื่อทำอย่างถูกต้องเท่านั้น
แอนโธนี Fornito

ใช่ฉันเพิ่มดัชนีในคอลัมน์ชื่อ แต่แบบสอบถามข้างต้นของฉันไม่ได้มีข้อ จำกัด WHERE ดังนั้นมันจะต้องอ่านทั้งตารางและพิมพ์ออกมา เพิ่มดัชนีไม่ได้ช่วย
tabb

ฉันเพิ่มผลลัพธ์ของแบบสอบถามอธิบายด้านบน สิ่งนี้ดูดีสำหรับฉัน แต่ประสิทธิภาพยังต่ำมาก ฉันไม่สามารถเพิ่ม RAM ได้เนื่องจากฉันไม่ใช่ผู้ดูแลระบบของผู้จัดการการจำลองเสมือน แต่htopแสดงว่ามีการใช้งาน RAM เพียง 307MB จาก 2050MB เท่านั้น
tabb

เกี่ยวกับดัชนีที่คุณต้องคิดเกี่ยวกับคอลัมน์ที่จะจัดทำดัชนีคุณไม่ต้องการเพียงทำดัชนีทุกอย่างทำดัชนีที่มีจำนวนมากที่สุดฉันกำลังตั้งสมมุติฐานบางอย่างเกี่ยวกับสิ่งนี้ แต่ฉันจะเริ่มต้นด้วย name'ชื่อจริง' ประการที่สองคุณแน่ใจหรือไม่ว่าคุณทำดัชนีถูกต้อง possible_keys: NULL หากคอลัมน์เป็น NULL แสดงว่าไม่พบดัชนีที่เกี่ยวข้อง
Anthony Fornito
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.