2012-04-30 42 views
18

Tôi đã xem xét google nhưng không tìm thấy bất kỳ câu trả lời hay nào. Liệu nó lưu trữ dữ liệu trong một tập tin lớn? Những phương pháp nào nó sử dụng để làm cho truy cập dữ liệu nhanh hơn họ chỉ đọc và ghi vào một tập tin thông thường?Làm cách nào để lưu trữ dữ liệu MySQL

+2

Bạn có thể muốn xem xét các công cụ cơ sở dữ liệu khác nhau mà nó sử dụng. Một số lưu trữ dữ liệu trong một "tệp lớn" trong khi một số khác có trong bộ nhớ. Đối với tốc độ truy cập, nó sử dụng các cột và hàng có kích thước cố định, vì vậy việc truy cập vào một bản ghi cụ thể dễ dàng hơn việc quét tất cả văn bản. Nó cũng có thể giữ các chỉ mục của dữ liệu để làm cho truy xuất nhanh hơn. Công cụ mặc định và thường được sử dụng nhất là isam của tôi. Những người khác bao gồm inno-db và MEMORY. – gcochard

+0

@Greg nhưng ngay cả một bảng bộ nhớ được lưu trữ ở đâu đó để đảm bảo sự bền bỉ. Điểm mấu chốt là nó được lưu trữ ở đâu đó trên đĩa. – Namphibian

+0

Dữ liệu @Namphibian trong bảng bộ nhớ không liên tục, chỉ cấu trúc là – Cez

Trả lời

15

Có lưu trữ dữ liệu trong một tệp lớn không?

Một số DBMSes lưu trữ toàn bộ cơ sở dữ liệu trong một file duy nhất, một số bảng phân chia, chỉ số và các loại đối tượng khác để các tập tin riêng, một số chia tập tin không phải do đối tượng loại nhưng theo một tiêu chí lưu trữ/size thậm chí, một số có thể entirely bypass the file system, etc etc ...

Tôi không biết một trong những chiến lược này mà MySQL sử dụng (có thể phụ thuộc vào việc bạn sử dụng MyISAM so với InnoDB, v.v.), nhưng may thay, không quan trọng: từ quan điểm của khách hàng , đây là chi tiết triển khai DBMS mà khách hàng hiếm khi lo lắng.

Phương pháp nào sử dụng để truy cập dữ liệu nhanh hơn mà chỉ đọc và ghi vào tệp thông thường?

Trước hết, DBMses không chỉ là về hiệu suất:

  • Họ thậm chí còn thêm về an toàn dữ liệu của bạn - họ phải đảm bảo không có tham nhũng dữ liệu ngay cả khi đối mặt với một cắt điện hoặc lỗi mạng.
  • DBMS cũng khoảng đồng thời - chúng phải có trọng số giữa nhiều khách hàng truy cập và có khả năng sửa đổi cùng một dữ liệu.

Đối với câu hỏi cụ thể của bạn hoạt động, dữ liệu quan hệ là rất "nhạy cảm" để lập chỉ mục và clustering, được đa dạng khai thác bởi DBMSes để đạt được hiệu suất. Trên hết, bản chất dựa trên tập hợp của SQL cho phép DBMS chọn cách tối ưu để lấy dữ liệu (trong lý thuyết ít nhất, một số DBMS tốt hơn so với những người khác). Để biết thêm về hiệu suất DBMS, tôi nhiệt liệt khuyên bạn nên: Use The Index, Luke!

Ngoài ra, bạn có thể nhận thấy rằng hầu hết các DBMS là các sản phẩm khá cũ. Giống như thập kỷ cũ, điều thực sự là eons trong các thuật ngữ của ngành chúng tôi. Một hệ quả của điều đó là mọi người có rất nhiều thời gian để tối ưu hóa việc thoát khỏi cơ sở mã DBMS. Bạn có thể, về mặt lý thuyết, đạt được tất cả những thứ này thông qua các tệp, nhưng tôi nghi ngờ bạn sẽ kết thúc với thứ gì đó trông rất gần với DBMS (ngay cả khi bạn có thời gian và nguồn lực để thực sự làm điều đó). Vì vậy, tại sao phát minh lại bánh xe (trừ khi bạn không muốn bánh xe ở nơi đầu tiên;))?


Thông thường mặc dù một số loại "nhật ký" hoặc cơ chế "nhật ký giao dịch". Hơn nữa, để giảm thiểu xác suất tham nhũng "hợp lý" (do lỗi ứng dụng) và thúc đẩy tái sử dụng mã, hầu hết các DBMS hỗ trợ các ràng buộc khai báo (tên miền, khóa và tham chiếu), trình kích hoạt và các thủ tục được lưu trữ.

By isolating transactions và thậm chí bằng cách cho phép khách hàng để khóa một cách rõ ràng phần cụ thể của cơ sở dữ liệu.

1

Về mặt kỹ thuật, mọi thứ đều là "tệp" bao gồm thư mục .. toàn bộ ổ cứng của bạn là tệp khổng lồ. Có nói rằng, có cơ sở dữ liệu quan hệ, MySQL bao gồm lưu trữ dữ liệu trong một tập tin dữ liệu trên ổ đĩa cứng. Sự khác biệt giữa Cơ sở dữ liệu và ghi/đọc vào một tệp là táo và cam. Cơ sở dữ liệu cung cấp một cách có cấu trúc để lưu trữ và tìm kiếm/truy xuất dữ liệu theo cách bạn không bao giờ có thể sao chép bằng cách chỉ đọc và ghi vào một tệp .. Trừ khi bạn đã viết db của khóa học của mình ..

.

3

Khi bạn lưu trữ dữ liệu trong một tệp phẳng, nó nhỏ gọn và hiệu quả để đọc tuần tự, nhưng không có cách nào nhanh chóng để truy cập ngẫu nhiên. Điều này đặc biệt đúng với dữ liệu có độ dài thay đổi như tài liệu, tên hoặc chuỗi. Để cho phép truy cập ngẫu nhiên nhanh, hầu hết các cơ sở dữ liệu lưu trữ thông tin trong một tệp đơn bằng cách sử dụng cấu trúc dữ liệu được gọi là B-Tree. Cấu trúc này cho phép chèn, xóa và tìm kiếm nhanh, nhưng nó có thể sử dụng tới 50% không gian hơn tệp gốc. Thông thường, tuy nhiên, đây không phải là một vấn đề như không gian đĩa là giá rẻ và lớn hơn, trong khi các nhiệm vụ chính thường yêu cầu truy cập nhanh. Để biết thêm thông tin: http://en.wikipedia.org/wiki/B-tree

Nhìn kỹ vào tài liệu MySQL, chúng tôi thấy rằng các chỉ mục có thể được đặt tùy chọn thành loại "BTREE" hoặc "HASH". Bên trong một tệp MySQL duy nhất, nhiều chỉ mục được lưu trữ có thể sử dụng cấu trúc dữ liệu.

Mặc dù an toàn và đồng thời là quan trọng, đây không phải là lý do tại sao cơ sở dữ liệu tồn tại, nhưng các tính năng bổ sung. Các cơ sở dữ liệu đầu tiên tồn tại vì không thể truy cập ngẫu nhiên vào tệp tuần tự có chứa dữ liệu độ dài biến đổi.

3

Câu hỏi này hơi cũ nhưng tôi đã quyết định trả lời nó vì tôi đã thực hiện một số thao tác trên cùng một cách. Câu trả lời của tôi dựa trên hệ thống tập tin linux. Về cơ bản, mySQL lưu trữ dữ liệu trong các tệp trong đĩa cứng của bạn. Nó lưu trữ các tập tin trong một thư mục cụ thể có biến hệ thống "datadir". Mở bảng điều khiển mysql và chạy lệnh sau sẽ cho bạn biết chính xác vị trí của thư mục.

mysql> SHOW VARIABLES LIKE 'datadir'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.01 sec)

như bạn có thể nhìn thấy từ lệnh trên, tôi "datadir" được đặt tại /var/lib/mysql/. Vị trí của "datadir" có thể thay đổi trong các hệ thống khác nhau. Thư mục chứa các thư mục và một số tệp cấu hình. Mỗi thư mục đại diện cho một cơ sở dữ liệu mysql và chứa các tệp có dữ liệu cho cơ sở dữ liệu cụ thể đó. bên dưới là ảnh chụp màn hình của thư mục "datadir" trong hệ thống của tôi.

sample "datadir" directory screnshot

Mỗi thư mục trong thư mục thể hiện cơ sở dữ liệu mysql. Mỗi thư mục cơ sở dữ liệu chứa các tệp đại diện cho các bảng trong cơ sở dữ liệu đó. Có hai tệp cho mỗi bảng, một tệp có đuôi mở rộng là .frm và một tệp khác có phần mở rộng là .idb. Xem ảnh chụp màn hình bên dưới.

sample mysql database table screenshot

tập tin cửa hàng .frm bảng định dạng của bảng. kiểm tra ở đây để biết thông tin chi tiết MySQL .frm File Format

tệp .ibd lưu trữ dữ liệu của bảng.kiểm tra ở đây để biết thông tin chi tiết InnoDB File-Per-Table Tablespaces

Thats it folks! tôi hy vọng tôi đã giúp một ai đó.

Các vấn đề liên quan