ฉันมีตารางง่าย ๆ ที่มีล้านเรคคอร์ด (14,000,000) และสำหรับเคียวรี่ธรรมดา ๆ มันใช้เวลามากเกินไปในการ "ส่งข้อมูล"
โต๊ะ
CREATE TABLE IF NOT EXISTS details (
id int(11) NOT NULL,
date date NOT NULL,
time int(2) NOT NULL,
minutes_online decimal(5,0) NOT NULL,
minutes_playing decimal(5,0) NOT NULL,
minutes_chatting decimal(5,0) NOT NULL,
minutes_away decimal(5,0) NOT NULL
PRIMARY KEY (id,date,time)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
แบบสอบถามง่ายๆ
mysql> SELECT * FROM details WHERE id = 3014595;
อธิบาย
mysql> EXPLAIN SELECT * FROM details WHERE id = 3014595;
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | details | ref | PRIMARY | PRIMARY | 4 | const | 1482 | |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
โปรไฟล์สำหรับแบบสอบถาม
mysql> SHOW PROFILE FOR QUERY 1;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000024 |
| checking query cache for query | 0.000078 |
| checking permissions | 0.000014 |
| Opening tables | 0.000126 |
| System lock | 0.000011 |
| Table lock | 0.000030 |
| init | 0.000027 |
| optimizing | 0.000117 |
| statistics | 0.040077 |
| preparing | 0.000029 |
| executing | 0.000006 |
| Sending data | 7.536960 |
| end | 0.000013 |
| query end | 0.000004 |
| freeing items | 0.000037 |
| storing result in query cache | 0.000006 |
| logging slow query | 0.000003 |
| cleaning up | 0.000006 |
+--------------------------------+----------+
อย่างที่คุณเห็นSELECT
คำสั่งนั้นใช้ดัชนีและอ่านเพียงแถว 1482 เท่านั้น กระนั้นคิวรีใช้เวลา 7.536960 วินาทีในการส่งข้อมูล มันเป็นเหมือนแบบสอบถามที่อ่านมากขึ้นแถวที่จำเป็น
มันเป็นแบบสอบถามง่ายๆมีเพียง 7 ฟิลด์ (แถวเฉลี่ย 59 ไบต์) และไม่มีฟังก์ชั่นแฟนซี มีความคิดอะไรที่ทำให้เกิดสิ่งนี้
หมายเหตุ: id คือ ID ผู้ใช้ ผู้ใช้แต่ละคนอาจมีรายการอย่างน้อยหนึ่งรายการสำหรับทุก ๆ ชั่วโมงของทุกวัน ดังนั้น id จึงไม่ซ้ำกัน
แก้ไข:ฉันมีตารางอื่นที่มีโครงสร้างเดียวกันและอีกแถว (34 ล้าน) ถ้าฉันเรียกใช้แบบสอบถามเดียวกันในตารางที่มีขนาดใหญ่กว่านี้มันจะส่งคืนผลลัพธ์ในเวลาน้อยกว่า 1 วินาที
ข้อแตกต่างเพียงอย่างเดียวคือตารางที่ใหญ่กว่าจะไม่ได้รับข้อความค้นหามากเท่ากับตารางที่เล็กกว่า
- เป็นไปได้หรือไม่ที่จำนวนการสืบค้นทำให้กระบวนการช้าลง? แคช MySQL เปิดอยู่ ฉันยัง CakePHP แคชแบบสอบถามเพื่อลดจำนวนการค้นหา
- เป็นไปได้หรือไม่ว่าไฟล์ที่บันทึกตารางเสียหายหรือบางอย่าง
อัปเดต ปัญหาได้รับการแก้ไขโดยแยกชั้นข้อมูลออกจากชั้นเว็บ ชั้นข้อมูลยังได้รับการอัพเกรดบน RAM และทำงานบน raid10
1591 rows in set (16.48 sec)
ฉันเรียกใช้แบบสอบถามอีกครั้งนี่คือเหตุผลว่าทำไมช่วงเวลาจึงแตกต่างกัน ตอนนี้ใช้เวลา 16 วินาที (!!)
SELECT
กลับมา?