Hướng dẫn mysql update order by - thứ tự cập nhật mysql theo

8.2.1.16 & nbsp; Đặt hàng bằng cách tối ưu hóa

Phần này mô tả khi MySQL có thể sử dụng chỉ mục để đáp ứng điều khoản

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7, hoạt động
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 được sử dụng khi không thể sử dụng chỉ mục và thông tin kế hoạch thực thi có sẵn từ trình tối ưu hóa khoảng
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7.

Một

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7 có và không có
SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2;
1 có thể trả lại các hàng theo các đơn đặt hàng khác nhau, như được thảo luận trong Phần & NBSP; 8.2.1.19, Tối ưu hóa truy vấn giới hạn.

  • Sử dụng các chỉ mục để đáp ứng trật tự bằng cách

  • Sử dụng filesort để đáp ứng trật tự bằng cách

  • Ảnh hưởng đến trật tự bằng cách tối ưu hóa

  • Đặt hàng theo thông tin kế hoạch thực thi có sẵn

Sử dụng các chỉ mục để đáp ứng trật tự bằng cách

Sử dụng filesort để đáp ứng trật tự bằng cách

Ảnh hưởng đến trật tự bằng cách tối ưu hóa

Đặt hàng theo thông tin kế hoạch thực thi có sẵn

  • Trong một số trường hợp, MySQL có thể sử dụng một chỉ mục để đáp ứng điều khoản

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7 và tránh việc sắp xếp thêm liên quan đến việc thực hiện hoạt động
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    8.

    SELECT * FROM t1
      ORDER BY key_part1, key_part2;

    Chỉ số cũng có thể được sử dụng ngay cả khi

    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    4 không khớp chính xác với chỉ mục, miễn là tất cả các phần không được sử dụng của chỉ số và tất cả các cột
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7 là hằng số trong mệnh đề
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    6. Nếu chỉ mục không chứa tất cả các cột được truy vấn truy cập, chỉ mục chỉ được sử dụng nếu truy cập chỉ mục rẻ hơn các phương thức truy cập khác.

    Giả sử rằng có một chỉ mục trên

    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    7,
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    8), các truy vấn sau đây có thể sử dụng chỉ mục để giải quyết phần
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7. Liệu trình tối ưu hóa thực sự có làm như vậy hay không phụ thuộc vào việc đọc chỉ mục có hiệu quả hơn so với quét bảng hay không nếu các cột không trong chỉ mục cũng phải được đọc.

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
  • Trong truy vấn này, chỉ mục trên

    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    7,
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    8) cho phép trình tối ưu hóa để tránh sắp xếp:

    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
  • Tuy nhiên, truy vấn sử dụng

    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    2, có thể chọn nhiều cột hơn
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    3 và
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    8. Trong trường hợp đó, việc quét toàn bộ chỉ mục và tìm kiếm các hàng bảng để tìm các cột không có trong chỉ mục có thể đắt hơn so với quét bảng và sắp xếp kết quả. Nếu vậy, trình tối ưu hóa có thể không sử dụng chỉ mục. Nếu
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    2 chỉ chọn các cột chỉ mục, chỉ số sẽ được sử dụng và sắp xếp.

    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
  • Nếu

    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    6 là bảng
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    7, khóa chính của bảng hoàn toàn là một phần của chỉ mục và chỉ mục có thể được sử dụng để giải quyết
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7 cho truy vấn này:

    Trong truy vấn này,

    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    3 không đổi, do đó, tất cả các hàng được truy cập thông qua chỉ mục đều theo thứ tự ____28 và một chỉ mục trên
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    7,
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    8) Tránh sắp xếp nếu mệnh đề
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    6 đủ chọn lọc để tạo ra phạm vi chỉ số rẻ hơn so với quét bảng:

    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 ASC;

    Trong hai truy vấn tiếp theo, liệu chỉ mục có được sử dụng tương tự như cùng một truy vấn mà không có

    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 ASC;
    4 được hiển thị trước đó:

  • Hai cột trong một

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7 có thể sắp xếp theo cùng một hướng (cả
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 ASC;
    6 hoặc cả
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 ASC;
    4) hoặc theo hướng ngược lại (một
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 ASC;
    6, một
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 ASC;
    4). Một điều kiện để sử dụng chỉ số là chỉ số phải có cùng tính đồng nhất, nhưng không cần phải có cùng một hướng thực tế.

    Nếu một truy vấn trộn
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 ASC;
    6 và
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 ASC;
    4, trình tối ưu hóa có thể sử dụng một chỉ mục trên các cột nếu chỉ mục cũng sử dụng các cột tăng dần và giảm dần tương ứng:
  • Trình tối ưu hóa có thể sử dụng một chỉ mục trên (

    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    3,
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    8) nếu
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    3 đang giảm và
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    8 đang tăng dần. Nó cũng có thể sử dụng một chỉ mục trên các cột đó (với quét ngược) nếu
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    3 tăng dần và
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    8 đang giảm dần. Xem Phần & NBSP; 8.3.13, Chỉ số giảm dần.

    SELECT * FROM t1
      WHERE key_part1 = constant1 AND key_part2 > constant2
      ORDER BY key_part2;

Trong hai truy vấn tiếp theo,

SELECT * FROM t1
  ORDER BY key_part1 DESC, key_part2 DESC;

SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2 DESC;
3 được so sánh với một hằng số. Chỉ mục được sử dụng nếu mệnh đề
SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2;
6 đủ chọn lọc để làm cho một phạm vi chỉ mục quét rẻ hơn so với quét bảng:cannot use indexes to resolve the
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7, although it may still use indexes to find the rows that match the
SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2;
6 clause. Examples:

  • SELECT * FROM t1
      WHERE key_part1 > constant
      ORDER BY key_part1 ASC;
    
    SELECT * FROM t1
      WHERE key_part1 < constant
      ORDER BY key_part1 DESC;

    SELECT * FROM t1 ORDER BY key1, key2;
  • Trong truy vấn tiếp theo,

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7 không đặt tên
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    3, nhưng tất cả các hàng được chọn đều có giá trị
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2 DESC;
    3 hằng số, do đó chỉ mục vẫn có thể được sử dụng:

    SELECT * FROM t1 WHERE key2=constant ORDER BY key1_part1, key1_part3;
  • Trong một số trường hợp, MySQL không thể sử dụng các chỉ mục để giải quyết

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7, mặc dù nó vẫn có thể sử dụng các chỉ mục để tìm các hàng phù hợp với mệnh đề
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    6. Ví dụ:

    SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
  • Truy vấn sử dụng

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7 trên các chỉ mục khác nhau:

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    0
  • Truy vấn sử dụng

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7 trên các phần không liên tục của một chỉ mục:

  • Chỉ số được sử dụng để tìm nạp các hàng khác với dấu được sử dụng trong

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7:

  • Truy vấn sử dụng

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    7 với biểu thức bao gồm các thuật ngữ khác với tên cột chỉ mục:

  • Chỉ số không lưu trữ các hàng theo thứ tự. Ví dụ, điều này đúng với chỉ mục

    SELECT * FROM t1 ORDER BY key1, key2;
    7 trong bảng
    SELECT * FROM t1 ORDER BY key1, key2;
    8.

Tính khả dụng của một chỉ mục để phân loại có thể bị ảnh hưởng bởi việc sử dụng các bí danh cột. Giả sử rằng cột

SELECT * FROM t1 ORDER BY key1, key2;
9 được lập chỉ mục. Trong câu lệnh này, tên của cột trong danh sách chọn là
SELECT * FROM t1 WHERE key2=constant ORDER BY key1_part1, key1_part3;
0. Nó đề cập đến
SELECT * FROM t1 ORDER BY key1, key2;
9, cũng như tham chiếu đến
SELECT * FROM t1 WHERE key2=constant ORDER BY key1_part1, key1_part3;
0 trong
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7, do đó, chỉ mục trên
SELECT * FROM t1 ORDER BY key1, key2;
9 có thể được sử dụng:

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
1

Trong tuyên bố này, tên của cột trong danh sách chọn cũng là

SELECT * FROM t1 WHERE key2=constant ORDER BY key1_part1, key1_part3;
0, nhưng đó là tên bí danh. Nó đề cập đến
SELECT * FROM t1 WHERE key2=constant ORDER BY key1_part1, key1_part3;
6, cũng như tham chiếu đến
SELECT * FROM t1 WHERE key2=constant ORDER BY key1_part1, key1_part3;
0 trong
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7, do đó, chỉ mục trên
SELECT * FROM t1 ORDER BY key1, key2;
9 không thể được sử dụng:

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
2

Trong câu lệnh sau,

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7 đề cập đến một tên không phải là tên của một cột trong danh sách chọn. Nhưng có một cột trong
SELECT * FROM t1
  ORDER BY key_part1 DESC, key_part2 DESC;

SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2 DESC;
6 có tên
SELECT * FROM t1 WHERE key2=constant ORDER BY key1_part1, key1_part3;
0, do đó
SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2;
4 đề cập đến
SELECT * FROM t1 ORDER BY key1, key2;
9 và chỉ số trên
SELECT * FROM t1 ORDER BY key1, key2;
9 có thể được sử dụng. (Tất nhiên, thứ tự sắp xếp kết quả có thể hoàn toàn khác với thứ tự cho
SELECT * FROM t1 WHERE key2=constant ORDER BY key1_part1, key1_part3;
6, tất nhiên.)

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
3

Trước đây (MySQL 5.7 trở xuống),

SELECT * FROM t1 ORDER BY key1, key2;
3 được sắp xếp ngầm trong các điều kiện nhất định. Trong MySQL 8.0, điều đó không còn xảy ra, do đó việc chỉ định
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
8 ở cuối để triệt tiêu việc sắp xếp ngầm (như đã thực hiện trước đó) không còn cần thiết nữa. Tuy nhiên, kết quả truy vấn có thể khác với các phiên bản MySQL trước đó. Để tạo ra một đơn đặt hàng sắp xếp nhất định, cung cấp một mệnh đề
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7.

Sử dụng filesort để đáp ứng trật tự bằng cách

Nếu một chỉ mục không thể được sử dụng để thỏa mãn mệnh đề

SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2;
4, MySQL thực hiện thao tác
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 đọc các hàng bảng và sắp xếp chúng. Một
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 tạo thành một giai đoạn sắp xếp thêm trong thực thi truy vấn.

Để có được bộ nhớ cho các hoạt động

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8, kể từ MySQL 8.0.12, trình tối ưu hóa phân bổ bộ đệm bộ nhớ tăng dần khi cần, theo kích thước được chỉ ra bởi biến hệ thống ____104 đến MySQL 8.0.12. Điều này cho phép người dùng đặt
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
04 thành các giá trị lớn hơn để tăng tốc các loại lớn hơn, mà không quan tâm đến việc sử dụng bộ nhớ quá mức cho các loại nhỏ. (Lợi ích này có thể không xảy ra đối với nhiều loại đồng thời trên Windows, có đa luồng yếu
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
07.)

Hoạt động

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 sử dụng các tệp đĩa tạm thời khi cần thiết nếu tập kết quả quá lớn để phù hợp với bộ nhớ. Một số loại truy vấn đặc biệt phù hợp với các hoạt động
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 hoàn toàn trong bộ nhớ. Ví dụ: trình tối ưu hóa có thể sử dụng
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 để xử lý hiệu quả trong bộ nhớ, mà không cần tệp tạm thời, hoạt động
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7 cho các truy vấn (và các nhóm phụ) của mẫu sau:

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
4

Các truy vấn như vậy là phổ biến trong các ứng dụng web chỉ hiển thị một vài hàng từ một tập kết quả lớn hơn. Ví dụ:

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
5

Ảnh hưởng đến trật tự bằng cách tối ưu hóa

Đối với các truy vấn

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7 chậm mà
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 không được sử dụng, hãy thử hạ biến hệ thống
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
14 xuống một giá trị phù hợp để kích hoạt
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8. . Tính đến 8.0.20,
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
14 không được dùng để thay đổi trình tối ưu hóa khiến nó lỗi thời và không có hiệu lực.

Để tăng tốc độ

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
7, hãy kiểm tra xem bạn có thể nhờ MySQL sử dụng các chỉ mục thay vì pha sắp xếp thêm. Nếu điều này là không thể, hãy thử các chiến lược sau:

  • Tăng giá trị biến

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    04. Lý tưởng nhất, giá trị phải đủ lớn cho toàn bộ kết quả được đặt phù hợp với bộ đệm sắp xếp (để tránh ghi vào đĩa và hợp nhất đường chuyền).

    Có tính đến kích thước của các giá trị cột được lưu trữ trong bộ đệm sắp xếp bị ảnh hưởng bởi giá trị biến hệ thống

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    19. Ví dụ: nếu Tuples lưu trữ các giá trị của các cột chuỗi dài và bạn tăng giá trị của
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    19, kích thước của bộ đệm bộ đệm sắp xếp cũng tăng và có thể yêu cầu bạn tăng
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    04.

    Để theo dõi số lượng đường chuyền hợp nhất (để hợp nhất các tệp tạm thời), hãy kiểm tra biến trạng thái

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    22.

  • Tăng giá trị biến

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    23 để nhiều hàng được đọc cùng một lúc.

  • Thay đổi biến hệ thống

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    24 để trỏ đến một hệ thống tệp chuyên dụng với một lượng lớn không gian trống. Giá trị thay đổi có thể liệt kê một số đường dẫn được sử dụng theo kiểu vòng tròn; Bạn có thể sử dụng tính năng này để trải đều tải trên một số thư mục. Tách các đường dẫn bằng các ký tự đại tràng (
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    25) trên các ký tự UNIX và SEMICOLON (
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    26) trên Windows. Các đường dẫn nên đặt tên cho các thư mục trong các hệ thống tệp nằm trên các đĩa vật lý khác nhau, không phải các phân vùng khác nhau trên cùng một đĩa.physical disks, not different partitions on the same disk.

Đặt hàng theo thông tin kế hoạch thực thi có sẵn

Với

SELECT * FROM t1 ORDER BY key1, key2;
0 (xem Phần & NBSP; 8.8.1, Tối ưu hóa các truy vấn với giải thích), bạn có thể kiểm tra xem MySQL có thể sử dụng các chỉ mục để giải quyết mệnh đề
SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2;
4 không:

  • Nếu cột

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    29 của đầu ra
    SELECT * FROM t1 ORDER BY key1, key2;
    0 không chứa
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    31, chỉ số được sử dụng và không được thực hiện
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    8.

  • Nếu cột

    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    29 của đầu ra
    SELECT * FROM t1 ORDER BY key1, key2;
    0 chứa
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    31, chỉ số không được sử dụng và
    SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    8 được thực hiện.

Ngoài ra, nếu một

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 được thực hiện, đầu ra theo dõi tối ưu hóa bao gồm một khối
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
38. Ví dụ:

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
6

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
39 chỉ ra bộ nhớ tối đa được sử dụng tại bất kỳ thời điểm nào trong thời gian sắp xếp. Đây là một giá trị lên đến nhưng không nhất thiết phải lớn bằng giá trị của biến hệ thống
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
04. Trước MySQL 8.0.12, đầu ra hiển thị
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
04 thay vào đó, cho biết giá trị của
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
04. . )

Giá trị

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
45 cung cấp thông tin về nội dung của bộ dữ liệu trong bộ đệm sắp xếp:

  • SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    46: Điều này chỉ ra rằng bộ đệm bộ đệm sắp xếp là các cặp chứa giá trị khóa sắp xếp và ID hàng của hàng bảng gốc. Các bộ dữ liệu được sắp xếp theo giá trị khóa sắp xếp và ID hàng được sử dụng để đọc hàng từ bảng.

  • SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    47: Điều này chỉ ra rằng bộ đệm bộ đệm sắp xếp chứa giá trị khóa sắp xếp và các cột được tham chiếu bởi truy vấn. Các bộ dữ liệu được sắp xếp theo giá trị khóa sắp xếp và giá trị cột được đọc trực tiếp từ tuple.

  • SELECT pk, key_part1, key_part2 FROM t1
      ORDER BY key_part1, key_part2;
    48: Giống như biến thể trước đó, nhưng các cột bổ sung được đóng gói chặt chẽ với nhau thay vì sử dụng mã hóa có độ dài cố định.

SELECT * FROM t1 ORDER BY key1, key2;
0 không phân biệt liệu trình tối ưu hóa có hoặc không thực hiện
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 trong bộ nhớ hay không. Có thể thấy việc sử dụng một
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
8 trong bộ nhớ trong đầu ra theo dõi trình tối ưu hóa. Tìm kiếm
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
52. Để biết thông tin về dấu vết của trình tối ưu hóa, hãy xem MySQL Internals: Truy tìm Trình tối ưu hóa.