Có bao nhiêu hàng trong cơ sở dữ liệu QUÁ NHIỀU?


87

Tôi có một bảng MySQL InnoDB với 1.000.000 bản ghi. Điều này có quá nhiều không? Hoặc cơ sở dữ liệu có thể xử lý điều này và hơn thế nữa? Tôi hỏi vì tôi nhận thấy rằng một số truy vấn (ví dụ: lấy hàng cuối cùng từ bảng) chậm hơn (giây) trong bảng có hàng 1 milon so với truy vấn có hàng 100.

Câu trả lời:


114

Tôi có một bảng MySQL InnoDB với 1000000 thanh ghi. Điều này có quá nhiều không?

Không, 1.000.000 hàng (bản ghi AKA) không phải là quá nhiều đối với cơ sở dữ liệu.

Tôi hỏi vì tôi nhận thấy rằng một số truy vấn (ví dụ: lấy đăng ký cuối cùng của một bảng) chậm hơn (giây) trong bảng có 1 triệu đăng ký so với trong một có 100.

Có rất nhiều điều để giải thích trong tuyên bố đó. Các nghi phạm thông thường là:

  1. Truy vấn viết kém
  2. Không sử dụng khóa chính, giả sử một khóa thậm chí tồn tại trên bảng
  3. Mô hình dữ liệu được thiết kế kém (cấu trúc bảng)
  4. Thiếu chỉ mục

4
5. Thông số máy chủ lỗi thời <Phương sách cuối cùng.
Sneakyness

19
@Brimstedt: Tôi cũng luôn nghĩ danh từ này phải là "Chỉ số", nhưng tôi không nghĩ là tôi đã từng thấy ai đó sử dụng nó cho cơ sở dữ liệu: từ Wikipedia: en.wikipedia.org/w/… đến ông Coding Horror: codinghorror. com / blog / archives / 000638.html . Có một bài đăng SO thú vị này về chủ đề: stackoverflow.com/questions/1001366 .
Daniel Vassallo

7
6. không đủ bộ nhớ phân bổ cho InnoDB là bộ nhớ đệm khác nhau
Jason

để có hiệu suất tốt hơn liệu tôi có phải sử dụng PrimaryKey không? Còn việc sử dụng các phím khác như Index, Unique thì sao? Tôi có thể sử dụng chúng không? cảm ơn
user1844933

Có lẽ máy tính được hogged lên với bộ nhớ như Jason nói và cắt đứt ở giữa của quá trình này
ytpillai

67

Tôi có một cơ sở dữ liệu với hơn 97.000.000 bản ghi ( 30GB datafile ) và không có vấn đề gì.

Chỉ cần nhớ xác định và cải thiện chỉ mục bảng của bạn .

Vì vậy, rõ ràng 1.000.000 không phải là NHIỀU! (Nhưng nếu bạn không lập chỉ mục; có, nó là NHIỀU)


10
Việc thêm "khóa chính" vào một cột (bằng cách chọn số tăng tự động) có được lập chỉ mục không?
Nathan

8
@Nathan, thực ra khi bạn gán một cột làm khóa chính, nó sẽ tự động được lập chỉ mục, nhưng mỗi bảng chỉ có thể có một khóa chính, nếu bạn cần thêm chỉ mục cho một số cột, để tối ưu hóa các truy vấn, hãy sử dụng stackoverflow.com/
dav

Tôi có bảng với một trilions nhưng việc chọn dữ liệu định dạng IN LIFO bị chậm?
Saurabh Chandra Patel,

Xác định không gặp sự cố. Truy vấn phức tạp nhất mất bao lâu? Chúng tôi có một bảng với 100 triệu hàng và khách hàng mong đợi các truy vấn được thực hiện tối đa trong 5 giây, bất kể họ sử dụng tiêu chí sắp xếp hoặc nhóm nào. Chỉ số của chúng tôi có thể được cải thiện nhưng trước khi chúng tôi khóa tất cả những gì cố gắng để thêm một chỉ số
Joe Yahchouchi

20% các bảng sản xuất (theo một nghiên cứu cũ) có nhiều hơn 1 triệu hàng. Tôi đã thấy một vài với hàng tỷ hàng.
Rick James,

19

Sử dụng 'giải thích' để kiểm tra truy vấn của bạn và xem có điều gì sai với kế hoạch truy vấn không.


6
Mặc dù đây là một ý tưởng hay, nhưng bản thân câu trả lời này không phù hợp để đưa ra cho một người mới. Kết quả từ GIẢI THÍCH không phải là rất trực quan ...
nickf

17
Không có công cụ nào khác để giúp bạn kiểm tra các truy vấn, vì vậy tốt hơn hãy bắt đầu học EXPLAIN- người mới hay không.
nos

30
sẽ rất tuyệt nếu ai đó có thể GIẢI THÍCH EXPLAIN ;)
Jo E.


15

Tôi nghĩ đây là một quan niệm sai lầm phổ biến - kích thước chỉ là một phần của phương trình khi nói đến khả năng mở rộng cơ sở dữ liệu. Có những vấn đề khác khó (hoặc khó hơn):

  • Tập hợp làm việc lớn như thế nào (tức là bao nhiêu dữ liệu cần được tải vào bộ nhớ và hoạt động tích cực). Nếu bạn chỉ chèn dữ liệu và sau đó không làm gì với nó, đó thực sự là một vấn đề dễ giải quyết.

  • Mức độ đồng thời được yêu cầu? Chỉ có một người dùng chèn / đọc hay chúng ta có hàng nghìn khách hàng hoạt động cùng một lúc?

  • Mức độ hứa hẹn / độ bền và tính nhất quán của hiệu suất được yêu cầu? Chúng ta có phải đảm bảo rằng chúng ta có thể tôn trọng từng cam kết. Có ổn không nếu giao dịch trung bình diễn ra nhanh chóng, hay chúng tôi muốn đảm bảo rằng tất cả các giao dịch đều nhanh đáng tin cậy (kiểm soát chất lượng sáu sigma như - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- và-sáu-sigma / ).

  • Bạn có cần thực hiện bất kỳ vấn đề hoạt động nào, chẳng hạn như ALTER lược đồ bảng? Trong InnoDB, điều này là có thể, nhưng cực kỳ chậm vì nó thường phải tạo một bảng tạm thời ở phía trước (chặn tất cả các kết nối).

Vì vậy, tôi sẽ nói rõ hai vấn đề hạn chế sẽ là:

  • Kỹ năng viết truy vấn của riêng bạn / có chỉ mục tốt.
  • Bạn có thể chịu đựng được bao nhiêu nỗi đau khi chờ đợi các câu lệnh ALTER TABLE.

2
Chỉnh sửa: Lời khuyên về ALTER TABLE tạo bảng tạm thời hơi cũ. MySQL 5.5 có khả năng tạo chỉ mục nhanh và 5.6 hiện có DDL trực tuyến.
Morgan Tocker

3

Nếu ý bạn là 1 triệu hàng, thì nó phụ thuộc vào cách lập chỉ mục của bạn được thực hiện và cấu hình phần cứng của bạn. Một triệu hàng không phải là một số lượng lớn đối với cơ sở dữ liệu doanh nghiệp, hoặc thậm chí là cơ sở dữ liệu dành cho nhà phát triển trên thiết bị tốt.

nếu ý bạn là 1 triệu cột (không chắc là có thể có trong MySQL) thì có, điều này có vẻ hơi lớn và có thể sẽ gây ra vấn đề.


3

Đăng ký? Ý bạn là ghi lại?

Một triệu bản ghi không phải là một vấn đề lớn đối với một cơ sở dữ liệu ngày nay. Nếu bạn gặp phải bất kỳ vấn đề nào, có thể không phải do hệ thống cơ sở dữ liệu mà là do phần cứng mà bạn đang chạy. Rất có thể bạn sẽ không gặp sự cố với DB trước khi hết phần cứng để xử lý nó.

Bây giờ, rõ ràng là một số truy vấn chậm hơn những truy vấn khác, nhưng nếu hai truy vấn rất giống nhau chạy trong thời gian rất khác nhau, bạn cần phải tìm ra kế hoạch thực thi của cơ sở dữ liệu là gì và tối ưu hóa cho nó, tức là sử dụng các chỉ mục chính xác, chuẩn hóa thích hợp, v.v.

Ngẫu nhiên, không có cái gọi là bản ghi "cuối cùng" trong một bảng, từ quan điểm logic chúng không có thứ tự cố hữu.


Tôi một cái gì đó có ý nghĩa như "SELECT * FROM tên_bảng ORDER BY id DESC LIMIT 0"
Juanjo Conti

4
Có thể bạn cần SELECT LAST_INSERT_ID()thay vì truy vấn đó.
True Soft

3

Tôi đã thấy các bảng không phân vùng với hàng tỷ bản ghi (được lập chỉ mục), tự kết hợp với nhau cho công việc phân tích. Cuối cùng chúng tôi đã phân vùng mọi thứ nhưng thành thật mà nói, chúng tôi không thấy sự khác biệt nhiều như vậy.

Điều đó nói rằng, đó là trong Oracle và tôi chưa kiểm tra khối lượng dữ liệu đó trong MySQL. Chỉ mục là bạn của bạn :)


2

Giả sử bạn có nghĩa là "bản ghi" bởi "thanh ghi" không, nó không quá nhiều, MySQL mở rộng quy mô thực sự tốt và có thể chứa nhiều bản ghi mà bạn có không gian trong đĩa cứng của mình.

Rõ ràng là mặc dù các truy vấn tìm kiếm sẽ chậm hơn. Thực sự không có cách nào khác ngoài việc đảm bảo rằng các trường được lập chỉ mục đúng cách.


2
Về mặt kỹ thuật, kích thước của bảng cũng có thể bị giới hạn bởi kích thước tệp tối đa của hệ thống tệp bạn đang sử dụng.
tster

0

Bảng càng lớn (càng có nhiều hàng trong đó), thì các truy vấn thường sẽ chạy chậm hơn nếu không có chỉ mục. Khi bạn thêm các chỉ mục phù hợp, hiệu suất truy vấn của bạn sẽ cải thiện hoặc ít nhất là không suy giảm nhiều khi bảng phát triển. Tuy nhiên, nếu bản thân truy vấn trả về nhiều hàng hơn khi bảng lớn hơn, thì bạn sẽ lại bắt đầu thấy sự xuống cấp.

Mặc dù 1 triệu hàng không phải là nhiều, nhưng nó cũng phụ thuộc vào lượng bộ nhớ bạn có trên máy chủ DB. Nếu bảng quá lớn để được máy chủ lưu trong bộ nhớ, thì các truy vấn sẽ chậm hơn.


0

Sử dụng truy vấn được cung cấp sẽ đặc biệt chậm vì sử dụng phương pháp hợp nhất sắp xếp để sắp xếp dữ liệu.

Tôi khuyên bạn nên xem xét lại thiết kế để bạn đang sử dụng các chỉ mục để truy xuất nó hoặc đảm bảo rằng nó đã được sắp xếp theo cách đó để không cần sắp xếp.

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.