MySQL: Thứ tự của các trường trong bảng có tạo ra sự khác biệt về hiệu suất không?


7

Cụ thể, tôi tự hỏi liệu tôi có nên đặt tất cả các trường có độ dài cố định của mình như int, dấu thời gian, char ở đầu BẢNG TẠO và đặt tất cả độ dài thay đổi như varcharở cuối không.

Ngoài ra, tôi tự hỏi nếu TEXTcác lĩnh vực được đối xử khác nhau.


Tôi đã xóa thẻ mysql cho câu hỏi này vì các nhận xét về các RDBMS khác có thể có các quan điểm khác nhau về thứ tự cột trong bảng mà không ai nghĩ về MySQL. Tuy nhiên, đây là một câu hỏi xuất sắc (+1) để mang đến DBA.SE và DB Gurus khác.
RolandoMySQLDBA

Câu trả lời:


2

Tùy thuộc vào công cụ lưu trữ RDBMS, nó có thể sắp xếp lại các trường bên trong để lưu trữ và hiển thị. Nếu chúng ta xem xét câu hỏi này từ góc độ của một chương trình C, một bảng trong cơ sở dữ liệu giống như một cấu trúc C. Ví dụ: Một bảng trong chương trình ac có thể trông như sau:

typedef struct _Table {
  char type,      /* 1 byte   */
  int id,         /* 4 bytes  */
  char *name;     /* 4 bytes  */
  char city[25];  /* 25 bytes */ 
} Table;          /* 34 bytes total */

Bạn có thể thấy rằng trong chương trình của mình, bạn sẽ mong đợi rằng phần tử struct đầu tiên của bạn nằm ở vị trí con trỏ đầu tiên, sau đó một byte sẽ là vị trí phần tử thứ hai của bạn, v.v ... Chúng được gọi là offset.

RDBMS của bạn có thể sẽ lưu trữ cấu trúc dữ liệu tệp theo cấu trúc kiểu ac để nó có thể hiểu được phần bù (vị trí bộ nhớ) của dữ liệu sẽ là gì cho mỗi hàng. Sau đó, các chỉ mục sẽ được áp dụng để thực hiện tìm kiếm giữa các nhóm hàng. Một vị trí chỉ mục chỉ đơn giản là một con trỏ tới byte đầu tiên của mỗi hàng khớp (hoặc struct).

Là một loại kỹ sư phần mềm, có lẽ bạn muốn đóng gói cấu trúc sao cho các loại dữ liệu nhỏ nhất nằm ở đầu cấu trúc để khi con trỏ số học quét qua chúng, bạn sẽ thấy kết luận nhanh hơn, tuy nhiên đây là quyết định thiết kế .

Tóm lại, thực tiễn tốt nhất nói là thiết kế mô hình của bạn từ nhỏ nhất đến lớn nhất, nhưng có lẽ nó được tổ chức lại theo yêu cầu của công cụ lưu trữ.


Tôi nghĩ rằng bạn đã quên để thêm rằng đó cũng là một chút về phía tối ưu hóa quá mức
vol7ron

2

Tôi sẽ mạo hiểm để nói không lên phía trước về mặt bảng. Tuy nhiên, thứ tự của các trường trong một chỉ mục và số lượng các trường trong WHERE là một vấn đề lớn.

Ví dụ: Bạn có bảng sau:

CREATE TABLE testtable
(
    a INT,
    b INT,
    c INT,
    KEY (a,b,c)
);

Lưu ý truy vấn này:

SELECT * FROM testtable WHERE a=1 AND b=2 AND c=3;

Vì mỗi cột trong mệnh đề WHERE được đề cập dưới dạng eq numf, còn gọi là tham chiếu đẳng thức (bằng cách sử dụng =), nên chỉ mục có thể được sử dụng bằng 0 trên một cột.

Lưu ý truy vấn này:

SELECT * FROM testtable WHERE a=1 AND b>2 AND c=3;

Cột a ở phía trước chỉ mục dưới dạng eq numf, nhưng Cột b thì không. Đây là một truy vấn phạm vi. Tùy thuộc vào số lượng thẻ của Cột a (số lượng thẻ hiển thị trong CHỈ SỐ SHOW TỪ kiểm tra), quét chỉ mục nếu số lượng thẻ của a = 1 rất thấp và tổng số hàng có Cột a = 1 nhỏ hơn 5% số lượng hàng trong testtable, nếu không, quét toàn bộ bảng được chọn bởi bất kỳ Trình tối ưu hóa truy vấn nào (MySQL, Oracle, PostgreQuery, SQL Server, v.v.).

Lưu ý truy vấn này:

SELECT * FROM testtable WHERE b=>2 AND c=3;

Mệnh đề WHERE này không bao giờ đề cập đến Cột a. Kết quả? tự động quét toàn bộ bảng.

Theo thứ tự các cột trong một bảng, việc chống phân mảnh các bảng và tạo các định dạng bảng với độ dài hàng cố định có thể làm giảm bất kỳ vấn đề nào có thể xảy ra với thứ tự cột bảng là một mối quan tâm đáng ngờ.

Nếu bất cứ ai biết về các vấn đề với Oracle, PostgreSQL, SQL Server hoặc thứ tự cột liên quan đến RDBMS khác, vui lòng bấm vào.


Bạn đã quên đề cập đến cách đặt hàng của nơi sẽ được xác định bởi số lượng trận đấu được trả lại. Nghĩa là, nếu c=1trả về 500.000 bản ghi và c=3chỉ trả về 15 bản ghi, thì c = 3 phải được đặt đầu tiên trong WHEREmệnh đề.
vol7ron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.