MySQL - tại sao không lập chỉ mục mọi trường?


107

Gần đây, tôi đã biết được điều kỳ diệu của các chỉ mục và hiệu suất đã được cải thiện đáng kể. Tuy nhiên, với tất cả những gì đã học, tôi dường như không thể tìm ra câu trả lời cho câu hỏi này.

Chỉ mục rất tuyệt, nhưng tại sao ai đó không thể chỉ mục tất cả các trường để làm cho bảng cực kỳ nhanh? Tôi chắc rằng có lý do chính đáng để không làm điều này, nhưng còn ba trường trong bảng ba mươi trường thì sao? 10 trong một lĩnh vực 30? Người ta nên vẽ đường ở đâu, và tại sao?


7
thử chèn một giá trị vào một bảng có hơn 10 nghìn mục nhập được lập chỉ mục, tất cả các mục nhập phải được cập nhật vì các lần chèn / xóa và đây là một khoảng thời gian lớn và phần nào tiêu tốn bộ nhớ nếu mỗi giá trị có một chỉ mục
Jesus Ramos

5
Có một lý do nữa bên cạnh không gian và hiệu suất ghi: sử dụng nhiều chỉ mục cho một truy cập bảng duy nhất là rất kém hiệu quả . Điều đó có nghĩa là, ngay cả khi bạn có một chỉ mục trên mỗi cột, hiệu suất của select sẽ không tốt lắm nếu nhiều cột được truy cập trong mệnh đề WHERE. Trong trường hợp đó, tốt nhất là chỉ mục nhiều cột.
Markus Winand

1
nếu bạn đang có một bảng với 30 trường, bạn thực sự nên xem cấu trúc bảng của mình. Họ sẽ rất khó làm việc cùng.
web

Câu trả lời:


122

Các chỉ mục chiếm dung lượng trong bộ nhớ (RAM); Quá nhiều hoặc quá lớn các chỉ mục và DB sẽ phải hoán đổi chúng đến và từ đĩa. Chúng cũng làm tăng thời gian chèn và xóa (mỗi chỉ mục phải được cập nhật cho mỗi phần dữ liệu được chèn / xóa / cập nhật).

Bạn không có trí nhớ vô hạn. Làm cho nó để tất cả các chỉ mục phù hợp với RAM = tốt.

Bạn không có thời gian vô hạn. Chỉ lập chỉ mục các cột bạn cần lập chỉ mục sẽ giảm thiểu lần truy cập hiệu suất chèn / xóa / cập nhật.


11
Câu trả lời đơn giản tuyệt vời để cung cấp hiểu biết chung, nhưng không giúp ích nhiều trong việc thực sự xác định vị trí vẽ đường trên chỉ mục. Làm sao bạn biết? Chỉ cần thêm chúng vào các trường WHERED thường gặp và hy vọng điều tốt nhất?
Andrew

@Andrew một năm rưỡi sau, bạn đã tìm thấy câu trả lời cho câu hỏi của mình chưa?
Sinjai

1
@Sinjai Thêm chúng vào các cột thường ở đâu có lẽ là một nguyên tắc chung. Nhưng nếu không, bạn có thể đọc rất nhiều lần nếu bạn muốn trở thành chuyên gia về các chỉ số. ví dụ. stackoverflow.com/questions/3049283/…
Andrew

Đừng quên dung lượng ổ đĩa.
jpmc26

27

Hãy nhớ rằng mọi chỉ mục phải được cập nhật bất kỳ khi nào một hàng được cập nhật, chèn hoặc xóa. Vì vậy, bạn càng có nhiều chỉ mục, bạn sẽ có hiệu suất chậm hơn cho các hoạt động ghi.

Ngoài ra, mọi chỉ mục chiếm thêm dung lượng ổ đĩa và không gian bộ nhớ (khi được gọi), vì vậy nó cũng có khả năng làm chậm các hoạt động đọc (đối với các bảng lớn). Kiểm tra cái này


6
Liên kết dành cho MS SQL Server ; Câu hỏi này là dành cho MySQL
OMG Ngựa Non

5
@OMG hầu hết các điểm trong liên kết áp dụng cho tất cả các RDBMS lớn
RichardTheKiwi

5
@Richard hay còn gọi là cyberkiwi: Các chỉ mục không được ANSI đề cập - đó là một điều kỳ diệu khi mỗi nhà cung cấp đã sử dụng thuật ngữ tương tự. Nhưng ngay cả khi đó, chỉ SQL Server và MySQL sử dụng thuật ngữ chỉ mục "clustered" và "non-clustered" - nó có nghĩa là nhiều hơn trong SQL Server so với MySQL ở thời điểm đó. Không có gì để đảm bảo rằng các khuyến nghị cho một nhà cung cấp sẽ được áp dụng cho một nhà cung cấp khác.
OMG Ponies

3
@omg 6 điểm đầu tiên áp dụng cho bất kỳ dbms nào. bỏ qua những cái không / nhóm, sau đó xuống bên dưới là nhiều điểm hơn về lập chỉ mục chung, cũng tại điểm. Nếu bạn có những điều cụ thể muốn chỉ ra, hãy gọi cho họ. Nếu không, có vẻ như bạn đang phủ nhận tất cả các câu trả lời từ các nhận xét (bao gồm cả câu trả lời đã xóa của bạn), mà không ai đồng ý với đánh giá của bạn.
RichardTheKiwi

10

Bạn phải cân bằng nhu cầu CRUD. Việc ghi vào bảng trở nên chậm chạp. Đối với vị trí vẽ đường, điều đó phụ thuộc vào cách dữ liệu đang được sử dụng (lọc sắp xếp, v.v.).


và cũng mỗi chỉ số mất một số không gian cơ sở dữ liệu
Acanthus

@Acanthus: Ổ cứng nhỏ nhất hiện có được tính bằng gigabyte .
OMG Ponies

4
@OMG chứ không phải RAM như Brian chỉ ra. đó là không bao giờ là một ý tưởng tốt để lưu trữ nhiều hơn bạn cần. dữ liệu / index bộ nhớ đệm trong RAM, phương tiện sao lưu (phiên bản mà sẽ phù hợp với mỗi băng vv) đều bị ảnh hưởng bởi chỉ số vô dụng
RichardTheKiwi

9
Sự phong phú của một nguồn tài nguyên không có lý do gì để lãng phí hoặc kém hiệu quả.
Smandoli

6
Đúng, nhưng những hạn chế không còn như 10+ năm trước.
OMG Ponies

2

Việc lập chỉ mục sẽ chiếm nhiều không gian được phân bổ hơn cả từ ổ đĩa và ram, nhưng cũng cải thiện hiệu suất rất nhiều. Thật không may khi nó đạt đến giới hạn bộ nhớ, hệ thống sẽ nhường dung lượng ổ đĩa và gây rủi ro về hiệu suất. Trên thực tế, bạn không nên lập chỉ mục bất kỳ trường nào mà bạn có thể nghĩ rằng không liên quan đến bất kỳ loại thuật toán truyền dữ liệu nào, không chèn hay tìm kiếm (mệnh đề WHERE). Nhưng bạn nên làm nếu khác. Theo mặc định, bạn phải lập chỉ mục tất cả các trường. Các trường mà bạn nên xem xét hủy lập chỉ mục là nếu các truy vấn chỉ được sử dụng bởi người kiểm duyệt, trừ khi chúng cũng cần tốc độ


2

câu trả lời này là ý kiến ​​cá nhân của tôi dựa trên tôi đang sử dụng logic toán học của mình để trả lời

câu hỏi thứ hai là về nơi dừng lại của biên giới, Đầu tiên hãy làm một số phép tính toán học, giả sử chúng ta có N hàng với L trường trong bảng nếu chúng ta lập chỉ mục tất cả các trường, chúng ta sẽ nhận được L bảng chỉ mục mới trong đó mọi bảng sẽ sắp xếp theo Theo cách đầy đủ dữ liệu của trường chỉ mục, thoạt nhìn, nếu bảng của bạn có trọng số W thì nó sẽ trở thành W * 2 (1 tera sẽ trở thành 2 tera) nếu bạn có 100 bảng lớn (tôi đã làm việc trong dự án có số bảng là arround 1800 table) bạn sẽ lãng phí 100 lần không gian này (100 tera), điều này còn xa vời.

Nếu chúng tôi sẽ áp dụng các chỉ mục trong tất cả các bảng, chúng tôi sẽ phải nghĩ về các cập nhật chỉ mục là một cập nhật kích hoạt tất cả các cập nhật chỉ mục, đây là một lựa chọn tất cả tương đương không có thứ tự trong thời gian

từ điều này, tôi kết luận rằng bạn có trong trường hợp này rằng nếu bạn bỏ qua lần này thì tốt hơn là mất nó trong một lựa chọn hoặc cập nhật bởi vì nếu bạn chọn một trường không được lập chỉ mục, bạn sẽ không kích hoạt một lựa chọn khác trên tất cả các trường không được lập chỉ mục

những gì để lập chỉ mục?

khóa ngoại: là phải dựa trên

khóa chính: Tôi chưa chắc chắn về điều đó có thể là nếu ai đó đọc được điều này có thể giúp ích cho trường hợp này

các trường khác: câu trả lời tự nhiên đầu tiên là một nửa của các mục còn lại tại sao: nếu bạn nên lập chỉ mục nhiều hơn, bạn r không xa câu trả lời tốt nhất nếu bạn nên lập chỉ mục ít hơn, bạn cũng không xa vì chúng tôi biết rằng không có chỉ mục nào là xấu và tất cả được lập chỉ mục cũng tệ.

từ 3 ​​điểm này, tôi có thể kết luận rằng nếu chúng ta có L trường bao gồm K khóa thì giới hạn phải ở đâu đó gần ((L-K)/2)+Khơn hoặc ít hơn L / 10

câu trả lời này dựa trên logic và quan điểm cá nhân của tôi


1

Việc lập chỉ mục tất cả các cột trong bảng không phải là một ý kiến ​​hay. Trong khi điều này sẽ làm cho bảng đọc từ rất nhanh, nó cũng trở nên chậm hơn nhiều để ghi vào. Việc ghi vào một bảng có mọi cột được lập chỉ mục sẽ liên quan đến việc đặt bản ghi mới vào bảng đó và sau đó đưa thông tin của từng cột vào bảng chỉ mục của chính nó.


Tôi không chắc liệu nó có làm cho việc đọc bảng nhanh như chớp hay không, đặc biệt nếu bảng dữ liệu chỉ có 100MB nhưng index.table 300MB trở lên.
David

Tất cả những gì bạn nói đã được nêu trước đây.
Vael Victus
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.