• อัปโหลด

ใช้เวลาแค่ 20 บรรทัด แต่กวาดไปถึงหนึ่งล้านบรรทัด? คู่มือฉบับสมบูรณ์สำหรับการปรับแต่งประสิทธิภาพ SQL

3462
0
2026-10-08 19:45:32
169
33
513
19
# แค่ 20 บรรทัด แต่กวาดไปหนึ่งล้านบรรทัด? คู่มือการปรับแต่งประสิทธิภาพ SQL ฉบับสมบูรณ์ ## หนึ่ง, หัวข้อ แค่ 20 บรรทัด แต่กวาดไปหนึ่งล้านบรรทัด? คู่มือการปรับแต่งประสิทธิภาพ SQL ฉบับสมบูรณ์ ทางเลือก: - ส่งคืน 20 บรรทัด สแกนหนึ่งล้านบรรทัด: อธิบายการปรับแต่ง SQL ให้เข้าใจในครั้งเดียว - มีดัชนีแต่ไม่ยอมใช้? อ่าน EXPLAIN ให้เข้าใจก่อนลงมือแก้ - ทำไม Deep Paging อย่าง LIMIT หนึ่งล้าน ถึงยิ่งเปิดยิ่งช้า - เครื่องไม่ได้พัง ดัชนีก็ยังอยู่ ที่ช้าเพราะ SQL คำสั่งนี้ทำงานสูญเปล่ามากเกินไป ## สอง, บทนำ รายการคำสั่งปกติใช้เวลาแปดสิบมิลลิวินาที ผู้ใช้เลื่อนไปหน้าลึกๆ กลับต้องรอนานกว่าสองวินาที ตัวเลขสองตัวในบันทึกการค้นหาช้าไม่ตรงกัน: Rows_sent คือ 20, Rows_examined คือ 1000020— เพื่อให้ได้ 20 บรรทัดนี้ ฐานข้อมูลต้องอ่านหนึ่งล้านบรรทัดแรกขึ้นมาทีละบรรทัดแล้วทิ้งไป เครื่องไม่ได้พัง ดัชนีก็ยังอยู่ ที่ช้าเพราะ SQL คำสั่งนี้ทำให้ฐานข้อมูลทำงานสูญเปล่ามากเกินไป พูดให้ถึงที่สุดแล้ว การปรับแต่ง SQL มีเรื่องเดียว: ทำให้ฐานข้อมูลอ่านน้อยลง เดินทางน้อยลง วิดีโอนี้ทำตามลำดับการตรวจสอบ: หา SQL ช้าก่อน, ใช้ EXPLAIN ดูแผนการทำงาน, จากนั้นแยกแยะประเภทความช้าทั่วไป เช่น ดัชนี, การแบ่งหน้า, การจัดเรียง, การเชื่อมโยง และระดับแอปพลิเคชัน พร้อมวิธีแก้ในแต่ละประเภท ✅ คุณจะเข้าใจ: · บันทึกการค้นหาช้า + pt-query-digest: สิ่งที่ประหยัดเวลาในการปรับแต่งมากที่สุด มักจะเป็นตัวที่ "ครั้งละสองร้อยมิลลิวินาที วันละหนึ่งล้านครั้ง" · เวลาของการค้นหาครั้งหนึ่งหมดไปกับอะไร: เพจ (page), buffer pool, การอ่านแบบต่อเนื่อง vs การอ่านแบบสุ่ม · อ่าน EXPLAIN ให้เข้าใจ: type / key / rows / Extra และดูเวลาจริงด้วย EXPLAIN ANALYZE · B+ Tree, Table Lookup (การกลับไปดึงข้อมูลที่ตาราง) และ Covering Index (ดัชนีครอบคลุม): อย่าเขียน SELECT * ตามใจชอบ · ดัชนีร่วม (Composite Index): Prefix ทางซ้ายสุด, การตัดช่วง; ค่าเท่ากันอยู่หน้า ช่วงอยู่หลัง · 4 รูปแบบที่ทำให้ดัชนีใช้ไม่ได้: ใช้ฟังก์ชันครอบคอลัมน์, แปลงชนิดข้อมูลโดยปริยาย, ค้นหาแบบ Left Fuzzy (ซ้ายหลวม), OR · สวนทางกับสามัญสำนึก: มีดัชนีแต่ตัวเพิ่มประสิทธิภาพกลับเลือก Full Table Scan (สแกนตารางเต็ม)—เมื่อมีการดึงข้อมูลกลับ (Lookup) มากเกินไป การอ่านแบบสุ่มจะมีราคาแพงกว่าการสแกนแบบต่อเนื่อง · Deep Paging: เคอร์เซอร์เพจจิ้ง (Cursor Paging) และ Deferred Join (การเชื่อมโยงแบบล่าช้า), เลิกใช้ LIMIT หนึ่งล้านซะที · filesort / ตารางชั่วคราว: จัดลำดับการเรียงและจัดกลุ่มให้ตรงกับลำดับดัชนี · JOIN และ COUNT: คอลัมน์ที่เชื่อมต้องมีดัชนี; COUNT(*) ของ InnoDB นับสดทีละรายการ · 3 หลุมพรางระดับแอปพลิเคชัน: N+1, การแทรกทีละรายการ, ธุรกรรมยาว (Long Transaction) ⏱ ไทม์ไลน์บท (คลิกเพื่อข้าม) 00:00 อินโทร: แค่ 20 บรรทัด แต่กวาดไปหนึ่งล้านบรรทัด 01:09 ค้นหา SQL ช้าออกมาก่อน 02:29 แทรก: Duoke360 03:15 การค้นหาหนึ่งครั้ง เวลาหมดไปกับอะไร 04:30 ทำความเข้าใจ EXPLAIN 05:51 B+ Tree, Table Lookup และ Covering Index 07:05 ดัชนีร่วม: Prefix ทางซ้ายสุดและการตัดช่วง 08:17 4 รูปแบบที่ทำให้ดัชนีใช้ไม่ได้ 09:37 สวนทางสามัญสำนึก: มีดัชนีแต่ไม่ยอมใช้ 10:53 Deep Paging: LIMIT หนึ่งล้าน 12:12 การเรียงลำดับและการจัดกลุ่ม: filesort และตารางชั่วคราว 13:37 JOIN และ COUNT 15:06 3 หลุมพรางระดับแอปพลิเคชัน 16:29 รายการตรวจสอบและสรุป ความยาววิดีโอประมาณ 17:44 Duoke360: https://duoke360.com/ เหมาะสำหรับ: นักพัฒนาสาย Backend ที่เคยเขียน SQL และเคยโดน SQL ช้าบนระบบจริงเล่นงาน รวมถึงผู้ที่กำลังจะสัมภาษณ์ในหัวข้อดัชนี, EXPLAIN และ Deep Paging ไม่ต้องอ่านซอร์สโค้ด MySQL มาก่อน ขอแค่ดูบันทึกแบบช้า (Slow Log) เป็นก็ติดตามได้ สรุปสั้นๆ ในประโยคเดียว: ทำให้ฐานข้อมูลอ่านน้อยลง เดินทางน้อยลง; ทุกๆ การเปลี่ยนแปลงใช้ตัวเลขจาก EXPLAIN เป็นเครื่องยืนยัน รู้สึกว่ามีประโยชน์ ฝากกดไลค์ กดแชร์ กดติดตามด้วยนะ~ มีคำถามพูดคุยกันได้ที่ช่องคอมเมนต์ ## สาม, แท็ก Tag #การปรับแต่งSQL #MySQL #ค้นหาช้า #EXPLAIN #ดัชนี #B+Tree #DeepPaging #CoveringIndex #ดัชนีร่วม #filesort #พัฒนาเบื้องหลัง #ฐานข้อมูล #สัมภาษณ์ #คู่มือเขียนโปรแกรม #InnoDB #pt-query-digest --- ## สี่, คำสำคัญ การปรับแต่ง SQL, ประสิทธิภาพ MySQL, ค้นหาช้า, slow_query_log, pt-query-digest, EXPLAIN, EXPLAIN ANALYZE, type ALL, Using filesort, Using temporary, B+ Tree, คลัสเตอร์อินเด็กซ์, Table Lookup, Covering Index, Using index, ดัชนีร่วม, Prefix ทางซ้ายสุด, การตัดช่วง, Index Condition Pushdown, ดัชนีใช้งานไม่ได้, แปลงชนิดข้อมูลโดยปริยาย, ค้นหาแบบ Left Fuzzy LIKE, FORCE INDEX, ANALYZE TABLE, Deep Paging, LIMIT OFFSET, เคอร์เซอร์เพจจิ้ง, Deferred Join, filesort, sort_buffer, ตารางชั่วคราว, GROUP BY, JOIN, Nested Loop, Hash Join, COUNT(*), N+1, ธุรกรรมยาว, InnoDB buffer pool
编程其实很简单,只要方法对了。我的个人博客duoke360.com
WebSocket กับ HTTP จริงๆ แล้วเกี่ยวกันยังไง? อธิบายครบทั้งแฮนด์เชก เฟรม มาสก์ และฮาร์ตบีต
09:17
ทำไม gRPC ถึงเร็วกว่า HTTP+JSON? อธิบายครบถ้วนทั้ง Protobuf, HTTP2 และสตรีมทั้ง 4 แบบ
10:02
ทำไม HTTP3 ถึงทอดทิ้ง TCP? อธิบายเรื่อง Head-of-Line Blocking, 0-RTT และ Connection Migration ของ QUIC แบบละเอียดยิบ
09:49
JSON, Protobuf, Avro, Thrift ต่างกันอย่างไร? อธิบายเรื่อง Varint, ZigZag และหมายเลขฟิลด์ให้เข้าใจในครั้งเดียว
10:54
ทำไม GraphQL ถึงโค่น REST ได้? ขอข้อมูลแค่ครั้งเดียวก็ได้ข้อมูลที่ต้องการพอดี
11:24
ทำไม IoT ถึงไม่ใช้ HTTP? กวดวิชา MQTT ฉบับสมบูรณ์
13:21
การออกแบบสถาปัตยกรรมซอฟต์แวร์ - การออกแบบกลไกมิดเดิลแวร์ - จำกัดอัตราแล้วยังโดนถล่มอีกเหรอ? อธิบายลำดับมิดเดิลแวร์ การลัดวงจร และบริบทอย่างละเอียด
10:40
เขียนฟังก์ชันได้ แบกรับระบบไหวไหม? บทเรียนแรกของสถาปัตยกรรมซอฟต์แวร์
10:11
สถาปัตยกรรมซอฟต์แวร์ · การออกแบบศูนย์กำหนดค่า - ศูนย์กำหนดค่าล่ม บริการยังจะสตาร์ทได้ไหม? อธิบายครบถ้วนทั้ง 4 ควอแดรนท์, Long Polling และ Gray Release
12:35
OAuth 2.0 ไม่ใช่โปรโตคอลการยืนยันตัวตน: สิ่งที่ตอบคำถามว่า 'คุณคือใคร' จริงๆ คือ OIDC
14:19
JWT สามารถแทนที่ Session ได้จริงหรือ? ความจริงของการเข้าสู่ระบบแบบไร้สถานะ (Stateless)
15:09
วินาทีที่คุณกด Enter DNS ค้นหาไปกี่ครั้ง?
12:14
รูปภาพเดียวอธิบายต้นทาง: แท้จริงแล้ว CDN บล็อกอะไรไว้บ้าง
12:08
CSRF คืออะไร? คู่มือฉบับสมบูรณ์เกี่ยวกับการปลอมแปลงคำขอข้ามเว็บไซต์
06:02
คำแนะนำฉบับเต็มเกี่ยวกับ API Gateway: ประตูบานแรกสู่ไมโครเซอร์วิส
12:05
ทำไม LIKE ใน MySQL ถึงช้าจัง? บทเรียนครบวงจรของ ElasticSearch
05:59
โค้ดกลายเป็นแรงดันไฟฟ้าได้อย่างไร? วิดีโอเดียวอธิบายหลักการของสถาปัตยกรรมคอมพิวเตอร์อย่างละเอียด
07:47
MongoDB การปฏิบัติจริงระดับองค์กร: บทนำหลักสูตร - คุณกล้าที่จะนำ MongoDB ไปใช้ในการผลิตหรือไม่ หากคุณทำได้แค่เพิ่ม ลบ แก้ไข และสอบถามเท่านั้น?
09:46
เกินเวลาไปสามวินาที สต็อกถูกหักไปหรือยัง? บทเรียนฉบับสมบูรณ์เกี่ยวกับ Distributed Transactions
14:54
ใช้เวลาแค่ 20 บรรทัด แต่กวาดไปถึงหนึ่งล้านบรรทัด? คู่มือฉบับสมบูรณ์สำหรับการปรับแต่งประสิทธิภาพ SQL
17:45
ทั้งสองคนอ่านค่าได้ 1 ทำไมสต็อกถึงกลายเป็นลบหนึ่งได้? 튜토리얼완전한บทเรียนเรื่องทรานแซกชันและการควบคุมการทำงานพร้อมกัน
15:43
เปลี่ยนเบอร์โทรศัพท์เบอร์เดียว อัปเดตแปดหมื่นบรรทัด? บทเรียนฉบับสมบูรณ์เกี่ยวกับการออกแบบฐานข้อมูลและรูปแบบบรรทัดฐาน
25:15
ส่งออกครั้งเดียวทำฐานข้อมูลหลักล่ม? สอนวิธีแยกการอ่านและเขียนฐานข้อมูลแบบสมบูรณ์
16:21
แค่ตารางเดียวยอดถึงยี่สิบล้านก็ต้องแบ่งตารางแล้วเหรอ? สอนวิธีแยกฐานข้อมูลและแบ่งตารางแบบฉบับสมบูรณ์
13:16
นาฬิกาย้อนกลับไป 3 มิลลิวินาที ทําไมเลขที่คำสั่งซื้อถึงชนกัน? กวดวิชาที่สมบูรณ์แบบสำหรับ Snowflakes Algorithm
16:23
เปิดใช้งานได้เต็มระบบ ทำไมคำสั่งซื้อเมื่อวานช่วงบ่ายถึงกู้คืนไม่ได้? บทเรียนฉบับสมบูรณ์เกี่ยวกับการสำรองและกู้คืนข้อมูล
15:01
ความแตกต่างระหว่าง TCP และ UDP อธิบายให้เข้าใจในครั้งเดียว (ทำไมวิดีโอถึงภาพแตก แต่ไฟล์ข้อมูลไม่ผิดพลาดเลยสักไบต์)
11:21
บน Wi-Fi ของคาเฟ่ ทำไมรหัสผ่านถึงเป็นข้อความตัวอักษรธรรมดา? คู่มือฉบับสมบูรณ์เกี่ยวกับ HTTP และ HTTPS
14:18
คอมพิวเตอร์เครื่องนี้จำคุณได้ แต่เครื่องนั้นไม่จำ: อธิบาย Cookie และ Session ให้เข้าใจ in a single video
16:15
รวมทุกอย่างไว้ในสายธุรกิจเดียว? บทเรียน کامل High Cohesion, Low Coupling
13:36
บริการลูกค้า
ด้านบน
赛事库 课堂 2021拜年纪