Tối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian

  1. Trang chủ
  2. Blog
  3. Cơ sở dữ liệu & SQL

Cơ sở dữ liệu & SQL

Tối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian

Đừng đoán tại sao truy vấn lại chậm. Tìm hiểu cách đọc kế hoạch thực hiện, sau đó áp dụng các bản sửa lỗi quan trọng nhất, với các phép đo trước và sau từ một bảng thực gồm một triệu hàng.

Đọc 9 phút
Tối ưu hóa truy vấn SQL: đọc kế hoạch thực hiện và sửa các truy vấn chậm, có tính thời gian

Điểm chính

  • Bắt đầu với kế hoạch thực hiện. Nó cho bạn biết cơ sở dữ liệu thực sự làm gì.
  • Tìm kiếm các bản quét toàn bộ trên các bảng lớn, sau đó thêm các chỉ mục phù hợp với bộ lọc và các phép nối của bạn.
  • Tránh gói cột được lập chỉ mục trong một hàm vì điều này có thể làm ngừng việc sử dụng chỉ mục hiệu quả.
  • Đo lường trước và sau vì mọi cơ sở dữ liệu và tập dữ liệu đều hoạt động khác nhau.

Một truy vấn mất vài mili giây năm ngoái có thể mất vài phút ngày hôm nay, đơn giản vì bảng đã lớn lên. Tối ưu hóa truy vấn SQL không nói về các thủ thuật thông minh mà thiên về một quy trình có thể lặp lại: tìm hiểu xem cơ sở dữ liệu đang làm gì, loại bỏ công việc lãng phí và kiểm tra xem việc đó có giúp ích hay không.

Chúng tôi đã thử nghiệm từng kỹ thuật bên dưới trên một triệu hàng được tạo trong SQLite 3.50. Thời gian là cách tốt nhất trong số nhiều lần chạy từ một máy tính xách tay, sử dụng cơ sở dữ liệu trong bộ nhớ. Chúng sẽ không khớp với hệ thống của bạn và mỗi PostgreSQL, MySQL và SQL Server đều có trình tối ưu hóa và định dạng kế hoạch riêng. Tập trung vào quy mô của từng cải tiến và các nguyên tắc đằng sau nó.

Kết quả trong nháy mắt

Kỹ thuật trước đây Sau
Chỉ mục trên cột bộ lọc 73 mili giây 0,01 mili giây
Phạm vi chứ không phải là một hàm trên một cột 96 mili giây 33 mili giây
Chỉ số tổng hợp cho hai bộ lọc 19 mili giây 2,2 mili giây
Keyset thay vì OFFSET sâu 8,1 mili giây 0,01 mili giây

Thiết lập thử nghiệm

CREATE TABLE customers (
  id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
  id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
  created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values

Một quy trình tối ưu hóa đơn giản

  1. Tìm các truy vấn quan trọng. Sử dụng nhật ký truy vấn hoặc theo dõi chậm. Một truy vấn 200 mili giây chạy một nghìn lần một phút có thể quan trọng hơn một báo cáo hàng tháng dài 10 giây.
  2. Đọc kế hoạch. Xem cơ sở dữ liệu thực sự đang làm gì.
  3. Thay đổi một thứ. Thêm chỉ mục hoặc viết lại một phần truy vấn.
  4. Đo lại, trên dữ liệu thực tế. Kế hoạch về 100 hàng thử nghiệm cho bạn biết rất ít về một triệu.
  5. Hãy theo dõi theo thời gian. Các kế hoạch có thể thay đổi khi dữ liệu tăng lên và số liệu thống kê thay đổi.

Đọc kế hoạch thực hiện

Kế hoạch thực hiện là chiến lược từng bước của cơ sở dữ liệu để chạy truy vấn, bao gồm các chỉ mục mà cơ sở dữ liệu sử dụng và thứ tự tham gia các bảng. Tiền tố một truy vấn để xem nó:

Cơ sở dữ liệu Lệnh
SQLite GIẢI THÍCH KẾ HOẠCH TRUY VẤN CHỌN ...
PostgreSQL GIẢI THÍCH PHÂN TÍCH CHỌN ...
MySQL EXPLAIN SELECT ... hoặc EXPLAIN ANALYZE
Máy chủ SQL Kế hoạch thực hiện thực tế trong SSMS

Lưu ý rằng EXPLAIN ANALYZE trong PostgreSQL thực sự chạy truy vấn, vì vậy hãy cẩn thận khi sử dụng nó với UPDATE hoặc DELETE. Đây là những gì cần tìm kiếm đầu tiên:

Bạn thấy đấy Ý nghĩa Thông thường
Quét hoặc Quét tuần tự Đọc toàn bộ bảng Một mối quan tâm trên các bàn lớn
Tìm kiếm hoặc Tìm kiếm chỉ mục Nhảy đến các hàng phù hợp Tốt
Chỉ số che phủ Đã trả lời chỉ từ chỉ mục Rất tốt
Cây B tạm thời hoặc Sắp xếp Công việc phân loại bổ sung Đáng kiểm tra

Quét toàn bộ không tự động xấu. Nếu một truy vấn cần hầu hết một bảng nhỏ thì quét có thể là lựa chọn nhanh nhất. Trong PostgreSQL’s EXPLAIN ANALYZE, cũng so sánh các hàng ước tính với các hàng thực tế. Sự khác biệt lớn thường có nghĩa là số liệu thống kê trong bảng đã lỗi thời.

Thêm chỉ mục phù hợp

Truy vấn này tìm thấy đơn đặt hàng của một khách hàng:

SELECT id, total FROM orders WHERE customer_id = 123;

Trước khi thêm chỉ mục, kế hoạch là quét toàn bộ:

SCAN orders
-- 20 rows in 73 ms

Sau đó, chúng tôi đã thêm chỉ mục vào cột bộ lọc:

CREATE INDEX idx_orders_customer ON orders(customer_id);

SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms

20 hàng tương tự quay lại nhanh hơn hàng nghìn lần vì cơ sở dữ liệu không còn đọc hàng triệu hàng để tìm chúng nữa. Không có kỹ thuật nào khác trong bài viết này mang lại cho chúng tôi chiến thắng lớn hơn. Ứng cử viên tốt đầu tiên là các cột được sử dụng trong WHERE, JOIN và ORDER BY, đặc biệt khi chúng thu hẹp kết quả xuống còn vài hàng. Hướng dẫn của chúng tôi về chỉ mục SQL giải thích cách chúng hoạt động.

Không bọc các cột được lập chỉ mục trong hàm

Dưới đây là hai cách để tìm đơn hàng tháng 3, với chỉ mục trên created:

-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms

-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms

Cả hai đều trả về các hàng giống hệt nhau, tuy nhiên hàng đầu tiên mất khoảng ba lần. Kế hoạch cho thấy tại sao: với một hàm trên cột, cơ sở dữ liệu không thể nhảy đến một vị trí trong chỉ mục đã sắp xếp, vì vậy nó phải SCAN qua mọi mục nhập. Phiên bản phạm vi có thể SEARCH thẳng đến đúng nơi. Điều kiện có thể sử dụng chỉ mục theo cách này được gọi là sargable.

Vấn đề tương tự cũng xuất hiện với các mẫu phổ biến sau:

Tránh Thích hơn
NĂM Ở ĐÂU (đã tạo) = 2026 Ở ĐÂU đã tạo >= '2026-01-01' VÀ đã tạo < '2027-01-01'
Giá ở đâu * 2 > 100 Giá ở đâu > 50
Ở ĐÂU LOWER(email) = 'a@b.com' Chỉ mục dựa trên chức năng hoặc đối chiếu không phân biệt chữ hoa chữ thường
Tên ở đâu THÍCH '%99' Tìm kiếm tiền tố hoặc tìm kiếm toàn văn

Chúng tôi cũng đã kiểm tra cái cuối cùng đó. Ký tự đại diện hàng đầu được tạo ra SCAN customers, vì chỉ mục được sắp xếp từ chữ cái đầu tiên không thể giúp khớp ở cuối.

Chỉ số tổng hợp

Khi truy vấn lọc trên hai cột, chỉ mục một cột chỉ thực hiện một phần công việc:

SELECT id FROM orders
WHERE status = 'paid'
  AND created >= '2026-03-01' AND created < '2026-03-08';

-- Using only the created index: 6,198 rows in 19 ms

CREATE INDEX idx_status_created ON orders(status, created);

-- SEARCH orders USING COVERING INDEX idx_status_created
--   (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms

Thứ tự cột rất quan trọng. Chỉ mục trên (status, created) hoạt động giống như một danh bạ điện thoại được sắp xếp theo họ rồi đến tên. Bạn có thể tra cứu họ riêng, nhưng không thể tra cứu tên riêng. Chỉ riêng truy vấn của chúng tôi trên status đã có thể sử dụng chỉ mục này. Chỉ lọc trên created nói chung không thể sử dụng nó một cách hiệu quả. Theo nguyên tắc chung, hãy đặt các cột được kiểm tra bằng đẳng thức trước và các cột theo phạm vi sau chúng.

Kế hoạch đó cũng cho biết bao gồm chỉ mục, nghĩa là chỉ mục chứa mọi thứ mà truy vấn cần, do đó bản thân bảng không cần phải đọc. Chỉ chọn các cột bạn cần sẽ khiến điều này dễ xảy ra hơn, đây là một lý do khác cần tránh SELECT *.

Phân trang nhanh hơn

Việc sử dụng OFFSET cho các trang sâu là một chi phí ẩn vì cơ sở dữ liệu vẫn phải duyệt qua tất cả các hàng bị bỏ qua:

-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms

-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms

Phân trang keyset vẫn nhanh cho dù bạn đi sâu đến đâu. Nó cũng tránh việc dịch chuyển hàng giữa các trang khi dữ liệu mới được thêm vào. Sự đánh đổi là người dùng không thể nhảy thẳng tới trang 5.000, điều này hiếm khi là nhu cầu thực sự. Trên các bảng có hàng rộng hoặc có nhiều hàng cần bỏ qua, khoảng cách có thể lớn hơn nhiều so với trong thử nghiệm của chúng tôi.

Mẹo: Thời gian của chúng tôi đo lường từng truy vấn một trên máy không hoạt động. Dưới tải thực, một truy vấn không hiệu quả sẽ gây ra nhiều thiệt hại hơn vì nó cũng giữ các khóa và cạnh tranh bộ nhớ, ổ đĩa và CPU với mọi thứ khác.

Viết các truy vấn gọn gàng hơn

  • Chỉ chọn các cột bạn cần. SELECT * gửi nhiều dữ liệu hơn và điều này có thể ngăn chỉ mục che phủ truy vấn.
  • Lọc sớm. Sử dụng WHERE để xóa các hàng trước khi nhóm và HAVING chỉ dành cho các điều kiện trên tập hợp. Xem NHÓM SQL THEO và CÓ.
  • Sử dụng LIMIT khi bạn chỉ cần một vài hàng.
  • Ưu tiên UNION ALL khi bạn không cần xóa các bản sao. Thử nghiệm UNION so với UNION ALL của chúng tôi cho thấy điều đó tiết kiệm được những gì.
  • Tránh DISTINCT không cần thiết. Nó thường ẩn một phép nối tạo ra các bản sao.
  • Sử dụng EXISTS để kiểm tra sự tồn tại. Quá trình này có thể dừng ở kết quả khớp đầu tiên, như hướng dẫn của chúng tôi về Truy vấn con SQL giải thích.
  • Theo dõi N+1 truy vấn. Một truy vấn trên mỗi hàng trong một vòng lặp, thường do mã ứng dụng gây ra, thường là vấn đề thực sự. Một truy vấn nối hoặc theo đợt có thể thay thế hàng trăm chuyến đi khứ hồi.

Tham gia

Lập chỉ mục các cột bạn tham gia. Chúng tôi đã chạy báo cáo tổng chi tiêu cho khách hàng ở một thành phố và kế hoạch này chính xác là những gì bạn mong đợi:

SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;

-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms

Nó quét khách hàng, sau đó sử dụng chỉ mục để tìm đơn hàng của từng người. Nếu không có chỉ mục trên orders.customer_id, cơ sở dữ liệu sẽ phải thực hiện nhiều công việc hơn cho mỗi khách hàng. Chỉ mục trên khóa ngoại là một trong những bổ sung phổ biến và có giá trị nhất mà bạn có thể thực hiện. Để làm mới kiến ​​thức cơ bản của bạn, hãy xem Giải thích về các phép nối SQL.

Khi các chỉ số khiến bạn tốn kém

Các chỉ mục không miễn phí, vì vậy đừng thêm một chỉ mục cho mỗi cột:

  • Ghi chậm hơn. Mọi thao tác chèn, cập nhật và xóa cũng phải cập nhật từng chỉ mục.
  • Thêm dung lượng lưu trữ và bộ nhớ. Chỉ mục có thể phát triển lớn trên các bảng lớn.
  • Ít lợi ích đối với các cột không chọn lọc. Chỉ mục trên cột đúng hoặc sai có thể không hữu ích nếu hầu hết các hàng khớp nhau.
  • Dự phòng. Chỉ mục trên (a) thường không cần thiết nếu bạn đã có chỉ mục trên (a, b).

Kiểm tra số liệu thống kê sử dụng định kỳ và xóa các chỉ mục không sử dụng. Và giữ cho số liệu thống kê luôn mới với ANALYZE hoặc tương đương với cơ sở dữ liệu của bạn, vì trình tối ưu hóa dựa vào chúng để chọn một kế hoạch tốt. Đôi khi phần chậm là sự tranh chấp hơn là truy vấn. Các giao dịch giữ khóa trong thời gian dài có thể khiến truy vấn nhanh có vẻ chậm.

Những lỗi thường gặp

  • Tối ưu hóa mà không đo lường. Nhiều dự đoán tự tin hóa ra lại sai.
  • Thử nghiệm với dữ liệu nhỏ. Các kế hoạch và thời gian thay đổi đáng kể khi số lượng bảng tăng lên.
  • Tin tưởng vào mẹo cho cơ sở dữ liệu khác. Lời khuyên cho một công cụ có thể không áp dụng cho công cụ khác.
  • Thêm chỉ mục một cách mù quáng. Mỗi thao tác đều làm chậm quá trình ghi.
  • Bỏ qua hiệu ứng ở lần chạy đầu tiên. Bộ nhớ đệm làm cho lần chạy thứ hai nhanh hơn, vì vậy hãy chạy nhiều lần.

Lời kết

Hầu hết các truy vấn chậm đều có nguyên nhân thông thường: thiếu chỉ mục, hàm trên một cột hoặc quá nhiều dữ liệu được tìm nạp. Hãy thực hiện truy vấn thực sự chậm nhất của bạn trong tuần này, chạy EXPLAIN trên đó và tìm kiếm bản quét toàn bộ trên một bảng lớn. Hãy sửa một thứ, đo lại và ghi chú những gì bạn đã thay đổi.

Câu hỏi thường gặp

Tối ưu hóa truy vấn SQL là gì?

Đó là quá trình làm cho các truy vấn sử dụng ít thời gian và ít tài nguyên hơn, thường bằng cách kiểm tra các kế hoạch thực hiện, thêm các chỉ mục phù hợp và viết lại các truy vấn không hiệu quả.

Kế hoạch thực hiện là gì?

Đây là chiến lược được cơ sở dữ liệu chọn để chạy truy vấn, bao gồm cách đọc bảng, chỉ mục nào được sử dụng và thứ tự tham gia.

Làm cách nào để tìm thấy các truy vấn chậm?

Bật nhật ký truy vấn chậm của cơ sở dữ liệu của bạn hoặc sử dụng các công cụ như pg_stat_statements trong PostgreSQL. Sau đó tập trung vào các truy vấn có tổng thời gian cao nhất.

Việc thêm chỉ mục có luôn làm cho truy vấn nhanh hơn không?

Không. Nó giúp đọc có chọn lọc nhưng làm chậm quá trình ghi và sử dụng bộ nhớ. Trình tối ưu hóa cũng có thể bỏ qua nó nếu hầu hết các hàng phù hợp với điều kiện.

CHỌN * có ảnh hưởng xấu đến hiệu suất không?

Nó có thể được. Nó chuyển dữ liệu không cần thiết và có thể ngăn chỉ mục bao gồm truy vấn. Chỉ liệt kê các cột bạn cần thường là tốt hơn.

Tiếp tục học hỏi

Làm việc với Stack Quora

Cần trợ giúp về kiểm tra, WordPress hoặc SEO?

Chúng tôi giúp các nhóm phát triển phần mềm tốt hơn và phát triển trang web của họ. Hãy cho chúng tôi biết bạn đang làm gì và chúng tôi sẽ đề xuất bước tiếp theo rõ ràng.

Tiếp tục đọc

Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại

Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.

Trí tuệ nhân tạo

Giải thích về ảo giác AI: Tại sao các mô hình ngôn ngữ lại tạo nên mọi thứ và cách giảm thiểu nó

Ảo giác AI đã giải thích: chúng là gì, tại sao mô hình ngôn ngữ tạo ra chúng, các loại phổ biến, cách giảm thiểu chúng bằng cách căn cứ và nhắc nhở …

Đọc bài viết →
DevOps

Giải thích về các biến môi trường: Tệp .env, bí mật và cấu hình được thực hiện đúng

Các biến môi trường được giải thích bằng các ví dụ Python mà chúng tôi đã chạy: đọc và thiết lập chúng, tại sao mọi giá trị đều là một chuỗi, tệp .e…

Đọc bài viết →
Phát triển phần mềm

Giải thích về giới hạn tỷ lệ API: Thuật toán, tiêu đề và xử lý lỗi 429

Giới hạn tốc độ API được giải thích bằng mô phỏng mà chúng tôi đã chạy: nhóm mã thông báo, cửa sổ cố định, cửa sổ trượt, 429 phản hồi, tiêu đề giới …

Đọc bài viết →
Tự động hóa kiểm thử

Chế giễu bằng Python: unittest.mock, patch và những sai lầm khiến bài kiểm tra nói dối

Mô phỏng bằng Python với unittest.mock, đã được thử nghiệm: Mock và return_value, side_effect, vá lỗi nơi sử dụng tên, thông số kỹ thuật và thông số…

Đọc bài viết →
Kiểm thử phần mềm

Giải thích về phạm vi bảo hiểm của mã: Phạm vi tuyến so với chi nhánh và ý nghĩa thực sự 100%

Phạm vi bảo hiểm mã được giải thích bằng cách chạy phạm vi bảo hiểm thực tế: phạm vi bảo hiểm dòng, chi nhánh và điều kiện, đọc báo cáo, lý do tại s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

DELETE vs TRUNCATE vs DROP trong SQL: Sự khác biệt, khôi phục và thời điểm sử dụng mỗi loại

DELETE vs TRUNCATE vs DROP được giải thích bằng SQL đã được thử nghiệm: mỗi loại loại bỏ, khôi phục, kích hoạt, đặt lại danh tính, tốc độ và Postgre…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về Chế độ xem SQL: Tạo, sử dụng và tránh những cạm bẫy, kèm theo ví dụ

Chế độ xem SQL được giải thích bằng các truy vấn chúng tôi đã chạy: tạo chế độ xem, kết quả trực tiếp, ẩn cột, hiệu suất, chế độ xem có thể cập nhật…

Đọc bài viết →
Phát triển phần mềm

Giao diện TypeScript so với loại: Sự khác biệt thực sự, được thử nghiệm bằng trình biên dịch

Giao diện TypeScript so với loại, được kiểm tra bằng trình biên dịch thực: cả hai có thể làm gì, chỉ một người có thể làm gì, hợp nhất khai báo, mở …

Đọc bài viết →
Phát triển phần mềm

Giải thích về Python *args và **kwargs: Hàm linh hoạt với ví dụ rõ ràng

Python *args và **kwargs được giải thích bằng mã chúng tôi đã chạy: đóng gói và giải nén, thứ tự tham số, đối số chỉ từ khóa và chỉ vị trí, trình tr…

Đọc bài viết →
Phát triển phần mềm

Hàm Lambda của Python: Cú pháp, cách sử dụng thực tế và khi nào không nên sử dụng chúng

Các hàm lambda của Python được giải thích bằng mã chúng tôi đã chạy: cú pháp, sắp xếp bằng khóa, bản đồ và bộ lọc, các phần đóng, bẫy liên kết muộn …

Đọc bài viết →
Trí tuệ nhân tạo

Đại lý AI là gì? Cách chúng hoạt động, với vòng lặp tác nhân đơn giản, bạn có thể chạy

Tác nhân AI là gì? Hướng dẫn đơn giản về vòng lặp tác nhân, công cụ, bộ nhớ và lan can, với một vòng lặp Python nhỏ mà chúng tôi đã chạy, những rủi …

Đọc bài viết →
DevOps

Giám sát và Khả năng quan sát: Sự khác biệt thực sự, với nhật ký, số liệu và dấu vết

Giải thích về giám sát và khả năng quan sát: lỗi đã biết và chưa biết, nhật ký, số liệu và dấu vết, hướng dẫn về sự cố thanh toán, tín hiệu vàng, Op…

Đọc bài viết →
DevOps

Docker Volumes vs Bind Mounts: Duy trì dữ liệu vùng chứa đúng cách

Giải thích về khối lượng Docker và liên kết gắn kết: tại sao dữ liệu vùng chứa biến mất, khối lượng được đặt tên, liên kết gắn kết, tmpfs, ví dụ về …

Đọc bài viết →
Tự động hóa kiểm thử

TDD vs BDD: Key Differences, One Feature Built Both Ways and When to Use Each

TDD và BDD được giải thích bằng một tính năng giảm giá được xây dựng theo cả hai cách: tái cấu trúc màu đỏ-xanh với mã chúng tôi đã chạy, kịch bản C…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra chấp nhận của người dùng (UAT): Quy trình, danh sách kiểm tra và ví dụ thực tế

Giải thích về thử nghiệm chấp nhận của người dùng: ai chạy nó, nó khác với QA như thế nào, quy trình bảy bước, mẫu trường hợp thử nghiệm UAT, danh s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh

Các giá trị SQL NULL được giải thích bằng các truy vấn chúng tôi đã chạy: logic ba giá trị, IS NULL, COALESCE, NULLIF, cách tổng hợp, kết hợp và sắp…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Câu lệnh SQL CASE WHEN: Cú pháp, ví dụ thực tế và các lỗi thường gặp

TRƯỜNG HỢP SQL KHI được giải thích bằng các truy vấn mà chúng tôi đã chạy: các biểu mẫu đơn giản và được tìm kiếm, thứ tự điều kiện, các thủ thuật S…

Đọc bài viết →
Phát triển phần mềm

JWT là gì? Mã thông báo Web JSON được giải thích bằng một ví dụ hoạt động

JWT là gì? Mã thông báo Web JSON đã giải thích: ba phần, mã thông báo được xây dựng và giả mạo trong mã chúng tôi đã chạy, JWT so với phiên, lưu trữ…

Đọc bài viết →
Phát triển phần mềm

Giải thích về vòng lặp sự kiện JavaScript: Ngăn xếp cuộc gọi, Microtask và bộ hẹn giờ kèm ví dụ

Vòng lặp sự kiện JavaScript được giải thích bằng mã chúng tôi đã chạy: ngăn xếp cuộc gọi, hàng đợi tác vụ và vi nhiệm, tại sao setTimeout 0 không di…

Đọc bài viết →
Phát triển phần mềm

Giải thích về trình tạo và năng suất của Python: Tiết kiệm bộ nhớ bằng các ví dụ thực tế

Trình tạo và lợi nhuận Python được giải thích bằng mã chúng tôi đã chạy: cách chúng tạm dừng và tiếp tục, đo mức tiết kiệm bộ nhớ, quy trình, chuỗi …

Đọc bài viết →
Trí tuệ nhân tạo

Nhúng là gì? Giải thích sự tương đồng về vectơ và Cosine một cách đơn giản

nhúng là gì? Hướng dẫn bằng ngôn ngữ đơn giản về vectơ, độ tương tự cosine và tìm kiếm ngữ nghĩa, với một ví dụ nhỏ mà chúng tôi đã chạy, các cách s…

Đọc bài viết →
DevOps

Triển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn

Giải thích về triển khai Blue-green và Canary: cách hoạt động của từng loại, chi phí, rủi ro và khôi phục, nhóm người dùng ổn định mà chúng tôi đã t…

Đọc bài viết →
Tự động hóa kiểm thử

Kiểm tra không ổn định: Nguyên nhân gây ra chúng và cách khắc phục chúng vĩnh viễn

Các thử nghiệm không ổn định được giải thích bằng các bản demo mà chúng tôi đã chạy: nguyên nhân chính, cách xác nhận và chẩn đoán nguyên nhân, cách…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra tải và kiểm tra căng thẳng: Sự khác biệt, số liệu và ví dụ về k6

Giải thích về thử nghiệm tải và thử nghiệm căng thẳng: mỗi thử nghiệm chứng minh điều gì, thử nghiệm tăng đột biến và ngâm, số liệu quan trọng, lý d…

Đọc bài viết →
Kiểm thử phần mềm

Trường hợp thử nghiệm và kịch bản thử nghiệm: Sự khác biệt chính, ví dụ và thời điểm sử dụng từng trường hợp

Giải thích trường hợp kiểm thử và kịch bản kiểm thử: định nghĩa rõ ràng, bảng cạnh nhau, một tính năng đặt lại mật khẩu được lấy từ các tình huống n…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Tối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian

Đã thử nghiệm tối ưu hóa truy vấn SQL trên một triệu hàng: đọc kế hoạch thực hiện, thêm chỉ mục phù hợp, sửa các bộ lọc không thể mở rộng, sử dụng c…

Đọc bài viết →
Cơ sở dữ liệu & SQL

SQL UNION và UNION ALL: Sự khác biệt, ví dụ và hiệu suất đã được kiểm tra

SQL UNION và UNION ALL được giải thích bằng các truy vấn chúng tôi đã chạy: trùng lặp, cả hai quy tắc đều tuân theo, lỗi dữ liệu thực, hiệu suất đượ…

Đọc bài viết →
Phát triển phần mềm

Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ

Hướng dẫn API tìm nạp JavaScript đã được thử nghiệm trên máy chủ cục bộ: GET và POST, tại sao 404 không gửi, trình trợ giúp có thể sử dụng lại, chuỗ…

Đọc bài viết →
Phát triển phần mềm

Xử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ

Việc xử lý tệp Python được giải thích bằng mã chúng tôi đã chạy: chế độ mở, với, đọc tệp lớn, CSV, JSON, pathlib, tệp nhị phân, ghi an toàn, xử lý l…

Đọc bài viết →
Phát triển phần mềm

Các lớp và đối tượng Python: Hướng dẫn OOP với các ví dụ thực tế

Các lớp và đối tượng Python được giải thích bằng mã mà chúng tôi đã chạy: __init__, các phương thức, thuộc tính lớp và phiên bản, tính kế thừa, thuộ…

Đọc bài viết →
Trí tuệ nhân tạo

Mô hình ngôn ngữ lớn là gì? LLM hoạt động như thế nào, được giải thích mà không cường điệu hóa

Mô hình ngôn ngữ lớn là gì? LLM được giải thích bằng ngôn ngữ đơn giản: mã thông báo, phần nhúng, sự chú ý, đào tạo, cửa sổ nhiệt độ và ngữ cảnh, mộ…

Đọc bài viết →
DevOps

Các lệnh Linux cho người mới bắt đầu: Hướng dẫn thiết bị đầu cuối cần thiết kèm ví dụ

Các lệnh Linux dành cho người mới bắt đầu, được nhóm theo tác vụ: điều hướng, tệp, xem nhật ký, grep, đường dẫn, quyền, quy trình và lưu trữ, cùng v…

Đọc bài viết →
Tự động hóa kiểm thử

Selenium vs Nhà viết kịch: Sự khác biệt chính, So sánh mã và nên chọn cái nào

Selenium và Playwright được so sánh: kiến trúc, chờ đợi, hỗ trợ trình duyệt và ngôn ngữ, gỡ lỗi, kiểm tra giống nhau ở cả hai công cụ, lời khuyên di…

Đọc bài viết →
Kiểm thử phần mềm

Phân vùng tương đương: Giải thích kỹ thuật thiết kế thử nghiệm bằng các ví dụ đã thực hiện

Giải thích về phân vùng tương đương: cách tìm các phân vùng hợp lệ và không hợp lệ, các ví dụ hoạt động theo độ tuổi, mật khẩu và phiếu giảm giá, cá…

Đọc bài viết →
Kiểm thử phần mềm

Mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: Sự khác biệt, Ma trận và ví dụ thực tế

Giải thích về mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: định nghĩa rõ ràng, ma trận bốn chiều với các ví dụ, thang đo cấp độ, a…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Hướng dẫn về truy vấn con SQL: Các loại, truy vấn con tương quan và TỒN TẠI kèm ví dụ

Hướng dẫn về truy vấn con SQL với các truy vấn chúng tôi đã chạy: truy vấn con vô hướng, IN, FROM và SELECT, truy vấn con tương quan, EXISTS, bẫy và…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về giao dịch SQL và ACID: Các mức CAM KẾT, ROLLBACK và Cô lập

Các giao dịch SQL và ACID được giải thích bằng chuyển khoản ngân hàng mà chúng tôi đã thực hiện: CAM KẾT, ROLLBACK, điểm lưu trữ, khóa, mức cách ly,…

Đọc bài viết →
Phát triển phần mềm

Bảng cheat lệnh Git: Các lệnh bạn thực sự sử dụng, kèm theo ví dụ

Một bảng ghi lệnh Git được nhóm theo nhiệm vụ: thiết lập, dàn dựng, nhánh, điều khiển từ xa, lưu trữ, lịch sử và hoàn tác các lỗi, với đầu ra từ kho…

Đọc bài viết →
Phát triển phần mềm

Giải thích về các lời hứa trong JavaScript: then, Catch, Promise.all và các lỗi thường gặp

Lời hứa JavaScript được giải thích bằng mã chúng tôi đã chạy: trạng thái, then và chuỗi bắt, xử lý lỗi, Promise.all, allSettled, chủng tộc và bất kỳ…

Đọc bài viết →
Phát triển phần mềm

Hướng dẫn từ điển Python: Phương thức, ví dụ và mẫu chung

Hướng dẫn từ điển Python với mã chúng tôi đã chạy: tạo, đọc và cập nhật các ký tự, các phương thức chính, hợp nhất, hiểu, đếm và nhóm các mẫu cũng n…

Đọc bài viết →
Trí tuệ nhân tạo

RAG là gì? Giải thích về thế hệ tăng cường truy xuất bằng một ví dụ hoạt động

RAG là gì? Thế hệ tăng cường truy xuất được giải thích từng bước: lập chỉ mục, phân nhóm, nhúng, truy xuất, một ví dụ Python hoạt động nhỏ, đánh giá…

Đọc bài viết →
DevOps

Hướng dẫn về Terraform cho người mới bắt đầu: Cơ sở hạ tầng dưới dạng mã từ tệp đầu tiên đến mô-đun

Hướng dẫn về Terraform dành cho người mới bắt đầu: bắt đầu không cần tài khoản đám mây, tìm hiểu về init, lập kế hoạch và áp dụng, sau đó là các biế…

Đọc bài viết →
DevOps

Docker vs Kubernetes: Key Differences, How They Work Together and Which You Need

Docker vs Kubernetes giải thích: mỗi cái làm gì, cùng một ứng dụng chạy với cả hai, so sánh Docker Compose và Swarm, sự thay đổi của dockershim và c…

Đọc bài viết →
Tự động hóa kiểm thử

Hướng dẫn Pytest cho người mới bắt đầu: Đồ đạc, tham số hóa và ví dụ thực tế

Hướng dẫn về pytest dành cho người mới bắt đầu với các bài kiểm tra chúng tôi đã chạy trên pytest 9.2: xác nhận, đồ đạc, tham số, conftest, điểm đán…

Đọc bài viết →
Kiểm thử phần mềm

Vòng đời kiểm thử phần mềm (STLC): 6 giai đoạn, tiêu chí đầu vào và đầu ra, ví dụ

Vòng đời kiểm thử phần mềm giải thích: sáu giai đoạn STLC với tiêu chí đầu vào và đầu ra, sản phẩm phân phối, ví dụ về tính năng đăng nhập hoạt động…

Đọc bài viết →
Phát triển phần mềm

Git merge vs rebase: khác biệt, ví dụ và khi nào dùng cái nào

Git merge vs rebase được giải thích bằng đầu ra log thực tế, bảng so sánh, quy tắc vàng của rebase và quy trình làm việc nhóm an toàn.

Đọc bài viết →
Phát triển phần mềm

List comprehension trong Python: cú pháp, ví dụ và khi nào nên tránh

List comprehension trong Python: cú pháp, lọc dữ liệu, if-else, vòng lặp lồng nhau, thời gian đo thực tế và khi nào vòng lặp for thông thường tốt hơn.

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)

Hiểu SQL JOIN từng bước với bảng và truy vấn mẫu: INNER, LEFT, RIGHT, FULL, CROSS và SELF, cùng lỗi thường gặp và mẹo hiệu năng.

Đọc bài viết →