Hướng dẫn how does mysql store data? - mysql lưu trữ dữ liệu như thế nào?

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

Một số DBMS lưu trữ toàn bộ cơ sở dữ liệu trong một tệp, một số bảng phân chia, chỉ mục và các loại đối tượng khác để tách các tệp, một số tệp phân chia không phải theo loại đối tượng mà theo một số tiêu chí lưu trữ/kích thước, một số thậm chí có thể bỏ qua hệ thống tệp, v.v. ...

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 có sử dụng myisam so với innodb, v.v.), nhưng may mắn thay, nó không quan trọng: Từ góc độ khách hàng, đây là một triển khai DBMS chi tiết máy khách hiếm khi lo lắng về.

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

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

  • Họ thậm chí còn nhiều hơn về sự an toàn của 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 việc cắt điện hoặc lỗi mạng.1safety of your data - they have to ensure there is no data corruption even in the face of a power cut or a network failure.1
  • DBMSE cũng là về đồng thời - họ phải trọng tài giữa nhiều ứng dụng truy cập và có khả năng sửa đổi cùng một dữ liệu.2concurrency - they have to arbiter between multiple clients accessing and potentially modifying the same data.2

Đối với câu hỏi cụ thể của bạn về hiệu suất, dữ liệu quan hệ rất "dễ bị" đối với việc lập chỉ mục và phân cụm, được các DBMS khai thác rất nhiều để đạt được hiệu suất. Trên hết, bản chất dựa trên SQL dựa trên đã cho phép DBM chọn cách tối ưu để truy xuất dữ liệu (về lý thuyết ít nhất, một số DBMS tốt hơn so với các loại khác). Để biết thêm về hiệu suất của DBMS, tôi nồng nhiệt giới thiệu: Sử dụng 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ư nhiều thập kỷ, đây thực sự là những điều trong ngành công nghiệp của chúng tôi. Một hậu quả của điều đó là mọi người đã có nhiều thời gian để tối ưu hóa cái quái khỏi cơ sở mã DBMS.

Về mặt lý thuyết, bạn có thể đạt được tất cả những điều này thông qua các tập tin, nhưng tôi nghi ngờ bạn sẽ kết thúc với một thứ gì đó trông cực kỳ gần với DBMS (ngay cả khi bạn có thời gian và tài nguyên để 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 ngay từ đầu;))?


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

2 Bằng cách cô lập các giao dịch và thậm chí bằng cách cho phép khách hàng khóa rõ ràng các phần cụ thể của cơ sở dữ liệu.

Chương & NBSP; 1. & NBSP; Kiến trúc và lịch sử MySQL

MySQL rất khác với các máy chủ cơ sở dữ liệu khác và các đặc điểm kiến ​​trúc của nó làm cho nó hữu ích cho một loạt các mục đích cũng như làm cho nó trở thành một lựa chọn kém cho người khác. MySQL không hoàn hảo, nhưng nó đủ linh hoạt để hoạt động tốt trong các môi trường rất khắt khe, chẳng hạn như các ứng dụng web. Đồng thời, MySQL có thể cung cấp năng lượng cho các ứng dụng nhúng, kho dữ liệu, phần mềm phân phối và lập chỉ mục nội dung, hệ thống dự phòng có sẵn cao, xử lý giao dịch trực tuyến (OLTP) và nhiều hơn nữa.

Để tận dụng tối đa từ MySQL, bạn cần hiểu thiết kế của nó để bạn có thể làm việc với nó, không chống lại nó. MySQL linh hoạt theo nhiều cách. Ví dụ: bạn có thể định cấu hình nó để chạy tốt trên một loạt các phần cứng và nó hỗ trợ nhiều loại dữ liệu. Tuy nhiên, tính năng quan trọng và bất thường nhất của MySQL là kiến ​​trúc động cơ lưu trữ, có thiết kế tách biệt xử lý truy vấn và các tác vụ máy chủ khác khỏi lưu trữ và truy xuất dữ liệu. Việc tách mối quan tâm này cho phép bạn chọn cách lưu trữ dữ liệu của bạn và hiệu suất, tính năng và các đặc điểm khác mà bạn muốn.

Chương này cung cấp một cái nhìn tổng quan cấp cao về kiến ​​trúc máy chủ MySQL, sự khác biệt chính giữa các công cụ lưu trữ và tại sao những khác biệt đó lại quan trọng. Chúng tôi sẽ kết thúc với một số bối cảnh lịch sử và điểm chuẩn. Chúng tôi đã cố gắng giải thích MySQL bằng cách đơn giản hóa các chi tiết và hiển thị các ví dụ. Cuộc thảo luận này sẽ hữu ích cho những máy chủ cơ sở dữ liệu mới cũng như các độc giả là chuyên gia với các máy chủ cơ sở dữ liệu khác.

Kiến trúc logic MySQL

Một bức tranh tinh thần tốt về cách các thành phần MySQL, hoạt động cùng nhau sẽ giúp bạn hiểu máy chủ. Hình & NBSP; 1-1 cho thấy một cái nhìn logic về kiến ​​trúc MySQL.

Lớp trên cùng chứa các dịch vụ không phải là duy nhất cho MySQL. Họ Dịch vụ hầu hết các công cụ hoặc máy chủ hoặc máy chủ dựa trên mạng cần: xử lý kết nối, xác thực, bảo mật, v.v.

Hướng dẫn how does mysql store data? - mysql lưu trữ dữ liệu như thế nào?

Hình & NBSP; 1-1. & NBSP; Một cái nhìn hợp lý của kiến ​​trúc máy chủ MySQL

Lớp thứ hai là nơi mọi thứ trở nên thú vị. Phần lớn bộ não MySQL, ở đây, bao gồm mã để phân tích cú pháp truy vấn, phân tích, tối ưu hóa, bộ đệm và tất cả các hàm tích hợp (ví dụ: ngày, thời gian, toán học và mã hóa). Bất kỳ chức năng nào được cung cấp trên các công cụ lưu trữ sống ở cấp độ này: ví dụ, các quy trình, kích hoạt và chế độ xem được lưu trữ.

Lớp thứ ba chứa các công cụ lưu trữ. Họ chịu trách nhiệm lưu trữ và truy xuất tất cả các dữ liệu được lưu trữ trong MYSQL. Giống như các hệ thống tập tin khác nhau có sẵn cho GNU/Linux, mỗi công cụ lưu trữ có những lợi ích và nhược điểm riêng. Máy chủ giao tiếp với họ thông qua API công cụ lưu trữ. Giao diện này che giấu sự khác biệt giữa các công cụ lưu trữ và làm cho chúng phần lớn trong suốt ở lớp truy vấn. API chứa một vài chục chức năng cấp thấp thực hiện các hoạt động như bắt đầu một giao dịch, hoặc tìm nạp hàng có khóa chính này. Các công cụ lưu trữ don lồng phân tích SQL [4] hoặc giao tiếp với nhau; Họ chỉ đơn giản trả lời các yêu cầu từ máy chủ.storage engine API. This interface hides differences between storage engines and makes them largely transparent at the query layer. The API contains a couple of dozen low-level functions that perform operations such as “begin a transaction” or “fetch the row that has this primary key.” The storage engines don’t parse SQL[4] or communicate with each other; they simply respond to requests from the server.

Quản lý kết nối và bảo mật

Mỗi kết nối máy khách có được luồng riêng trong quy trình máy chủ. Các truy vấn kết nối thực hiện trong một luồng duy nhất đó, từ đó nằm trên một lõi hoặc CPU. Các chủ đề của máy chủ lưu trữ, vì vậy chúng không cần phải được tạo và phá hủy cho mỗi kết nối mới. [5]

Khi máy khách (ứng dụng) kết nối với máy chủ MySQL, máy chủ cần xác thực chúng. Xác thực dựa trên tên người dùng, máy chủ có nguồn gốc và mật khẩu. Chứng chỉ X.509 cũng có thể được sử dụng trên kết nối SSL (Lớp ổ cắm bảo mật). Khi máy khách đã kết nối, máy chủ có xác minh xem máy khách có đặc quyền cho mỗi truy vấn hay không (ví dụ: liệu máy khách có được phép đưa ra câu lệnh

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
0 truy cập vào bảng
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
1 trong cơ sở dữ liệu
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
2 hay không).

Tối ưu hóa và thực hiện

MySQL phân tích các truy vấn để tạo cấu trúc bên trong (cây phân tích), và sau đó áp dụng một loạt các tối ưu hóa. Chúng có thể bao gồm viết lại truy vấn, xác định thứ tự sẽ đọc các bảng, chọn chỉ mục nào sẽ sử dụng, v.v. Bạn có thể chuyển các gợi ý cho trình tối ưu hóa thông qua các từ khóa đặc biệt trong truy vấn, ảnh hưởng đến quá trình ra quyết định của nó. Bạn cũng có thể yêu cầu máy chủ giải thích các khía cạnh khác nhau của tối ưu hóa. Điều này cho bạn biết những quyết định mà máy chủ đang đưa ra và cung cấp cho bạn một điểm tham chiếu để làm lại các truy vấn, lược đồ và cài đặt để làm cho mọi thứ chạy hiệu quả nhất có thể. Chúng tôi thảo luận về trình tối ưu hóa chi tiết hơn trong Chương & NBSP; 6.

Trình tối ưu hóa không thực sự quan tâm đến những gì công cụ lưu trữ mà một bảng cụ thể sử dụng, nhưng công cụ lưu trữ không ảnh hưởng đến cách máy chủ tối ưu hóa truy vấn. Trình tối ưu hóa yêu cầu công cụ lưu trữ về một số khả năng của nó và chi phí cho các hoạt động nhất định và cho số liệu thống kê trên dữ liệu bảng. Chẳng hạn, một số công cụ lưu trữ hỗ trợ các loại chỉ mục có thể hữu ích cho các truy vấn nhất định. Bạn có thể đọc thêm về Tối ưu hóa lập chỉ mục và Lược đồ trong Chương & NBSP; 4 và Chương & NBSP; 5.

Tuy nhiên, trước khi phân tích các truy vấn, máy chủ sẽ tham khảo bộ đệm truy vấn, chỉ có thể lưu trữ các câu lệnh ____10, cùng với các bộ kết quả của chúng. Nếu bất cứ ai phát hành một truy vấn mà giống hệt với một trong bộ đệm, thì máy chủ không cần phải phân tích, tối ưu hóa hoặc thực hiện truy vấn tại tất cả, nó có thể chỉ cần truyền lại tập kết quả được lưu trữ. Chúng tôi viết thêm về điều đó trong Chương & nbsp; 7.

Đồng thời kiểm soát

Bất cứ lúc nào có nhiều hơn một truy vấn cần thay đổi dữ liệu cùng một lúc, vấn đề kiểm soát đồng thời phát sinh. Đối với mục đích của chúng tôi trong chương này, MySQL phải thực hiện việc này ở hai cấp độ: cấp độ máy chủ và cấp độ động cơ lưu trữ. Kiểm soát đồng thời là một chủ đề lớn trong đó một cơ quan lớn của văn học lý thuyết được dành, vì vậy chúng tôi sẽ chỉ cung cấp cho bạn một cái nhìn tổng quan đơn giản về cách MySQL đối phó với các độc giả và nhà văn đồng thời, vì vậy bạn có bối cảnh bạn cần cho phần còn lại của chương này.

Chúng tôi sẽ sử dụng một hộp email trên một hệ thống Unix làm ví dụ. Định dạng tệp Mbox cổ điển rất đơn giản. Tất cả các tin nhắn trong hộp thư Mbox được nối với nhau, từng người một. Điều này làm cho nó rất dễ đọc và phân tích các tin nhắn thư. Nó cũng làm cho việc gửi thư dễ dàng: Chỉ cần nối một tin nhắn mới vào cuối tệp.mbox file format is very simple. All the messages in an mbox mailbox are concatenated together, one after another. This makes it very easy to read and parse mail messages. It also makes mail delivery easy: just append a new message to the end of the file.

Nhưng điều gì xảy ra khi hai quy trình cố gắng gửi tin nhắn cùng một lúc cho cùng một hộp thư? Rõ ràng điều đó có thể làm hỏng hộp thư, để lại hai tin nhắn xen kẽ ở cuối tệp hộp thư. Các hệ thống gửi thư được cư xử tốt sử dụng khóa để ngăn chặn tham nhũng. Nếu khách hàng thử giao hàng thứ hai trong khi hộp thư bị khóa, họ phải chờ để có được khóa trước khi gửi tin nhắn của nó.

Chương trình này hoạt động hợp lý trong thực tế, nhưng nó không hỗ trợ cho sự đồng thời. Bởi vì chỉ có một quy trình duy nhất có thể thay đổi hộp thư tại bất kỳ thời điểm nào, nên cách tiếp cận này trở thành vấn đề với hộp thư có khối lượng lớn.

Đọc/Viết khóa

Đọc từ hộp thư không phải là rắc rối. Không có gì sai với nhiều khách hàng đọc cùng một hộp thư; Bởi vì họ không thực hiện thay đổi, không có gì có khả năng đi sai. Nhưng điều gì xảy ra nếu ai đó cố gắng xóa tin nhắn số 25 trong khi các chương trình đang đọc hộp thư? Nó phụ thuộc, nhưng một người đọc có thể đi ra với một cái nhìn bị hỏng hoặc không nhất quán của hộp thư. Vì vậy, để được an toàn, thậm chí đọc từ hộp thư đòi hỏi phải được chăm sóc đặc biệt.

Nếu bạn nghĩ về hộp thư như một bảng cơ sở dữ liệu và mỗi tin nhắn thư như một hàng, thì thật dễ dàng để thấy rằng vấn đề là giống nhau trong bối cảnh này. Theo nhiều cách, một hộp thư thực sự chỉ là một bảng cơ sở dữ liệu đơn giản. Sửa đổi các hàng trong bảng cơ sở dữ liệu rất giống với việc xóa hoặc thay đổi nội dung của tin nhắn trong tệp hộp thư.

Giải pháp cho vấn đề cổ điển về kiểm soát đồng thời này khá đơn giản. Các hệ thống liên quan đến truy cập đọc/ghi đồng thời thường thực hiện một hệ thống khóa bao gồm hai loại khóa. Các khóa này thường được gọi là khóa được chia sẻ và khóa độc quyền, hoặc đọc khóa và ghi khóa.shared locks and exclusive locks, or read locks and write locks.

Không phải lo lắng về công nghệ khóa thực tế, chúng ta có thể mô tả khái niệm như sau. Đọc khóa trên một tài nguyên được chia sẻ hoặc không chặn lẫn nhau: nhiều máy khách có thể đọc từ một tài nguyên cùng một lúc và không can thiệp lẫn nhau. Viết khóa, mặt khác, là độc quyền, tức là, chúng chặn cả hai khóa đọc và khóa ghi khác vì chính sách an toàn duy nhất là có một khách hàng ghi vào tài nguyên tại một thời điểm và để ngăn chặn tất cả đang viết.

Trong thế giới cơ sở dữ liệu, khóa xảy ra mọi lúc: MySQL phải ngăn một máy khách đọc một đoạn dữ liệu trong khi một ứng dụng khác đang thay đổi nó. Nó thực hiện quản lý khóa này trong nội bộ theo cách minh bạch phần lớn thời gian.

Khóa độ chi tiết

Một cách để cải thiện sự đồng thời của một tài nguyên được chia sẻ là chọn lọc hơn về những gì bạn khóa. Thay vì khóa toàn bộ tài nguyên, chỉ khóa phần chứa dữ liệu bạn cần thay đổi. Tốt hơn nữa, chỉ khóa phần chính xác của dữ liệu bạn dự định thay đổi. Giảm thiểu lượng dữ liệu mà bạn khóa bất cứ lúc nào cho phép các thay đổi đối với một tài nguyên nhất định xảy ra đồng thời, miễn là chúng không xung đột với nhau.

Vấn đề là khóa tiêu thụ tài nguyên. Mỗi hoạt động khóa, nhận được khóa, kiểm tra xem liệu khóa có miễn phí hay không, phát hành khóa, v.v. Nếu hệ thống dành quá nhiều thời gian để quản lý khóa thay vì lưu trữ và truy xuất dữ liệu, hiệu suất có thể bị ảnh hưởng.

Chiến lược khóa là một sự thỏa hiệp giữa chi phí khóa và an toàn dữ liệu, và sự thỏa hiệp ảnh hưởng đến hiệu suất. Hầu hết các máy chủ cơ sở dữ liệu thương mại don don cung cấp cho bạn nhiều sự lựa chọn: bạn có được cái được gọi là khóa cấp hàng trong bảng của bạn, với nhiều cách thường phức tạp để mang lại hiệu suất tốt với nhiều khóa.

MySQL, mặt khác, cung cấp các lựa chọn. Động cơ lưu trữ của nó có thể thực hiện các chính sách khóa của riêng họ và khóa hạt. Quản lý khóa là một quyết định rất quan trọng trong thiết kế công cụ lưu trữ; Khắc phục mức độ chi tiết ở một mức độ nhất định có thể mang lại hiệu suất tốt hơn cho các mục đích sử dụng nhất định, nhưng làm cho động cơ đó ít phù hợp hơn cho các mục đích khác. Bởi vì MySQL cung cấp nhiều công cụ lưu trữ, nên nó không yêu cầu một giải pháp đa năng duy nhất. Hãy để một cái nhìn về hai chiến lược khóa quan trọng nhất.

Khóa bàn

Chiến lược khóa cơ bản nhất có sẵn trong MySQL và một chiến lược có chi phí thấp nhất, là khóa bàn. Một khóa bảng tương tự như khóa hộp thư được mô tả trước đó: nó khóa toàn bộ bảng. Khi một khách hàng muốn ghi vào một bảng (chèn, xóa, cập nhật, v.v.), nó sẽ có được một khóa ghi. Điều này giữ cho tất cả các hoạt động đọc và viết khác. Khi không có ai viết, độc giả có thể có được ổ khóa đọc, mà không phải là xung đột với các khóa đọc khác.table locks. A table lock is analogous to the mailbox locks described earlier: it locks the entire table. When a client wishes to write to a table (insert, delete, update, etc.), it acquires a write lock. This keeps all other read and write operations at bay. When nobody is writing, readers can obtain read locks, which don’t conflict with other read locks.

Khóa bảng có các biến thể cho hiệu suất tốt trong các tình huống cụ thể. Ví dụ: khóa bảng

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
4 cho phép một số loại hoạt động ghi đồng thời. Khóa ghi cũng có mức độ ưu tiên cao hơn so với khóa đọc, vì vậy yêu cầu khóa ghi sẽ tiến lên phía trước hàng đợi khóa ngay cả khi người đọc đã ở trong hàng đợi (khóa ghi có thể vượt qua các khóa đọc trong hàng đợi, nhưng đọc khóa không thể tiến qua khóa ghi trong quá khứ).

Mặc dù các công cụ lưu trữ có thể quản lý khóa của riêng họ, chính MySQL cũng sử dụng nhiều loại khóa có mức độ bảng hiệu quả cho các mục đích khác nhau. Chẳng hạn, máy chủ sử dụng khóa cấp bảng cho các câu lệnh như

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
5, bất kể công cụ lưu trữ.

Khóa hàng

Phong cách khóa cung cấp sự đồng thời lớn nhất (và mang chi phí cao nhất) là sử dụng khóa hàng. Khóa cấp độ hàng, vì chiến lược này thường được biết đến, có sẵn trong các công cụ lưu trữ Innodb và Xtradb, trong số các công cụ khác. Khóa hàng được triển khai trong công cụ lưu trữ, không phải máy chủ (tham khảo lại sơ đồ kiến ​​trúc logic nếu bạn cần). Máy chủ hoàn toàn không biết về các khóa được triển khai trong các công cụ lưu trữ và như bạn sẽ thấy sau trong chương này và trong suốt cuốn sách, các công cụ lưu trữ đều thực hiện khóa theo cách riêng của chúng.row locks. Row-level locking, as this strategy is commonly known, is available in the InnoDB and XtraDB storage engines, among others. Row locks are implemented in the storage engine, not the server (refer back to the logical architecture diagram if you need to). The server is completely unaware of locks implemented in the storage engines, and as you’ll see later in this chapter and throughout the book, the storage engines all implement locking in their own ways.

Giao dịch

Bạn có thể kiểm tra các tính năng nâng cao hơn của hệ thống cơ sở dữ liệu rất lâu trước khi các giao dịch nhập kết hợp. Một giao dịch là một nhóm các truy vấn SQL được xử lý nguyên tử, như một đơn vị công việc. Nếu công cụ cơ sở dữ liệu có thể áp dụng toàn bộ nhóm truy vấn vào cơ sở dữ liệu, thì nó sẽ như vậy, nhưng nếu bất kỳ ai trong số họ có thể được thực hiện vì sự cố hoặc lý do khác, không ai trong số chúng được áp dụng. Đó là tất cả hoặc không có gì.transactions enter the mix. A transaction is a group of SQL queries that are treated atomically, as a single unit of work. If the database engine can apply the entire group of queries to a database, it does so, but if any of them can’t be done because of a crash or other reason, none of them is applied. It’s all or nothing.

Ít của phần này là cụ thể cho MySQL. Nếu bạn đã quen thuộc với các giao dịch axit, vui lòng bỏ qua các giao dịch trong MySQL.

Một ứng dụng ngân hàng là ví dụ kinh điển về lý do tại sao các giao dịch là cần thiết. Hãy tưởng tượng một cơ sở dữ liệu ngân hàng với hai bảng:

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
6 và
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
7. Để chuyển 200 đô la từ tài khoản kiểm tra Jane Jane sang tài khoản tiết kiệm của cô ấy, bạn cần thực hiện ít nhất ba bước:

  1. Hãy chắc chắn rằng số dư tài khoản kiểm tra của cô ấy lớn hơn 200 đô la.

  2. Trừ $ 200 từ số dư tài khoản kiểm tra của cô.

  3. Thêm 200 đô la vào số dư tài khoản tiết kiệm của cô ấy.

Toàn bộ hoạt động nên được kết thúc trong một giao dịch để nếu bất kỳ một trong các bước thất bại, bất kỳ bước hoàn thành nào cũng có thể được cuộn trở lại.

Bạn bắt đầu một giao dịch với câu lệnh

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
8 và sau đó thực hiện các thay đổi của nó vĩnh viễn với
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
9 hoặc loại bỏ các thay đổi với
START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
0. Vì vậy, SQL cho giao dịch mẫu của chúng tôi có thể trông như thế này:

1   START TRANSACTION;
2   SELECT balance FROM checking WHERE customer_id = 10233276;
3   UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4   UPDATE savings  SET balance = balance + 200.00 WHERE customer_id = 10233276;
5   COMMIT;

Nhưng một mình giao dịch không phải là toàn bộ câu chuyện. Điều gì xảy ra nếu máy chủ cơ sở dữ liệu gặp sự cố trong khi thực hiện dòng 4? Ai biết? Khách hàng có lẽ chỉ mất 200 đô la. Và điều gì sẽ xảy ra nếu một quy trình khác xuất hiện giữa các dòng 3 và 4 và loại bỏ toàn bộ số dư tài khoản kiểm tra? Ngân hàng đã cho khách hàng một khoản tín dụng 200 đô la mà không hề biết.

Giao dịch aren đủ trừ khi hệ thống vượt qua thử nghiệm axit. Axit là viết tắt của tính nguyên tử, tính nhất quán, cách ly và độ bền. Đây là những tiêu chí liên quan chặt chẽ mà một hệ thống xử lý giao dịch có hành vi tốt phải đáp ứng:ACID test. ACID stands for Atomicity, Consistency, Isolation, and Durability. These are tightly related criteria that a well-behaved transaction processing system must meet:

Tính nguyên tử

Một giao dịch phải hoạt động như một đơn vị công việc không thể chia cắt để toàn bộ giao dịch được áp dụng hoặc quay trở lại. Khi các giao dịch là nguyên tử, không có thứ gọi là một giao dịch hoàn thành một phần: đó là tất cả hoặc không có gì.

Tính nhất quán

Cơ sở dữ liệu phải luôn luôn chuyển từ trạng thái nhất quán sang trạng thái tiếp theo. Trong ví dụ của chúng tôi, tính nhất quán đảm bảo rằng một sự cố giữa các dòng 3 và 4 không dẫn đến 200 đô la biến mất khỏi tài khoản kiểm tra. Bởi vì giao dịch không bao giờ được thực hiện, không có thay đổi nào trong số các thay đổi giao dịch được phản ánh trong cơ sở dữ liệu.

Sự cách ly

Kết quả của một giao dịch thường vô hình với các giao dịch khác cho đến khi giao dịch hoàn tất. Điều này đảm bảo rằng nếu một bản tóm tắt tài khoản ngân hàng chạy theo dòng 3 nhưng trước dòng 4 trong ví dụ của chúng tôi, nó vẫn sẽ thấy 200 đô la trong tài khoản kiểm tra. Khi chúng tôi thảo luận về mức độ cô lập, bạn sẽ hiểu lý do tại sao chúng tôi nói thường vô hình.usually invisible.

Độ bền

Sau khi cam kết, một giao dịch thay đổi là vĩnh viễn. Điều này có nghĩa là các thay đổi phải được ghi lại sao cho dữ liệu won bị mất trong một sự cố hệ thống. Độ bền là một khái niệm hơi mờ, tuy nhiên, bởi vì thực sự có nhiều cấp độ. Một số chiến lược độ bền cung cấp đảm bảo an toàn mạnh mẽ hơn các chiến lược khác và không có gì bền 100% (nếu bản thân cơ sở dữ liệu thực sự bền, thì làm thế nào sao lưu có thể tăng độ bền?). Chúng tôi thảo luận về độ bền thực sự có nghĩa là gì trong MySQL trong các chương sau.really means in MySQL in later chapters.

Giao dịch axit đảm bảo rằng các ngân hàng không mất tiền của bạn. Nói chung là vô cùng khó khăn hoặc không thể làm điều này với logic ứng dụng. Một máy chủ cơ sở dữ liệu tuân thủ axit phải làm tất cả các loại điều phức tạp mà bạn có thể không nhận ra để cung cấp bảo đảm axit.

Giống như với độ chi tiết của khóa tăng lên, nhược điểm của bảo mật bổ sung này là máy chủ cơ sở dữ liệu phải làm nhiều công việc hơn. Một máy chủ cơ sở dữ liệu với các giao dịch axit cũng thường yêu cầu nhiều năng lượng, bộ nhớ và không gian đĩa hơn một giao dịch mà không có chúng. Như chúng tôi đã nói nhiều lần, đây là nơi kiến ​​trúc động cơ lưu trữ MySQL, hoạt động theo lợi thế của bạn. Bạn có thể quyết định xem ứng dụng của bạn có cần giao dịch hay không. Nếu bạn không thực sự cần chúng, bạn có thể có được hiệu suất cao hơn với một công cụ lưu trữ không chuyển tiếp cho một số loại truy vấn. Bạn có thể sử dụng

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
1 để cung cấp mức độ bảo vệ bạn cần mà không cần giao dịch. Tuỳ bạn.

Mức độ cô lập

Sự cô lập phức tạp hơn vẻ ngoài của nó. Tiêu chuẩn SQL xác định bốn cấp độ cô lập, với các quy tắc cụ thể về các thay đổi và có thể nhìn thấy trong và ngoài giao dịch. Mức cách cô lập thấp hơn thường cho phép đồng thời cao hơn và có chi phí thấp hơn.

Ghi chú

Mỗi công cụ lưu trữ thực hiện các mức cách ly hơi khác nhau và chúng không nhất thiết phải phù hợp với những gì bạn có thể mong đợi nếu bạn đã quen với một sản phẩm cơ sở dữ liệu khác (do đó, chúng tôi đã giành được chi tiết đầy đủ trong phần này). Bạn nên đọc hướng dẫn sử dụng cho bất kỳ công cụ lưu trữ nào bạn quyết định sử dụng.

Hãy để một cái nhìn nhanh về bốn cấp độ cô lập:

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
2

Trong mức cách ly

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
3, các giao dịch có thể xem kết quả của các giao dịch không được cam kết. Ở cấp độ này, nhiều vấn đề có thể xảy ra trừ khi bạn thực sự, thực sự biết những gì bạn đang làm và có một lý do chính đáng để làm điều đó. Mức này hiếm khi được sử dụng trong thực tế, bởi vì hiệu suất của nó không tốt hơn nhiều so với các cấp độ khác, có nhiều lợi thế. Đọc dữ liệu không cam kết còn được gọi là đọc bẩn.dirty read.

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
4

Mức cách ly mặc định cho hầu hết các hệ thống cơ sở dữ liệu (nhưng không phải MySQL!) Là

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
5. Nó đáp ứng định nghĩa đơn giản về sự cô lập được sử dụng trước đó: một giao dịch sẽ chỉ thấy những thay đổi được thực hiện bởi các giao dịch đã được thực hiện khi nó bắt đầu và những thay đổi của nó đã được hiển thị cho người khác cho đến khi nó cam kết. Cấp độ này vẫn cho phép những gì được gọi là đọc không thể lặp lại. Điều này có nghĩa là bạn có thể chạy cùng một câu lệnh hai lần và xem dữ liệu khác nhau.nonrepeatable read. This means you can run the same statement twice and see different data.

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
6

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
6 giải quyết các vấn đề mà
START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
3 cho phép. Nó đảm bảo rằng bất kỳ hàng nào mà một giao dịch đọc sẽ trông giống nhau trong các lần đọc tiếp theo trong cùng một giao dịch, nhưng trên lý thuyết, nó vẫn cho phép một vấn đề khó khăn khác: Phantom đọc. Nói một cách đơn giản, một bài đọc Phantom có ​​thể xảy ra khi bạn chọn một số hàng, một giao dịch khác chèn một hàng mới vào phạm vi và sau đó bạn chọn cùng một phạm vi; Sau đó, bạn sẽ thấy hàng mới Phantom Phantom. Innodb và XTRADB giải quyết vấn đề đọc Phantom với kiểm soát đồng thời đa dạng, mà chúng tôi giải thích sau trong chương này.phantom reads. Simply put, a phantom read can happen when you select some range of rows, another transaction inserts a new row into the range, and then you select the same range again; you will then see the new “phantom” row. InnoDB and XtraDB solve the phantom read problem with multiversion concurrency control, which we explain later in this chapter.

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
6 là mức cách ly giao dịch mặc định của MySQL.

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
0

Mức độ cô lập cao nhất,

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
0, giải quyết vấn đề đọc bóng ma bằng cách buộc các giao dịch phải được đặt hàng để họ có thể xung đột có thể xảy ra. Tóm lại,
mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
0 đặt một khóa trên mỗi hàng nó đọc. Ở cấp độ này, rất nhiều thời gian chờ và tranh chấp khóa có thể xảy ra. Chúng tôi hiếm khi thấy mọi người sử dụng mức độ cô lập này, nhưng nhu cầu của ứng dụng của bạn có thể buộc bạn phải chấp nhận sự đồng thời giảm để có lợi cho sự ổn định dữ liệu mà kết quả.

Bảng & NBSP; 1-1 tóm tắt các mức cách ly khác nhau và các nhược điểm liên quan đến từng mức.

Bảng & NBSP; 1-1. & NBSP; Mức cách cô lập ANSI SQL

Mức độ cô lập

Dirty đọc có thể

Không thể lặp lại đọc có thể

Phantom đọc có thể

Khóa đọc

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
2

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
4

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
4

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
4

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
4

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
4

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
4

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
6

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
4

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
0

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
7

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
4

Bế tắc

Một bế tắc là khi hai hoặc nhiều giao dịch được giữ lẫn nhau và yêu cầu khóa trên cùng một tài nguyên, tạo ra một chu kỳ phụ thuộc. Khai mê xảy ra khi các giao dịch cố gắng khóa tài nguyên theo một thứ tự khác. Chúng có thể xảy ra bất cứ khi nào nhiều giao dịch khóa cùng một tài nguyên. Ví dụ: hãy xem xét hai giao dịch này chạy trên bảng

mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
3:deadlock is when two or more transactions are mutually holding and requesting locks on the same resources, creating a cycle of dependencies. Deadlocks occur when transactions try to lock resources in a different order. They can happen whenever multiple transactions lock the same resources. For example, consider these two transactions running against the
mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
3 table:

Giao dịch số 1 ________ 1Transaction #2 ________ 2

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
Transaction #2
START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;

Nếu bạn không may mắn, mỗi giao dịch sẽ thực hiện truy vấn đầu tiên và cập nhật một hàng dữ liệu, khóa nó trong quy trình. Mỗi giao dịch sau đó sẽ cố gắng cập nhật hàng thứ hai của nó, chỉ để thấy rằng nó đã bị khóa. Hai giao dịch sẽ chờ đợi nhau mãi mãi để hoàn thành, trừ khi một cái gì đó can thiệp để phá vỡ bế tắc.

Để chống lại vấn đề này, các hệ thống cơ sở dữ liệu thực hiện các hình thức phát hiện bế tắc và thời gian chờ khác nhau. Các hệ thống tinh vi hơn, chẳng hạn như công cụ lưu trữ Innodb, sẽ nhận thấy các phụ thuộc tròn và trả lại lỗi ngay lập tức. Đây có thể là một điều tốt, nếu không, bế tắc sẽ thể hiện bản thân như những truy vấn rất chậm. Những người khác sẽ từ bỏ sau khi truy vấn vượt quá thời gian chờ đợi khóa, điều này không phải lúc nào cũng tốt. Cách mà Innodb hiện xử lý các bế tắc là để quay lại giao dịch có ít khóa hàng độc quyền nhất (một số liệu gần đúng sẽ là dễ dàng nhất để quay trở lại).

Hành vi khóa và thứ tự là cụ thể của Công cụ lưu trữ, vì vậy một số công cụ lưu trữ có thể bị bế tắc trên một chuỗi các câu lệnh nhất định mặc dù những người khác đã giành chiến thắng. Các bế tắc có tính chất kép: một số không thể tránh khỏi vì xung đột dữ liệu thực sự và một số được gây ra bởi cách thức hoạt động của công cụ lưu trữ.

Các bế tắc không thể bị phá vỡ mà không cần quay lại một trong các giao dịch, một phần hoặc toàn bộ. Chúng là một thực tế của cuộc sống trong các hệ thống giao dịch và các ứng dụng của bạn nên được thiết kế để xử lý chúng. Nhiều ứng dụng chỉ có thể thử lại các giao dịch của họ ngay từ đầu.

Ghi nhật ký giao dịch

Ghi nhật ký giao dịch giúp giao dịch hiệu quả hơn. Thay vì cập nhật các bảng trên đĩa mỗi khi thay đổi xảy ra, công cụ lưu trữ có thể thay đổi bản sao trong bộ nhớ của dữ liệu. Điều này rất nhanh. Công cụ lưu trữ sau đó có thể viết một bản ghi về thay đổi vào nhật ký giao dịch, trên đĩa và do đó bền. Đây cũng là một hoạt động tương đối nhanh, bởi vì các sự kiện nhật ký nối liền liên quan đến I/O tuần tự trong một khu vực nhỏ của đĩa thay vì I/O ngẫu nhiên ở nhiều nơi. Sau đó, sau đó, một quy trình có thể cập nhật bảng trên đĩa. Do đó, hầu hết các công cụ lưu trữ sử dụng kỹ thuật này (được gọi là ghi nhật ký trước ghi) cuối cùng viết các thay đổi thành đĩa hai lần.write-ahead logging) end up writing the changes to disk twice.

Nếu có một sự cố sau khi bản cập nhật được ghi vào nhật ký giao dịch nhưng trước khi các thay đổi được thực hiện cho chính dữ liệu, công cụ lưu trữ vẫn có thể khôi phục các thay đổi khi khởi động lại. Phương pháp phục hồi khác nhau giữa các công cụ lưu trữ.

Giao dịch trong MySQL

MySQL cung cấp hai công cụ lưu trữ giao dịch: cụm Innodb và NDB. Một số động cơ của bên thứ ba cũng có sẵn; Các động cơ nổi tiếng nhất hiện nay là XTRADB và PBXT. Chúng tôi thảo luận về một số thuộc tính cụ thể của từng động cơ trong phần tiếp theo.

AutoCommit

MySQL hoạt động ở chế độ

mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
4 theo mặc định. Điều này có nghĩa là trừ khi bạn đã bắt đầu một giao dịch một cách rõ ràng, nó sẽ tự động thực thi từng truy vấn trong một giao dịch riêng. Bạn có thể bật hoặc vô hiệu hóa
mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
4 cho kết nối hiện tại bằng cách đặt một biến:

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;

Các giá trị

mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
6 và
mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
7 là tương đương, cũng như
mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
8 và
mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
9. Khi bạn chạy với
mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
4
mysql> SELECT COUNT(*) FROM table;
1, bạn luôn tham gia một giao dịch, cho đến khi bạn phát hành
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
9 hoặc
START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
0. MySQL sau đó bắt đầu một giao dịch mới ngay lập tức. Thay đổi giá trị của
mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
4 không có tác dụng đối với các bảng không chuyển hóa, chẳng hạn như myisam hoặc bảng bộ nhớ, không có khái niệm cam kết hoặc quay lại thay đổi.

Một số lệnh, khi được ban hành trong một giao dịch mở, khiến MySQL thực hiện giao dịch trước khi chúng thực hiện. Đây thường là các lệnh ngôn ngữ định nghĩa dữ liệu (DDL) tạo ra những thay đổi đáng kể, chẳng hạn như

mysql> SELECT COUNT(*) FROM table;
5, nhưng
mysql> SELECT COUNT(*) FROM table;
6 và một số câu khác cũng có hiệu ứng này. Kiểm tra tài liệu phiên bản của bạn để biết danh sách đầy đủ các lệnh tự động thực hiện giao dịch.

MySQL cho phép bạn đặt mức cách ly bằng lệnh

mysql> SELECT COUNT(*) FROM table;
7, có hiệu lực khi giao dịch tiếp theo bắt đầu. Bạn có thể đặt mức cách ly cho toàn bộ máy chủ trong tệp cấu hình hoặc chỉ cho phiên của bạn:

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

MySQL nhận ra tất cả bốn mức cách ly tiêu chuẩn ANSI và InnoDB hỗ trợ tất cả chúng.

Trộn các công cụ lưu trữ trong giao dịch

MySQL không quản lý các giao dịch ở cấp độ máy chủ. Thay vào đó, các công cụ lưu trữ cơ bản thực hiện các giao dịch. Điều này có nghĩa là bạn có thể kết hợp đáng tin cậy các động cơ khác nhau trong một giao dịch.

Nếu bạn trộn các bảng giao dịch và không chuyển giao (ví dụ, bảng Innodb và Myisam) trong một giao dịch, giao dịch sẽ hoạt động đúng nếu mọi việc suôn sẻ.

Tuy nhiên, nếu cần phải khôi phục, những thay đổi đối với bảng không chuyển thể có thể được hoàn tác. Điều này để lại cơ sở dữ liệu ở trạng thái không nhất quán mà từ đó có thể khó khôi phục và hiển thị toàn bộ điểm giao dịch. Đây là lý do tại sao nó thực sự quan trọng để chọn công cụ lưu trữ phù hợp cho mỗi bảng.

MySQL thường sẽ không cảnh báo bạn hoặc đưa ra lỗi nếu bạn thực hiện các hoạt động giao dịch trên bảng không chuyển tiếp. Đôi khi, quay lại một giao dịch sẽ tạo ra cảnh báo Một số bảng thay đổi không chuyển tiếp không thể được cuộn trở lại, nhưng hầu hết thời gian, bạn sẽ không có dấu hiệu nào cho thấy bạn làm việc với các bảng không chuyển tiếp.

Khóa ngầm và rõ ràng

Innodb sử dụng giao thức khóa hai pha. Nó có thể có được ổ khóa bất cứ lúc nào trong một giao dịch, nhưng nó không giải phóng chúng cho đến khi

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
9 hoặc
START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
0. Nó phát hành tất cả các khóa cùng một lúc. Các cơ chế khóa được mô tả trước đó là tất cả tiềm ẩn. Innodb xử lý khóa tự động, theo cấp độ cô lập của bạn.

Tuy nhiên, InnoDB cũng hỗ trợ khóa rõ ràng, mà tiêu chuẩn SQL hoàn toàn không đề cập đến: [6]

  • mysql> ALTER TABLE mytable ENGINE = InnoDB;
    0

  • mysql> ALTER TABLE mytable ENGINE = InnoDB;
    1

MySQL cũng hỗ trợ các lệnh

mysql> ALTER TABLE mytable ENGINE = InnoDB;
2 và
mysql> ALTER TABLE mytable ENGINE = InnoDB;
3, được triển khai trong máy chủ, không phải trong các công cụ lưu trữ. Chúng có cách sử dụng của họ, nhưng chúng không phải là một thay thế cho các giao dịch. Nếu bạn cần giao dịch, hãy sử dụng công cụ lưu trữ giao dịch.

Chúng ta thường thấy các ứng dụng đã được chuyển đổi từ myisam thành innodb nhưng vẫn đang sử dụng

mysql> ALTER TABLE mytable ENGINE = InnoDB;
2. Điều này không còn cần thiết vì khóa cấp hàng, và nó có thể gây ra các vấn đề hiệu suất nghiêm trọng.

Cảnh báo

Sự tương tác giữa

mysql> ALTER TABLE mytable ENGINE = InnoDB;
5 và giao dịch rất phức tạp và có những hành vi bất ngờ trong một số phiên bản máy chủ. Do đó, chúng tôi khuyên bạn nên không bao giờ sử dụng
mysql> ALTER TABLE mytable ENGINE = InnoDB;
5 trừ khi bạn đang tham gia giao dịch và
mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)
4 bị vô hiệu hóa, bất kể bạn đang sử dụng công cụ lưu trữ nào.

Kiểm soát đồng thời đa dạng

Hầu hết các công cụ lưu trữ giao dịch MySQL, don don sử dụng một cơ chế khóa hàng đơn giản. Thay vào đó, họ sử dụng khóa cấp hàng kết hợp với một kỹ thuật để tăng sự đồng thời được gọi là Điều khiển đồng thời đa dạng (MVCC). MVCC không phải là duy nhất đối với MySQL: Oracle, PostgreSQL và một số hệ thống cơ sở dữ liệu khác cũng sử dụng nó, mặc dù có sự khác biệt đáng kể vì không có tiêu chuẩn nào cho việc MVCC nên hoạt động như thế nào.multiversion concurrency control (MVCC). MVCC is not unique to MySQL: Oracle, PostgreSQL, and some other database systems use it too, although there are significant differences because there is no standard for how MVCC should work.

Bạn có thể nghĩ về MVCC như một sự thay đổi trong khóa cấp hàng; Nó tránh sự cần thiết phải khóa ở tất cả các trường hợp và có thể có chi phí thấp hơn nhiều. Tùy thuộc vào cách thực hiện, nó có thể cho phép đọc không khóa, trong khi chỉ khóa các hàng cần thiết trong các hoạt động ghi.

MVCC hoạt động bằng cách giữ một ảnh chụp nhanh dữ liệu khi nó tồn tại vào một thời điểm nào đó. Điều này có nghĩa là các giao dịch có thể thấy một cái nhìn nhất quán về dữ liệu, bất kể chúng chạy bao lâu. Nó cũng có nghĩa là các giao dịch khác nhau có thể thấy dữ liệu khác nhau trong cùng một bảng cùng một lúc! Nếu bạn chưa bao giờ trải nghiệm điều này trước đây, nó có thể khó hiểu, nhưng nó sẽ trở nên dễ hiểu hơn với sự quen thuộc.

Mỗi công cụ lưu trữ thực hiện MVCC khác nhau. Một số biến thể bao gồm kiểm soát đồng thời lạc quan và bi quan. Chúng tôi sẽ minh họa một cách MVCC hoạt động bằng cách giải thích một phiên bản đơn giản của hành vi Innodb.optimistic and pessimistic concurrency control. We’ll illustrate one way MVCC works by explaining a simplified version of InnoDB’s behavior.

Innodb thực hiện MVCC bằng cách lưu trữ với mỗi hàng hai giá trị ẩn, ẩn ghi lại khi hàng được tạo và khi nó hết hạn (hoặc bị xóa). Thay vì lưu trữ thời gian thực tế tại đó các sự kiện này xảy ra, hàng lưu trữ số phiên bản hệ thống tại thời điểm mỗi sự kiện xảy ra. Đây là một số tăng mỗi khi một giao dịch bắt đầu. Mỗi giao dịch giữ bản ghi riêng của phiên bản hệ thống hiện tại, tính đến thời điểm nó bắt đầu. Mỗi truy vấn phải kiểm tra từng số phiên bản của hàng với phiên bản giao dịch. Hãy để xem cách thức này áp dụng cho các hoạt động cụ thể khi mức cách ly giao dịch được đặt thành

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
6:

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
0

Innodb phải kiểm tra từng hàng để đảm bảo rằng nó đáp ứng hai tiêu chí:

  1. Innodb phải tìm một phiên bản của hàng ít nhất là cũ như giao dịch (tức là, phiên bản của nó phải nhỏ hơn hoặc bằng phiên bản giao dịch). Điều này đảm bảo rằng hàng tồn tại trước khi giao dịch bắt đầu hoặc giao dịch được tạo hoặc thay đổi hàng.

  2. Phiên bản xóa hàng của Row phải không được xác định hoặc lớn hơn phiên bản giao dịch. Điều này đảm bảo rằng hàng đã bị xóa trước khi giao dịch bắt đầu.

Các hàng vượt qua cả hai bài kiểm tra có thể được trả về làm kết quả truy vấn.

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
0

Innodb ghi lại số phiên bản hệ thống hiện tại với hàng mới.

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
1

Innodb ghi lại số phiên bản hệ thống hiện tại dưới dạng ID xóa hàng.

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
2

Innodb viết một bản sao mới của hàng, sử dụng số phiên bản hệ thống cho phiên bản hàng mới. Nó cũng viết số phiên bản hệ thống dưới dạng phiên bản xóa hàng cũ.

Kết quả của tất cả các lưu trữ hồ sơ bổ sung này là hầu hết các truy vấn đọc không bao giờ có được khóa. Họ chỉ cần đọc dữ liệu nhanh nhất có thể, đảm bảo chỉ chọn các hàng đáp ứng các tiêu chí. Hạn chế là công cụ lưu trữ phải lưu trữ nhiều dữ liệu hơn với mỗi hàng, thực hiện nhiều công việc hơn khi kiểm tra các hàng và xử lý một số hoạt động vệ sinh bổ sung.

MVCC chỉ hoạt động với các mức cách ly

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
3 và
START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
4.
START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
2 isn tương thích MVCC [7] bởi vì các truy vấn don don đọc phiên bản hàng phù hợp với phiên bản giao dịch của họ; Họ đọc phiên bản mới nhất, không có vấn đề gì.
mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
0 isn tương thích MVCC vì đọc khóa mỗi hàng họ trở lại.

Công cụ lưu trữ MySQL từ

Phần này cung cấp một cái nhìn tổng quan về các công cụ lưu trữ MySQL. Chúng tôi đã giành chiến thắng đi sâu vào chi tiết ở đây, bởi vì chúng tôi thảo luận về các công cụ lưu trữ và các hành vi cụ thể của chúng trong suốt cuốn sách. Tuy nhiên, ngay cả cuốn sách này cũng không phải là một nguồn tài liệu đầy đủ; Bạn nên đọc hướng dẫn sử dụng MySQL cho các công cụ lưu trữ bạn quyết định sử dụng.

MySQL lưu trữ mỗi cơ sở dữ liệu (còn được gọi là lược đồ) như một thư mục con của thư mục dữ liệu của nó trong hệ thống tập tin cơ bản. Khi bạn tạo một bảng, MySQL lưu trữ định nghĩa bảng trong tệp .frm có cùng tên với bảng. Do đó, khi bạn tạo một bảng có tên

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
7, MySQL sẽ lưu trữ định nghĩa bảng trong mytable.frm. Bởi vì MySQL sử dụng hệ thống tập tin để lưu trữ tên cơ sở dữ liệu và định nghĩa bảng, độ nhạy của trường hợp phụ thuộc vào nền tảng. Trên ví dụ Windows MySQL, tên bảng và cơ sở dữ liệu là không nhạy cảm; Trên các hệ thống giống như UNIX, chúng nhạy cảm với trường hợp. Mỗi công cụ lưu trữ lưu trữ dữ liệu bảng và chỉ mục khác nhau, nhưng chính máy chủ tự xử lý định nghĩa bảng.schema) as a subdirectory of its data directory in the underlying filesystem. When you create a table, MySQL stores the table definition in a .frm file with the same name as the table. Thus, when you create a table named
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
7, MySQL stores the table definition in MyTable.frm. Because MySQL uses the filesystem to store database names and table definitions, case sensitivity depends on the platform. On a Windows MySQL instance, table and database names are case insensitive; on Unix-like systems, they are case sensitive. Each storage engine stores the table’s data and indexes differently, but the server itself handles the table definition.

Bạn có thể sử dụng lệnh

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
8 (hoặc trong các phiên bản MySQL 5.0 và mới hơn, truy vấn các bảng
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
9) để hiển thị thông tin về các bảng. Ví dụ: để kiểm tra bảng
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
0 trong cơ sở dữ liệu
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
1, thực hiện các mục sau:

mysql> SHOW TABLE STATUS LIKE 'user' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 59
    Data_length: 356
Max_data_length: 4294967295
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2002-01-24 18:07:17
    Update_time: 2002-01-24 21:56:29
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)

Đầu ra cho thấy đây là bảng Myisam. Bạn cũng có thể nhận thấy rất nhiều thông tin và số liệu thống kê khác trong đầu ra. Hãy cùng xem ngắn gọn về ý nghĩa của mỗi dòng:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
2

Tên bảng.

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
3

Động cơ lưu trữ bàn. Trong các phiên bản cũ của MySQL, cột này được đặt tên là

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
4, không phải
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
3.

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
6

Định dạng hàng. Đối với một bảng Myisam, đây có thể là

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
7,
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
8 hoặc
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
9. Các hàng động khác nhau về chiều dài vì chúng chứa các trường có độ dài thay đổi như
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
00 hoặc
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
01. Các hàng cố định, luôn có cùng kích thước, được tạo thành từ các trường không có chiều dài khác nhau, chẳng hạn như
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
02 và
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
03. Các hàng nén chỉ tồn tại trong các bảng nén; Xem các bảng Myisam nén.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
04

Số lượng hàng trong bảng. Đối với Myisam và hầu hết các động cơ khác, con số này luôn chính xác. Đối với Innodb, nó là một ước tính.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
05

Có bao nhiêu byte hàng trung bình chứa.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
06

Bao nhiêu dữ liệu (tính bằng byte) toàn bộ bảng chứa.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
07

Lượng dữ liệu tối đa mà bảng này có thể giữ. Đây là động cơ cụ thể.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
08

Bao nhiêu không gian đĩa dữ liệu chỉ số tiêu thụ.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
09

Đối với một bảng Myisam, lượng không gian được phân bổ nhưng hiện không được sử dụng. Không gian này giữ các hàng đã bị xóa trước đó và có thể được thu hồi bằng các câu lệnh

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
0 trong tương lai.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
11

Giá trị

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
12 tiếp theo.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
13

Khi bảng được tạo lần đầu tiên.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
14

Khi dữ liệu trong bảng thay đổi lần cuối.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
15

Khi bảng được kiểm tra lần cuối bằng

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
16 hoặc Myisamchk.myisamchk.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
17

Bộ ký tự mặc định và đối chiếu cho các cột ký tự trong bảng này.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
18

Một tổng kiểm tra trực tiếp của toàn bộ nội dung bảng, nếu được bật.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
19

Bất kỳ tùy chọn khác được chỉ định khi bảng được tạo.

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
20

Trường này chứa một loạt các thông tin bổ sung. Đối với một bảng Myisam, nó chứa các nhận xét, nếu có, được đặt khi bảng được tạo. Nếu bảng sử dụng công cụ lưu trữ Innodb, lượng không gian trống trong không gian bảng Innodb sẽ xuất hiện ở đây. Nếu bảng là một chế độ xem, nhận xét chứa văn bản Xem Xem.

Động cơ Innodb

Innodb là công cụ lưu trữ giao dịch mặc định cho MySQL và là công cụ quan trọng nhất và hữu ích nhất. Nó được thiết kế để xử lý nhiều giao dịch tồn tại ngắn thường hoàn thành thay vì bị quay lại. Hiệu suất và phục hồi sự cố tự động của nó làm cho nó trở nên phổ biến cho các nhu cầu lưu trữ không chuyển thể, quá. Bạn nên sử dụng Innodb cho các bảng của mình trừ khi bạn có nhu cầu hấp dẫn để sử dụng một động cơ khác. Nếu bạn muốn nghiên cứu các công cụ lưu trữ, bạn cũng rất đáng để bạn học Innodb chuyên sâu để học càng nhiều càng tốt về nó, thay vì nghiên cứu tất cả các công cụ lưu trữ như nhau.You should use InnoDB for your tables unless you have a compelling need to use a different engine. If you want to study storage engines, it is also well worth your time to study InnoDB in depth to learn as much as you can about it, rather than studying all storage engines equally.

Lịch sử Innodb

Innodb có một lịch sử phát hành phức tạp, nhưng nó rất hữu ích để hiểu nó. Vào năm 2008, cái gọi là plugin Innodb đã được phát hành cho MySQL 5.1. Đây là thế hệ tiếp theo của Innodb được tạo ra bởi Oracle, vào thời điểm đó sở hữu Innodb nhưng không phải là MySQL. Vì nhiều lý do tuyệt vời để thảo luận về các loại bia, MySQL tiếp tục vận chuyển phiên bản cũ của Innodb, được biên dịch vào máy chủ. Nhưng bạn có thể vô hiệu hóa điều này và cài đặt plugin Innodb mới hơn, hoạt động tốt hơn, có thể mở rộng hơn nếu bạn muốn. Cuối cùng, Oracle đã thu được Sun Microsystems và do đó, MySQL, và đã loại bỏ cơ sở mã cũ hơn, thay thế nó bằng plugin plugin theo mặc định trong MySQL 5.5. .

Phiên bản hiện đại của InnoDB, được giới thiệu là plugin Innodb trong MySQL 5.1, các tính năng mới thể thao như xây dựng chỉ mục bằng cách sắp xếp, khả năng thả và thêm các chỉ mục mà không cần xây dựng lại toàn bộ bảng và định dạng lưu trữ mới cung cấp nén, một cách mới Để lưu trữ các giá trị lớn như các cột

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
01 và quản lý định dạng tệp. Nhiều người sử dụng MySQL 5.1 don lồng sử dụng plugin, đôi khi vì họ không nhận thức được điều đó. Nếu bạn sử dụng MySQL 5.1, vui lòng đảm bảo rằng bạn sử dụng plugin Innodb. Nó tốt hơn nhiều so với phiên bản cũ của Innodb.

Innodb là một công cụ quan trọng đến nỗi nhiều người và công ty đã đầu tư vào việc phát triển nó, không chỉ là nhóm Oracle. Những đóng góp đáng chú ý đã đến từ Google, Yasufumi Kinoshita, Percona và Facebook, trong số những người khác. Một số trong những cải tiến này đã được đưa vào mã nguồn InnoDB chính thức và nhiều người khác đã được nhóm Innodb trở nên tái tạo theo những cách hơi khác nhau. Nói chung, sự phát triển của Innodb, đã tăng tốc rất nhiều trong vài năm qua, với những cải tiến lớn đối với thiết bị, khả năng mở rộng, khả năng cấu hình, hiệu suất, tính năng và hỗ trợ cho các cửa sổ, trong số các mặt hàng đáng chú ý khác. MYSQL 5.6 Các bản xem trước và phát hành mốc mốc bao gồm một bảng màu đáng chú ý của các tính năng mới cho Innodb.

Oracle đang đầu tư rất nhiều nguồn lực vào việc cải thiện hiệu suất của InnoDB và thực hiện một công việc tuyệt vời của nó (một số lượng đáng kể đóng góp bên ngoài cũng giúp ích cho việc này). Trong phiên bản thứ hai của cuốn sách này, chúng tôi đã lưu ý rằng Innodb đã thất bại khá thảm hại vượt quá bốn lõi CPU. Bây giờ nó có tỷ lệ tốt đến 24 lõi CPU, và được cho là lên tới 32 hoặc thậm chí nhiều lõi hơn tùy thuộc vào kịch bản. Nhiều cải tiến được dự kiến ​​cho bản phát hành 5.6 sắp tới, nhưng vẫn có cơ hội để tăng cường.

Tổng quan Innodb

Innodb lưu trữ dữ liệu của mình trong một loạt một hoặc nhiều tệp dữ liệu được gọi chung là không gian bảng. Một không gian bảng về cơ bản là một hộp đen mà Innodb tự quản lý. Trong MySQL 4.1 và các phiên bản mới hơn, Innodb có thể lưu trữ mỗi dữ liệu và chỉ mục của bảng trong các tệp riêng biệt. Innodb cũng có thể sử dụng các phân vùng đĩa thô để xây dựng không gian bảng của nó, nhưng các hệ thống tập tin hiện đại làm cho điều này không cần thiết.tablespace. A tablespace is essentially a black box that InnoDB manages all by itself. In MySQL 4.1 and newer versions, InnoDB can store each table’s data and indexes in separate files. InnoDB can also use raw disk partitions for building its tablespace, but modern filesystems make this unnecessary.

Innodb sử dụng MVCC để đạt được sự đồng thời cao và nó thực hiện tất cả bốn mức cách ly tiêu chuẩn SQL. Nó mặc định vào mức cách ly

START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
6 và nó có chiến lược tiếp theo để ngăn chặn sự đọc ảo ở cấp độ cô lập này: thay vì chỉ khóa các hàng bạn đã chạm vào trong một truy vấn, các khoảng trống khóa innodb trong cấu trúc chỉ mục, ngăn chặn Phantoms từ được chèn.next-key locking strategy that prevents phantom reads in this isolation level: rather than locking only the rows you’ve touched in a query, InnoDB locks gaps in the index structure as well, preventing phantoms from being inserted.

Các bảng Innodb được xây dựng trên một chỉ mục phân cụm, chúng tôi sẽ trình bày chi tiết trong các chương sau. Các cấu trúc chỉ số Innodb, rất khác với các công cụ lưu trữ MySQL khác. Kết quả là, nó cung cấp tra cứu khóa chính rất nhanh. Tuy nhiên, các chỉ mục thứ cấp (các chỉ mục không phải là khóa chính) chứa các cột khóa chính, vì vậy nếu khóa chính của bạn lớn, các chỉ mục khác cũng sẽ lớn. Bạn nên phấn đấu cho một khóa chính nhỏ nếu bạn có nhiều chỉ mục trên bảng. Định dạng lưu trữ là trung lập nền tảng, có nghĩa là bạn có thể sao chép các tệp dữ liệu và chỉ mục từ máy chủ dựa trên Intel sang PowerPC hoặc Sun SPARC mà không gặp rắc rối nào.clustered index, which we will cover in detail in later chapters. InnoDB’s index structures are very different from those of most other MySQL storage engines. As a result, it provides very fast primary key lookups. However, secondary indexes (indexes that aren’t the primary key) contain the primary key columns, so if your primary key is large, other indexes will also be large. You should strive for a small primary key if you’ll have many indexes on a table. The storage format is platform-neutral, meaning you can copy the data and index files from an Intel-based server to a PowerPC or Sun SPARC without any trouble.

Innodb có một loạt các tối ưu hóa nội bộ. Chúng bao gồm trình trước đọc dự đoán cho dữ liệu trước từ đĩa, chỉ mục băm thích ứng tự động xây dựng các chỉ mục băm trong bộ nhớ để tra cứu rất nhanh và bộ đệm chèn để chèn tốc độ. Chúng tôi bao gồm những thứ này sau trong cuốn sách này.

Hành vi của Innodb, rất phức tạp và chúng tôi khuyên bạn nên đọc mô hình giao dịch InnoDB và phần khóa của hướng dẫn sử dụng MySQL nếu bạn sử dụng Innodb. Có rất nhiều sự tinh tế mà bạn nên biết trước khi xây dựng một ứng dụng với Innodb, vì kiến ​​trúc MVCC của nó. Làm việc với một công cụ lưu trữ duy trì chế độ xem nhất quán của dữ liệu cho tất cả người dùng, ngay cả khi một số người dùng đang thay đổi dữ liệu, có thể phức tạp.

Là một công cụ lưu trữ giao dịch, InnoDB hỗ trợ các bản sao lưu trực tuyến thực sự nóng bỏng thông qua nhiều cơ chế khác nhau, bao gồm sao lưu doanh nghiệp MySQL độc quyền của Oracle và Percona Xtrabackup nguồn mở. Các động cơ lưu trữ khác của MySQL, có thể lấy các bản sao lưu nóng để có được bản sao lưu nhất quán, bạn phải tạm dừng tất cả các ghi vào bảng, trong khối lượng công việc đọc/ghi hỗn hợp cũng thường kết thúc việc đọc.

Động cơ Myisam

Vì công cụ lưu trữ mặc định của MySQL, trong các phiên bản 5.1 trở lên, Myisam cung cấp một danh sách lớn các tính năng, chẳng hạn như lập chỉ mục văn bản đầy đủ, nén và các hàm không gian (GIS). Myisam không hỗ trợ các giao dịch hoặc khóa cấp hàng. Điểm yếu lớn nhất của nó chắc chắn là thực tế là nó thậm chí không an toàn. Myisam là lý do tại sao MySQL vẫn nổi tiếng là một hệ thống quản lý cơ sở dữ liệu không chuyển tiếp, hơn một thập kỷ sau khi đạt được giao dịch! Tuy nhiên, Myisam không phải là tất cả những điều tồi tệ đối với một công cụ lưu trữ không an toàn, không an toàn. Nếu bạn cần dữ liệu chỉ đọc, hoặc nếu các bảng của bạn không lớn và won sẽ bị đau khi sửa chữa, thì đó không phải là câu hỏi để sử dụng nó. .

Kho

Myisam thường lưu trữ mỗi bảng trong hai tệp: tệp dữ liệu và tệp chỉ mục. Hai tệp chịu. Mở rộng .MYI và .Myi, tương ứng. Các bảng Myisam có thể chứa các hàng động hoặc tĩnh (có độ dài cố định). MySQL quyết định định dạng nào sẽ sử dụng dựa trên định nghĩa bảng. Số lượng hàng mà bảng Myisam có thể giữ được giới hạn chủ yếu bởi không gian đĩa có sẵn trên máy chủ cơ sở dữ liệu của bạn và tệp lớn nhất mà hệ điều hành của bạn sẽ cho phép bạn tạo..MYD and .MYI extensions, respectively. MyISAM tables can contain either dynamic or static (fixed-length) rows. MySQL decides which format to use based on the table definition. The number of rows a MyISAM table can hold is limited primarily by the available disk space on your database server and the largest file your operating system will let you create.

Các bảng Myisam được tạo trong MySQL 5.0 với các hàng có độ dài thay đổi được cấu hình theo mặc định để xử lý 256 TB dữ liệu, sử dụng các con trỏ 6 byte cho các bản ghi dữ liệu. Các phiên bản MySQL trước đó được mặc định là các con trỏ 4 byte, cho tối đa 4 GB dữ liệu. Tất cả các phiên bản MySQL có thể xử lý kích thước con trỏ lên tới 8 byte. Để thay đổi kích thước con trỏ trên bảng Myisam (lên hoặc xuống), bạn phải thay đổi bảng bằng các giá trị mới cho các tùy chọn

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
23 và
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
24 đại diện cho số liệu bóng cho số lượng không gian bạn cần. Điều này sẽ khiến toàn bộ bảng và tất cả các chỉ mục của nó được viết lại, có thể mất nhiều thời gian.

Các tính năng của Myisam

Là một trong những công cụ lưu trữ lâu đời nhất có trong MySQL, Myisam có nhiều tính năng đã được phát triển qua nhiều năm sử dụng để đáp ứng nhu cầu thích hợp:

Khóa và đồng thời

Myisam khóa toàn bộ bảng, không phải hàng. Người đọc có được khóa được chia sẻ (đọc) trên tất cả các bảng họ cần đọc. Nhà văn có được khóa độc quyền (viết). Tuy nhiên, bạn có thể chèn các hàng mới vào bảng trong khi các truy vấn chọn đang chạy chống lại nó (chèn đồng thời).

Sửa chữa

MySQL hỗ trợ kiểm tra và sửa chữa và sửa chữa các bảng Myisam, nhưng không nên nhầm lẫn điều này với các giao dịch hoặc phục hồi sự cố. Sau khi sửa chữa một bảng, bạn có thể thấy rằng một số dữ liệu chỉ đơn giản là biến mất. Sửa chữa cũng chậm. Bạn có thể sử dụng các lệnh

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
25 và
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
26 để kiểm tra bảng để biết lỗi và sửa chữa chúng. Bạn cũng có thể sử dụng công cụ dòng lệnh Myisamchk để kiểm tra và sửa chữa các bảng khi máy chủ ngoại tuyến.myisamchk command-line tool to check and repair tables when the server is offline.

Các tính năng chỉ mục

Bạn có thể tạo các chỉ mục trên 500 ký tự đầu tiên của các cột

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
01 và
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
28 trong các bảng Myisam. Myisam hỗ trợ các chỉ mục toàn văn bản, chỉ mục các từ riêng lẻ cho các hoạt động tìm kiếm phức tạp. Để biết thêm thông tin về lập chỉ mục, xem Chương & NBSP; 5.

Bị trì hoãn ghi

Các bảng Myisam được đánh dấu bằng tùy chọn

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
29 Tạo don don ghi dữ liệu chỉ số đã thay đổi thành đĩa ở cuối truy vấn. Thay vào đó, Myisam đệm các thay đổi trong bộ đệm khóa trong bộ nhớ. Nó xả các khối chỉ mục vào đĩa khi nó cắt bộ đệm hoặc đóng bảng. Điều này có thể tăng hiệu suất, nhưng sau khi máy chủ hoặc hệ thống gặp sự cố, các chỉ mục chắc chắn sẽ bị hỏng và sẽ cần sửa chữa. Bạn có thể định cấu hình khóa ghi bị trì hoãn trên toàn cầu, cũng như cho các bảng riêng lẻ.

Nén các bảng Myisam

Một số bảng không bao giờ thay đổi khi chúng được tạo và chứa đầy dữ liệu. Chúng có thể phù hợp để nén các bảng Myisam.

Bạn có thể nén các bảng (hoặc gói gói) với tiện ích Myisampack. Bạn có thể sửa đổi các bảng nén (mặc dù bạn có thể giải nén, sửa đổi và tái tạo các bảng nếu bạn cần), nhưng chúng thường sử dụng ít không gian hơn trên đĩa. Do đó, họ cung cấp hiệu suất nhanh hơn, bởi vì kích thước nhỏ hơn của chúng đòi hỏi ít đĩa hơn tìm cách tìm hồ sơ. Các bảng Myisam nén có thể có các chỉ mục, nhưng chúng chỉ đọc.myisampack utility. You can’t modify compressed tables (although you can uncompress, modify, and recompress tables if you need to), but they generally use less space on disk. As a result, they offer faster performance, because their smaller size requires fewer disk seeks to find records. Compressed MyISAM tables can have indexes, but they’re read-only.

Chi phí giải nén dữ liệu để đọc nó không đáng kể đối với hầu hết các ứng dụng trên phần cứng hiện đại, trong đó mức tăng thực sự là giảm I/O của đĩa. Các hàng được nén riêng lẻ, vì vậy MySQL không cần phải giải nén toàn bộ bảng (hoặc thậm chí là một trang) chỉ để tìm nạp một hàng.

Hiệu suất của Myisam

Do lưu trữ dữ liệu nhỏ gọn và chi phí thấp do thiết kế đơn giản hơn, Myisam có thể cung cấp hiệu suất tốt cho một số mục đích sử dụng. Nó có một số hạn chế về khả năng mở rộng nghiêm trọng, bao gồm các clexes trên bộ nhớ cache chính. Mariadb cung cấp một bộ đệm khóa được phân đoạn để tránh vấn đề này. Tuy nhiên, vấn đề hiệu suất phổ biến nhất mà chúng ta thấy là khóa bảng. Nếu tất cả các truy vấn của bạn đang bị mắc kẹt trong tình trạng bị khóa của người dùng, bạn sẽ bị khóa ở cấp độ bảng.

Các động cơ MySQL tích hợp khác

MySQL có nhiều công cụ lưu trữ đa năng. Nhiều người trong số họ có phần không phản đối trong các phiên bản mới hơn, vì nhiều lý do. Một số trong số này vẫn có sẵn trong máy chủ, nhưng phải được bật đặc biệt.

Các công cụ lưu trữ

Công cụ lưu trữ chỉ hỗ trợ các truy vấn

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
0 và
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
0 và nó không hỗ trợ các chỉ mục cho đến khi MySQL 5.1. Nó gây ra I/O ít hơn nhiều so với Myisam, bởi vì nó đệm dữ liệu ghi và nén từng hàng với ZLIB khi nó chèn. Ngoài ra, mỗi truy vấn
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
0 yêu cầu quét bảng đầy đủ. Do đó, các bảng lưu trữ là tốt nhất để ghi nhật ký và thu thập dữ liệu, trong đó phân tích có xu hướng quét toàn bộ bảng hoặc nơi bạn muốn truy vấn
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
0 nhanh.zlib as it’s inserted. Also, each
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
0 query requires a full table scan. Archive tables are thus best for logging and data acquisition, where analysis tends to scan an entire table, or where you want fast
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
0 queries.

Lưu trữ hỗ trợ khóa cấp hàng và hệ thống đệm đặc biệt để chèn độ đối nghịch cao. Nó cung cấp các bài đọc nhất quán bằng cách dừng

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
0 sau khi nó đã lấy lại số lượng hàng tồn tại trong bảng khi truy vấn bắt đầu. Nó cũng làm cho việc chèn số lượng lớn vô hình cho đến khi chúng hoàn thành. Các tính năng này mô phỏng một số khía cạnh của hành vi giao dịch và MVCC, nhưng lưu trữ không phải là một công cụ lưu trữ giao dịch. Nó chỉ đơn giản là một công cụ lưu trữ mà Tối ưu hóa cho bộ lưu trữ chèn và nén tốc độ cao.

Động cơ Blackhole

Động cơ Blackhole không có cơ chế lưu trữ nào cả. Nó loại bỏ mỗi

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
0 thay vì lưu trữ nó. Tuy nhiên, máy chủ viết các truy vấn chống lại các bảng Blackhole vào nhật ký của nó, vì vậy chúng có thể được sao chép hoặc đơn giản là giữ trong nhật ký. Điều đó làm cho động cơ blackhole trở nên phổ biến cho các thiết lập sao chép và ghi nhật ký kiểm toán ưa thích, mặc dù chúng tôi đã thấy đủ các vấn đề gây ra bởi các thiết lập như vậy mà chúng tôi không đề xuất chúng.

Động cơ CSV

Động cơ CSV có thể coi các tệp các giá trị được phân tách bằng dấu phẩy (CSV) là bảng, nhưng nó không hỗ trợ các chỉ mục trên chúng. Công cụ này cho phép bạn sao chép các tệp vào và ra khỏi cơ sở dữ liệu trong khi máy chủ đang chạy. Nếu bạn xuất một tệp CSV từ bảng tính và lưu nó trong thư mục dữ liệu của máy chủ MySQL, máy chủ có thể đọc nó ngay lập tức. Tương tự, nếu bạn viết dữ liệu vào bảng CSV, một chương trình bên ngoài có thể đọc nó ngay lập tức. Do đó, các bảng CSV hữu ích như một định dạng trao đổi dữ liệu.

Động cơ liên kết

Công cụ lưu trữ này là một proxy cho các máy chủ khác. Nó mở kết nối máy khách đến một máy chủ khác và thực hiện các truy vấn đối với bảng ở đó, truy xuất và gửi các hàng khi cần thiết. Nó ban đầu được bán trên thị trường như một đối thủ cạnh tranh cho các tính năng được hỗ trợ trong nhiều máy chủ cơ sở dữ liệu độc quyền cấp doanh nghiệp, như Microsoft SQL Server và Oracle, nhưng đó luôn là một sự kéo dài, để nói ít nhất. Mặc dù nó dường như cho phép nhiều thủ thuật linh hoạt và gọn gàng, nhưng nó đã được chứng minh là một nguồn của nhiều vấn đề và bị vô hiệu hóa theo mặc định. Một người kế vị của nó, FederatedX, có sẵn ở Mariadb.

Động cơ bộ nhớ

Bảng bộ nhớ (trước đây được gọi là bảng

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
36) rất hữu ích khi bạn cần truy cập nhanh vào dữ liệu mà không bao giờ thay đổi hoặc không cần phải tồn tại sau khi khởi động lại. Bảng bộ nhớ có thể lên đến một thứ tự nhanh hơn các bảng Myisam. Tất cả dữ liệu của họ được lưu trữ trong bộ nhớ, vì vậy các truy vấn don don phải chờ I/O đĩa. Cấu trúc bảng của bảng bộ nhớ vẫn tồn tại trên máy chủ, nhưng không có dữ liệu nào tồn tại.

Dưới đây là một số cách sử dụng tốt cho các bảng bộ nhớ:

  • Đối với các bảng LOEP LOEP

  • Để lưu trữ kết quả của dữ liệu tổng hợp định kỳ

  • Đối với kết quả trung gian khi phân tích dữ liệu

Bảng bộ nhớ hỗ trợ các chỉ mục

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
37, rất nhanh cho các truy vấn tra cứu. Mặc dù các bảng bộ nhớ rất nhanh, nhưng chúng thường không hoạt động tốt như thay thế mục đích chung cho các bảng dựa trên đĩa. Họ sử dụng khóa cấp bảng, cho phép đồng thời ghi thấp. Chúng không hỗ trợ các loại cột
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
28 hoặc ____101 và chúng chỉ hỗ trợ các hàng có kích thước cố định, vì vậy chúng thực sự lưu trữ
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
00S dưới dạng
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
02s, có thể lãng phí bộ nhớ. (Một số hạn chế này được nâng lên trong máy chủ Percona.)

MySQL sử dụng công cụ bộ nhớ trong nội bộ trong khi xử lý các truy vấn yêu cầu bảng tạm thời để giữ kết quả trung gian. Nếu kết quả trung gian trở nên quá lớn đối với bảng bộ nhớ hoặc có các cột

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
28 hoặc
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
01, MySQL sẽ chuyển đổi nó thành bảng myisam trên đĩa. Chúng tôi nói thêm về điều này trong các chương sau.

Ghi chú

Mọi người thường nhầm lẫn các bảng bộ nhớ với các bảng tạm thời, là các bảng phù du được tạo bằng

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
44. Bảng tạm thời có thể sử dụng bất kỳ động cơ lưu trữ nào; Chúng không giống với các bảng sử dụng công cụ lưu trữ bộ nhớ. Các bảng tạm thời chỉ hiển thị với một kết nối duy nhất và biến mất hoàn toàn khi kết nối đóng.

Động cơ lưu trữ hợp nhất

Động cơ hợp nhất là một biến thể của Myisam. Một bảng hợp nhất là sự kết hợp của một số bảng Myisam giống hệt nhau vào một bảng ảo. Điều này có thể hữu ích khi bạn sử dụng MySQL trong các ứng dụng lưu trữ và lưu trữ dữ liệu, nhưng nó đã không được ủng hộ để phân vùng (xem Chương & NBSP; 7).

Động cơ cụm NDB

MySQL AB đã mua lại cơ sở dữ liệu NDB từ Sony Ericsson vào năm 2003 và xây dựng công cụ lưu trữ cụm NDB làm giao diện giữa SQL được sử dụng trong MySQL và giao thức NDB gốc. Sự kết hợp của máy chủ MySQL, công cụ lưu trữ cụm NDB và cơ sở dữ liệu NDB được phân tán, không chia sẻ, không lỗi, có sẵn, được gọi là cụm MySQL. Chúng tôi thảo luận về cụm MySQL sau trong cuốn sách này.

Động cơ lưu trữ của bên thứ ba

Bởi vì MySQL cung cấp API công cụ lưu trữ có thể cắm được, bắt đầu vào khoảng năm 2007, một loạt các công cụ lưu trữ hoang mang bắt đầu xuất hiện để phục vụ các mục đích đặc biệt. Một số trong số này được bao gồm trong máy chủ, nhưng hầu hết là các sản phẩm của bên thứ ba hoặc các dự án nguồn mở. Chúng tôi sẽ thảo luận về một vài trong số các công cụ lưu trữ mà chúng tôi đã quan sát là đủ hữu ích để chúng vẫn có liên quan ngay cả khi sự đa dạng đã làm mỏng đi một chút.

Động cơ lưu trữ OLTP

Công cụ lưu trữ Percona từ XTRADB, được bao gồm trong Percona Server và MariaDB, là phiên bản sửa đổi của Innodb. Những cải tiến của nó được nhắm mục tiêu vào hiệu suất, khả năng đo lường và tính linh hoạt hoạt động. Đó là một sự thay thế thả vào cho Innodb với khả năng đọc và ghi các tệp dữ liệu Innodb, và để thực hiện tất cả các truy vấn mà Innodb có thể thực thi.

Có một số động cơ lưu trữ OLTP khác gần giống với InnODB theo một số cách quan trọng, chẳng hạn như cung cấp tuân thủ axit và MVCC. Một là PBXT, sự sáng tạo của Paul McCullagh và Primebase GmbH. CNTT thể thao sao chép cấp độ động cơ, các ràng buộc khóa nước ngoài và kiến ​​trúc phức tạp định vị nó để lưu trữ trạng thái rắn và xử lý hiệu quả các giá trị lớn như

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
01S. PBXT được coi là một công cụ lưu trữ cộng đồng và được bao gồm trong MariaDB.

TOKUDB sử dụng cấu trúc dữ liệu chỉ số mới được gọi là cây fractal, có bộ nhớ cache, vì vậy chúng không bị chậm lại khi chúng lớn hơn bộ nhớ, chúng cũng không già hoặc mảnh vỡ. TOKUDB được bán trên thị trường như một công cụ lưu trữ dữ liệu lớn, bởi vì nó có tỷ lệ nén cao và có thể hỗ trợ nhiều chỉ mục trên khối lượng dữ liệu lớn. Tại thời điểm viết nó là trong tình trạng phát hành sản xuất sớm và có một số hạn chế quan trọng xung quanh sự đồng thời. Điều này làm cho nó phù hợp nhất với các trường hợp sử dụng như bộ dữ liệu phân tích với tỷ lệ chèn cao, nhưng điều đó có thể thay đổi trong các phiên bản trong tương lai.

Rethinkdb ban đầu được định vị là một công cụ lưu trữ được thiết kế để lưu trữ trạng thái rắn, mặc dù nó dường như đã trở nên ít bị mắc kẹt hơn khi thời gian trôi qua. Đặc điểm kỹ thuật đặc biệt nhất của nó có thể được cho là việc sử dụng cấu trúc dữ liệu chỉ số B-Tree chỉ có một lần sao chép. Nó vẫn còn trong sự phát triển ban đầu, và chúng tôi không đánh giá nó cũng như không thấy nó được sử dụng.

Falcon được quảng bá là công cụ lưu trữ giao dịch thế hệ tiếp theo cho MySQL vào khoảng thời gian mua lại Sun, của MySQL AB, nhưng từ lâu đã bị hủy bỏ. Jim Starkey, kiến ​​trúc sư chính của Falcon, đã thành lập một công ty mới để xây dựng cơ sở dữ liệu NewsQL hỗ trợ đám mây có tên NUODB (trước đây là NIMBUSDB).

Động cơ lưu trữ định hướng cột

MySQL được định hướng hàng theo mặc định, có nghĩa là mỗi dữ liệu hàng của hàng được lưu trữ cùng nhau và máy chủ hoạt động theo đơn vị hàng khi nó thực thi các truy vấn. Nhưng đối với khối lượng dữ liệu rất lớn, một cách tiếp cận hướng cột có thể hiệu quả hơn; Nó cho phép động cơ truy xuất ít dữ liệu hơn khi các hàng đầy đủ cần thiết và khi mỗi cột được lưu trữ riêng, nó thường có thể được nén hiệu quả hơn.

Công cụ lưu trữ hướng cột hàng đầu là thông tin, hoạt động tốt ở kích thước rất lớn (hàng chục terabyte). Nó được thiết kế cho các trường hợp sử dụng lưu trữ dữ liệu và phân tích. Nó hoạt động bằng cách lưu trữ dữ liệu trong các khối, được nén cao. Nó duy trì một tập hợp siêu dữ liệu cho mỗi khối, cho phép nó bỏ qua các khối hoặc thậm chí để hoàn thành các truy vấn chỉ bằng cách nhìn vào siêu dữ liệu. Nó không có chỉ số mà là điểm mà điểm; Ở các kích cỡ lớn như vậy, các chỉ mục là vô dụng và cấu trúc khối là một loại chỉ số gần như. InfoBright yêu cầu một phiên bản tùy chỉnh của máy chủ, bởi vì các phần của máy chủ phải được viết lại để hoạt động với dữ liệu định hướng cột. Một số truy vấn có thể được thực hiện bởi công cụ lưu trữ ở chế độ hướng cột và khiến máy chủ rơi trở lại chế độ hàng từng hàng, chậm. InfoBright có sẵn trong cả hai phiên bản thương mại và cộng đồng nguồn mở và các phiên bản thương mại độc quyền.

Một công cụ lưu trữ định hướng cột khác là Calpont, Infinidb, cũng có sẵn trong các phiên bản thương mại và cộng đồng. Infinidb cung cấp khả năng phân phối các truy vấn trên một cụm máy. Mặc dù vậy, chúng tôi đã thấy bất cứ ai sử dụng nó trong sản xuất.

Nhân tiện, nếu bạn có mặt trên thị trường cho một cơ sở dữ liệu định hướng cột mà không phải là MySQL, chúng tôi cũng đã đánh giá LucidDB và MonetDB. Bạn có thể tìm thấy điểm chuẩn và ý kiến ​​trên blog Hiệu suất MySQL, mặc dù chúng có thể sẽ trở nên lỗi thời khi thời gian trôi qua.

Một danh sách đầy đủ các công cụ lưu trữ cộng đồng sẽ chạy vào điểm số, và thậm chí có thể gấp ba chữ số nếu chúng tôi nghiên cứu chúng một cách triệt để. Tuy nhiên, nó rất an toàn khi nói rằng hầu hết trong số họ phục vụ các ngóc ngách rất hạn chế và nhiều người được biết đến bởi nhiều người được biết đến hoặc sử dụng nhiều người. Chúng tôi chỉ đề cập đến một vài trong số họ. Chúng tôi đã thấy hầu hết trong số này trong việc sử dụng sản xuất. Emptor caveat!Caveat emptor!

ARIA

Aria, trước đây được đặt tên là Maria, là người tạo ra người tạo ra MySQL ban đầu đã lên kế hoạch cho Myisam. Nó có sẵn ở Mariadb. Nhiều tính năng được lên kế hoạch cho nó dường như đã được hoãn lại để ủng hộ các cải tiến ở nơi khác trong máy chủ Mariadb. Tại thời điểm viết, có lẽ tốt nhất là mô tả nó như một phiên bản an toàn của Myisam, với một số cải tiến khác như khả năng lưu trữ dữ liệu (không chỉ các chỉ mục) trong bộ nhớ của chính nó.

Groonga

Đây là một công cụ lưu trữ tìm kiếm toàn văn, tuyên bố cung cấp độ chính xác và tốc độ cao.

OQGRAPH

Động cơ này từ Truy vấn mở hỗ trợ các hoạt động đồ thị (nghĩ rằng, tìm đường dẫn ngắn nhất giữa các nút,) không thực tế hoặc không thể thực hiện trong SQL.

Q4M

Động cơ này thực hiện một hàng đợi bên trong MySQL, với sự hỗ trợ cho các hoạt động mà bản thân SQL gây ra khá khó khăn hoặc không thể thực hiện trong một tuyên bố.

Sphinxse

Động cơ này cung cấp giao diện SQL cho máy chủ tìm kiếm toàn văn bản thun, mà chúng tôi thảo luận nhiều hơn trong Phụ lục & NBSP; f.

Nhện

Động cơ này phân vùng dữ liệu thành một số phân vùng, thực hiện hiệu quả Sharding trong suốt và thực hiện các truy vấn của bạn song song trên các mảnh vỡ, có thể được đặt trên các máy chủ khác nhau.

VPFormySQL

Động cơ này hỗ trợ phân vùng dọc của các bảng thông qua một loại công cụ lưu trữ proxy. Đó là, bạn có thể cắt một bảng thành nhiều bộ cột và lưu trữ chúng một cách độc lập, nhưng truy vấn chúng như một bảng duy nhất. Nó cùng với cùng một tác giả với động cơ nhện.

Chọn đúng động cơ

Bạn nên sử dụng động cơ nào? Innodb thường là lựa chọn đúng đắn, đó là lý do tại sao chúng tôi rất vui vì Oracle đã biến nó thành công cụ mặc định trong MySQL 5.5. Quyết định sử dụng công cụ nào có thể được tóm tắt bằng cách nói, sử dụng Innodb trừ khi bạn cần một tính năng mà nó không cung cấp, và không có cách tiếp cận nào tốt. Ví dụ: khi chúng ta cần tìm kiếm toàn văn, chúng ta thường thích sử dụng innodb kết hợp với Nhân sư, thay vì chọn Myisam cho các khả năng lập chỉ mục toàn văn của nó. Đôi khi chúng tôi chọn một cái gì đó khác ngoài Innodb khi chúng tôi không cần các tính năng của Innodb và một động cơ khác mang lại lợi ích hấp dẫn mà không có nhược điểm. Chẳng hạn, chúng tôi có thể sử dụng Myisam khi khả năng mở rộng hạn chế của nó, hỗ trợ kém cho sự đồng thời và thiếu khả năng phục hồi sự cố không phải là một vấn đề, nhưng Innodb tựa tiêu thụ không gian là một vấn đề.

Chúng tôi không muốn trộn và kết hợp các công cụ lưu trữ khác nhau trừ khi thực sự cần thiết. Nó làm cho mọi thứ trở nên phức tạp hơn nhiều và phơi bày bạn với một bộ lỗi tiềm năng và hành vi trong trường hợp cạnh hoàn toàn mới. Các tương tác giữa các công cụ lưu trữ và máy chủ đủ phức tạp mà không cần thêm nhiều công cụ lưu trữ vào hỗn hợp. Ví dụ: nhiều công cụ lưu trữ gây khó khăn cho việc thực hiện sao lưu nhất quán hoặc cấu hình máy chủ đúng.

Nếu bạn tin rằng bạn cần một động cơ khác, đây là một số yếu tố bạn nên xem xét:

Giao dịch

Nếu ứng dụng của bạn yêu cầu giao dịch, Innodb (hoặc XTRADB) là lựa chọn ổn định nhất, tích hợp tốt nhất, đã được chứng minh. Myisam là một lựa chọn tốt nếu một nhiệm vụ không yêu cầu các giao dịch và vấn đề chủ yếu là

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
0 hoặc
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
0. Đôi khi các thành phần cụ thể của một ứng dụng (như ghi nhật ký) rơi vào danh mục này.

Sao lưu

Sự cần thiết phải thực hiện các bản sao lưu thường xuyên cũng có thể ảnh hưởng đến sự lựa chọn của bạn. Nếu máy chủ của bạn có thể ngừng hoạt động đều đặn cho các bản sao lưu, các công cụ lưu trữ cũng dễ xử lý như nhau. Tuy nhiên, nếu bạn cần thực hiện sao lưu trực tuyến, về cơ bản bạn cần Innodb.

Phục hồi sự cố

Nếu bạn có nhiều dữ liệu, bạn nên nghiêm túc xem xét thời gian sẽ mất bao lâu để phục hồi sau vụ tai nạn. Các bảng Myisam trở nên hư hỏng dễ dàng hơn và mất nhiều thời gian hơn để phục hồi so với các bảng Innodb. Trên thực tế, đây là một trong những lý do quan trọng nhất khiến nhiều người sử dụng Innodb khi họ không cần giao dịch.

Các tính năng đặc biệt

Cuối cùng, đôi khi bạn thấy rằng một ứng dụng phụ thuộc vào các tính năng hoặc tối ưu hóa cụ thể mà chỉ một số công cụ lưu trữ MySQL, cung cấp. Ví dụ, rất nhiều ứng dụng dựa vào tối ưu hóa chỉ mục cụm. Mặt khác, chỉ có Myisam hỗ trợ tìm kiếm không gian địa lý bên trong MySQL. Nếu một công cụ lưu trữ đáp ứng một hoặc nhiều yêu cầu quan trọng, nhưng không phải các công cụ khác, bạn cần phải thỏa hiệp hoặc tìm một giải pháp thiết kế thông minh. Bạn thường có thể nhận được những gì bạn cần từ một công cụ lưu trữ mà dường như không hỗ trợ các yêu cầu của bạn.

Bạn không cần phải quyết định ngay bây giờ. Có rất nhiều tài liệu trên mỗi công cụ lưu trữ Điểm mạnh và điểm yếu trong phần còn lại của cuốn sách, và rất nhiều mẹo về kiến ​​trúc và thiết kế. Nói chung, có lẽ có nhiều lựa chọn hơn bạn nhận ra, và nó có thể giúp quay lại câu hỏi này sau khi đọc thêm. Nếu bạn không chắc chắn, chỉ cần gắn bó với Innodb. Nó có một mặc định an toàn và ở đó, không có lý do gì để chọn bất cứ điều gì khác nếu bạn không biết những gì bạn cần.

Các chủ đề này có vẻ khá trừu tượng mà không có một số bối cảnh trong thế giới thực, vì vậy hãy để Lừa xem xét một số ứng dụng cơ sở dữ liệu phổ biến. Chúng tôi sẽ xem xét một loạt các bảng và xác định động cơ nào phù hợp nhất với mỗi nhu cầu của bảng. Chúng tôi đưa ra một bản tóm tắt các tùy chọn trong phần tiếp theo.

Đăng nhập

Giả sử bạn muốn sử dụng MySQL để ghi lại một bản ghi của mọi cuộc gọi từ một công tắc điện thoại trung tâm trong thời gian thực. Hoặc có thể bạn đã cài đặt mod_log_sql cho Apache, vì vậy bạn có thể đăng nhập tất cả các lượt truy cập vào trang web của mình trực tiếp vào bảng. Trong một ứng dụng như vậy, tốc độ có lẽ là mục tiêu quan trọng nhất; Bạn không muốn cơ sở dữ liệu là nút cổ chai. Các công cụ lưu trữ Myisam và lưu trữ sẽ hoạt động rất tốt vì chúng có chi phí rất thấp và có thể chèn hàng ngàn hồ sơ mỗi giây.mod_log_sql for Apache, so you can log all visits to your website directly in a table. In such an application, speed is probably the most important goal; you don’t want the database to be the bottleneck. The MyISAM and Archive storage engines would work very well because they have very low overhead and can insert thousands of records per second.

Tuy nhiên, mọi thứ sẽ trở nên thú vị, nếu bạn quyết định thời gian để bắt đầu chạy các báo cáo để tóm tắt dữ liệu mà bạn đã đăng nhập. Tùy thuộc vào các truy vấn bạn sử dụng, có một cơ hội tốt rằng việc thu thập dữ liệu cho báo cáo sẽ làm chậm đáng kể quá trình chèn hồ sơ. Bạn có thể làm gì?

Một giải pháp là sử dụng tính năng sao chép tích hợp của MySQL, để sao chép dữ liệu lên máy chủ thứ hai, sau đó chạy các truy vấn chuyên sâu thời gian và CPU của bạn đối với dữ liệu trên bản sao. Điều này để lại Master tự do chèn các bản ghi và cho phép bạn chạy bất kỳ truy vấn nào bạn muốn trên bản sao mà không phải lo lắng về việc nó có thể ảnh hưởng đến việc ghi nhật ký thời gian thực như thế nào.

Bạn cũng có thể chạy các truy vấn tại thời điểm tải thấp, nhưng don không dựa vào chiến lược này tiếp tục hoạt động khi ứng dụng của bạn phát triển.

Một tùy chọn khác là đăng nhập vào một bảng chứa năm và tên hoặc số của tháng trong tên của nó, chẳng hạn như

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
48 hoặc
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
49. Mặc dù bạn đang bận chạy các truy vấn đối với các bảng không còn được ghi vào, ứng dụng của bạn có thể ghi lại các bản ghi vào bảng hiện tại không bị gián đoạn.

Các bảng chỉ đọc hoặc đọc nhiều nhất

Các bảng có chứa dữ liệu được sử dụng để xây dựng một danh mục hoặc danh sách một số loại (công việc, đấu giá, bất động sản, v.v.) thường được đọc từ nhiều hơn so với chúng được viết. Điều này dường như khiến họ trở thành ứng cử viên tốt cho Myisam, nếu bạn không quan tâm đến những gì xảy ra khi Myisam gặp nạn. Don lồng đánh giá thấp điều này quan trọng như thế nào; Rất nhiều người dùng don lồng thực sự hiểu mức độ rủi ro của việc sử dụng công cụ lưu trữ mà thậm chí không cố gắng để dữ liệu của họ được ghi vào đĩa. (Myisam chỉ ghi dữ liệu vào bộ nhớ và giả sử hệ điều hành sẽ xóa nó vào đĩa sau.)if you don’t mind what happens when MyISAM crashes. Don’t underestimate how important this is; a lot of users don’t really understand how risky it is to use a storage engine that doesn’t even try to get their data written to disk. (MyISAM just writes the data to memory and assumes the operating system will flush it to disk sometime later.)

Ghi chú

Đó là một ý tưởng tuyệt vời để chạy mô phỏng tải thực tế trên máy chủ thử nghiệm và sau đó thực sự rút phích cắm điện. Trải nghiệm đầu tiên của việc phục hồi sau một vụ tai nạn là vô giá. Nó tiết kiệm những bất ngờ khó chịu sau này.

Don Tiết chỉ tin rằng những người phổ biến là Myisam nhanh hơn sự khôn ngoan dân gian của Innodb. Nó không phải là đúng. Chúng ta có thể đặt tên cho hàng tá tình huống trong đó Innodb để lại Myisam trong bụi, đặc biệt là các ứng dụng trong đó các chỉ mục được phân cụm là hữu ích hoặc nơi dữ liệu phù hợp với bộ nhớ. Khi bạn đọc phần còn lại của cuốn sách này, bạn sẽ có cảm giác về yếu tố nào ảnh hưởng đến hiệu suất của công cụ lưu trữ (kích thước dữ liệu, số lượng hoạt động I/O, các khóa chính so với chỉ mục thứ cấp, v.v.) và trong số chúng quan trọng cho ứng dụng của bạn.not categorically true. We can name dozens of situations where InnoDB leaves MyISAM in the dust, especially for applications where clustered indexes are useful or where the data fits in memory. As you read the rest of this book, you’ll get a sense of which factors influence a storage engine’s performance (data size, number of I/O operations required, primary keys versus secondary indexes, etc.), and which of them matter to your application.

Khi chúng tôi thiết kế các hệ thống như thế này, chúng tôi sử dụng Innodb. Myisam dường như có thể hoạt động tốt ngay từ đầu, nhưng nó sẽ hoàn toàn rơi vào mặt khi ứng dụng bận rộn. Mọi thứ sẽ khóa và bạn sẽ mất dữ liệu khi bạn gặp sự cố máy chủ.

Xử lý đặt hàng

Khi bạn xử lý bất kỳ loại xử lý đơn đặt hàng nào, các giao dịch đều được yêu cầu. Các đơn đặt hàng hoàn thành một nửa sẽ khiến khách hàng yêu thích dịch vụ của bạn. Một cân nhắc quan trọng khác là liệu động cơ có cần hỗ trợ các ràng buộc chính của nước ngoài hay không. Innodb là đặt cược tốt nhất của bạn cho các ứng dụng xử lý đơn đặt hàng.

Bảng thông báo và diễn đàn thảo luận về luồng

Các cuộc thảo luận về chủ đề là một vấn đề thú vị đối với người dùng MySQL. Có hàng trăm hệ thống dựa trên PHP và Perl có sẵn miễn phí cung cấp các cuộc thảo luận có chủ đề. Nhiều người trong số họ được viết với hiệu quả của cơ sở dữ liệu, vì vậy họ có xu hướng chạy rất nhiều truy vấn cho mỗi yêu cầu mà họ phục vụ. Một số được viết để độc lập với cơ sở dữ liệu, vì vậy các truy vấn của họ không tận dụng các tính năng của bất kỳ hệ thống cơ sở dữ liệu nào. Họ cũng có xu hướng cập nhật các quầy và biên dịch số liệu thống kê sử dụng về các cuộc thảo luận khác nhau. Nhiều hệ thống cũng sử dụng một vài bảng nguyên khối để lưu trữ tất cả dữ liệu của họ. Do đó, một vài bảng trung tâm trở thành trọng tâm của hoạt động đọc và ghi nặng, và các khóa cần thiết để thực thi tính nhất quán trở thành một nguồn gây tranh cãi đáng kể.

Mặc dù thiếu sót về thiết kế, hầu hết các hệ thống này hoạt động tốt cho tải nhỏ và vừa. Tuy nhiên, nếu một trang web phát triển đủ lớn và tạo ra lưu lượng truy cập đáng kể, nó sẽ trở nên rất chậm. Giải pháp rõ ràng là chuyển sang một công cụ lưu trữ khác có thể xử lý khối lượng đọc/ghi nặng, nhưng người dùng cố gắng điều này đôi khi rất ngạc nhiên khi thấy rằng hệ thống chạy chậm hơn so với trước đây!

Điều mà những người dùng này không nhận ra là hệ thống đang sử dụng một truy vấn cụ thể, thông thường là một cái gì đó như thế này:

mysql> SELECT COUNT(*) FROM table;

Vấn đề là không phải tất cả các động cơ đều có thể chạy truy vấn đó một cách nhanh chóng: Myisam có thể, nhưng các động cơ khác có thể không. Có những ví dụ tương tự cho mọi động cơ. Các chương sau sẽ giúp bạn giữ một tình huống như vậy không làm bạn ngạc nhiên và chỉ cho bạn cách tìm và khắc phục các vấn đề nếu có.

Ứng dụng CD-ROM

Nếu bạn cần phân phối ứng dụng dựa trên CD-ROM hoặc DVD-ROM sử dụng các tệp dữ liệu MySQL, hãy xem xét sử dụng Myisam hoặc nén các bảng Myisam, có thể dễ dàng bị cô lập và sao chép vào các phương tiện khác. Các bảng Myisam nén sử dụng ít không gian hơn nhiều so với các bảng không nén, nhưng chúng chỉ đọc được. Điều này có thể có vấn đề trong một số ứng dụng nhất định, nhưng vì dữ liệu sẽ xuất hiện trên phương tiện chỉ đọc, nên có rất ít lý do để không sử dụng các bảng nén cho nhiệm vụ cụ thể này.

Khối lượng dữ liệu lớn

Làm thế nào lớn là quá lớn? Chúng tôi đã xây dựng và quản lý, hoặc đã giúp xây dựng và quản lý cơ sở dữ liệu InnoDB của InnoDB trong phạm vi 3 TB đến 5 TB, hoặc thậm chí lớn hơn. Đó là trên một máy chủ duy nhất, không bị che khuất. Nó hoàn toàn khả thi, mặc dù bạn phải chọn phần cứng một cách khôn ngoan, thực hành thiết kế vật lý thông minh và lập kế hoạch cho máy chủ của bạn bị ràng buộc I/O. Ở những kích cỡ này, Myisam chỉ là một cơn ác mộng khi nó gặp sự cố.

Nếu bạn đang thực sự lớn, chẳng hạn như hàng chục terabyte, bạn có thể xây dựng một kho dữ liệu. Trong trường hợp này, Infobright là nơi chúng tôi đã thấy thành công nhất. Một số cơ sở dữ liệu rất lớn mà aren phù hợp với thông tin có thể là ứng cử viên cho TOKUDB.

Chuyển đổi bảng

Có một số cách để chuyển đổi một bảng từ công cụ lưu trữ này sang công cụ lưu trữ khác, mỗi cách có ưu điểm và nhược điểm. Trong các phần sau, chúng tôi bao gồm ba trong số các cách phổ biến nhất.

Thay đổi bảng

Cách dễ nhất để di chuyển bàn từ động cơ này sang động cơ khác là với một tuyên bố

mysql> SELECT COUNT(*) FROM table;
5. Lệnh sau đây chuyển đổi
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
51 thành innodb:

mysql> ALTER TABLE mytable ENGINE = InnoDB;

Cú pháp này hoạt động cho tất cả các công cụ lưu trữ, nhưng có một điều bắt được: nó có thể mất rất nhiều thời gian. MySQL sẽ thực hiện một bản sao từng hàng của bảng cũ của bạn vào một bảng mới. Trong thời gian đó, bạn có thể sẽ sử dụng tất cả công suất I/O của máy chủ và bảng ban đầu sẽ được đọc trong khi chuyển đổi chạy. Vì vậy, hãy cẩn thận trước khi thử kỹ thuật này trên một bàn bận rộn. Thay vào đó, bạn có thể sử dụng một trong các phương thức được thảo luận tiếp theo, liên quan đến việc tạo một bản sao của bảng trước.

Khi bạn chuyển đổi từ công cụ lưu trữ này sang công cụ lưu trữ khác, bất kỳ tính năng cụ thể nào của động cơ lưu trữ đều bị mất. Ví dụ: nếu bạn chuyển đổi một bảng Innodb sang Myisam và quay lại, bạn sẽ mất bất kỳ khóa nước ngoài nào được xác định ban đầu trên bảng Innodb.

Bãi rác và nhập khẩu

Để có được quyền kiểm soát nhiều hơn đối với quy trình chuyển đổi, trước tiên bạn có thể chọn đổ bảng vào tệp văn bản bằng tiện ích MySQLDump. Khi bạn đã bỏ bảng, bạn có thể chỉ cần chỉnh sửa tệp kết xuất để điều chỉnh câu lệnh

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
52 mà nó chứa. Hãy chắc chắn thay đổi tên bảng cũng như loại của nó, vì bạn không thể có hai bảng có cùng tên trong cùng một cơ sở dữ liệu ngay cả khi chúng thuộc các loại khác nhau và MySQLDump mặc định để viết lệnh
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
53 trước
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
52, vì vậy Bạn có thể mất dữ liệu của bạn nếu bạn không cẩn thận!mysqldump utility. Once you’ve dumped the table, you can simply edit the dump file to adjust the
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
52 statement it contains. Be sure to change the table name as well as its type, because you can’t have two tables with the same name in the same database even if they are of different types—and mysqldump defaults to writing a
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
53 command before the
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
52, so you might lose your data if you are not careful!

Tạo và chọn

Kỹ thuật chuyển đổi thứ ba là sự thỏa hiệp giữa tốc độ cơ chế đầu tiên và sự an toàn của thứ hai. Thay vì bỏ toàn bộ bảng hoặc chuyển đổi tất cả cùng một lúc, tạo bảng mới và sử dụng cú pháp MySQL,

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
55 để điền vào nó, như sau:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Điều đó hoạt động tốt nếu bạn không có nhiều dữ liệu, nhưng nếu bạn làm vậy, thì nó thường hiệu quả hơn để điền vào bảng, thực hiện giao dịch giữa mỗi đoạn để các bản ghi hoàn tác không phát triển lớn. Giả sử rằng

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
56 là khóa chính, hãy chạy truy vấn này nhiều lần (sử dụng các giá trị lớn hơn là
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
57 và
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
58 mỗi lần) cho đến khi bạn sao chép tất cả dữ liệu vào bảng mới:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
    -> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Sau khi làm như vậy, bạn sẽ bị bỏ lại với bảng ban đầu, bạn có thể thả khi bạn thực hiện với nó và bảng mới, hiện được điền đầy đủ. Hãy cẩn thận để khóa bảng gốc nếu cần để ngăn chặn một bản sao không nhất quán của dữ liệu!

Các công cụ như Percona Toolkit từ PT-online-Schema-Change (dựa trên kỹ thuật thay đổi lược đồ trực tuyến Facebook của Facebook) có thể loại bỏ công việc thủ công dễ bị lỗi và tẻ nhạt khỏi thay đổi lược đồ.pt-online-schema-change (based on Facebook’s online schema change technique) can remove the error-prone and tedious manual work from schema changes.

Dòng thời gian MySQL

Thật hữu ích khi hiểu lịch sử phiên bản MySQL, như là một khung tham chiếu khi chọn phiên bản nào của máy chủ bạn muốn chạy. Thêm vào đó, nó rất thú vị cho những người chơi thời gian cũ để nhớ những gì nó đã từng như thế nào trong những ngày xưa tốt đẹp!

Phiên bản 3.23 (2001)

Bản phát hành MySQL này thường được coi là thời điểm MySQL đã đến và trở thành một lựa chọn khả thi để sử dụng rộng rãi. MySQL vẫn không nhiều hơn một ngôn ngữ truy vấn trên các tệp phẳng, nhưng Myisam đã được giới thiệu để thay thế ISAM, một công cụ lưu trữ cũ hơn và hạn chế hơn nhiều. Innodb đã có sẵn, nhưng không được vận chuyển trong phân phối nhị phân tiêu chuẩn vì nó quá mới. Nếu bạn muốn sử dụng Innodb, bạn phải tự biên dịch máy chủ với sự hỗ trợ cho nó. Phiên bản 3.23 đã giới thiệu lập chỉ mục và sao chép toàn văn. Sự nhân rộng là để trở thành tính năng giết người đã thúc đẩy MySQL nổi tiếng như cơ sở dữ liệu cung cấp nhiều cho nhiều internet.

Phiên bản 4.0 (2003)

Các tính năng cú pháp mới xuất hiện, chẳng hạn như hỗ trợ cho các câu lệnh

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
59 và đa bảng ____. Sao chép đã được viết lại để sử dụng hai luồng trên bản sao, thay vì một chủ đề đã thực hiện tất cả các công việc và phải chịu đựng việc chuyển đổi nhiệm vụ. Innodb được vận chuyển như một phần tiêu chuẩn của máy chủ, với bộ tính năng đầy đủ của nó: khóa cấp hàng, khóa nước ngoài, v.v. Bộ đệm truy vấn đã được giới thiệu trong phiên bản 4.0 (và đã thay đổi nhiều kể từ đó). Hỗ trợ cho các kết nối SSL cũng đã được giới thiệu.

Phiên bản 4.1 (2005)

Nhiều tính năng cú pháp truy vấn hơn đã được giới thiệu, bao gồm các nhóm con và

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
61. Bộ ký tự UTF-8 được hỗ trợ. Có một giao thức nhị phân mới và hỗ trợ tuyên bố được chuẩn bị.

Phiên bản 5.0 (2006)

Một số tính năng của Enterprise Enterprise đã xuất hiện trong bản phát hành này: lượt xem, kích hoạt, quy trình lưu trữ và các chức năng được lưu trữ. Động cơ ISAM đã được loại bỏ hoàn toàn, nhưng các công cụ lưu trữ mới như Federated đã được giới thiệu.

Phiên bản 5.1 (2008)

Bản phát hành này là bản phát hành đầu tiên dưới quyền sở hữu của Sun Microsystems sau khi mua lại MySQL AB, và đã hơn năm năm thực hiện. Phiên bản 5.1 đã giới thiệu phân vùng, sao chép dựa trên hàng và một loạt các API plugin, bao gồm API công cụ lưu trữ có thể cắm được. Công cụ lưu trữ BerkeleyDB, công cụ lưu trữ giao dịch đầu tiên của MyseleyDB đã bị loại bỏ và một số công cụ khác, chẳng hạn như liên kết, đã không được chấp nhận. Ngoài ra, Oracle, hiện là chủ sở hữu của Innobase Oy, [8] đã phát hành công cụ lưu trữ plugin Innodb.

Phiên bản 5.5 (2010)

MySQL 5.5 là bản phát hành đầu tiên sau khi mua lại Sun (và do đó là MySQL). Nó tập trung vào các cải tiến về hiệu suất, khả năng mở rộng, sao chép, phân vùng và hỗ trợ cho Microsoft Windows, nhưng cũng bao gồm nhiều cải tiến khác. Innodb trở thành công cụ lưu trữ mặc định, và nhiều tính năng kế thừa và các tùy chọn và hành vi không dùng nữa đã được chà. Cơ sở dữ liệu

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
62
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
63 đã được thêm vào, cùng với một loạt thiết bị nâng cao đầu tiên. API plugin mới để sao chép, xác thực và kiểm toán đã được thêm vào. Một plugin để sao chép bán nguyệt đã có sẵn, và Oracle đã phát hành các plugin thương mại để xác thực và gộp chủ đề vào năm 2011. Cũng có những thay đổi kiến ​​trúc lớn đối với InnoDB, chẳng hạn như nhóm đệm được phân vùng.

Phiên bản 5.6 (chưa phát hành)

MySQL 5.6 sẽ có một loạt các tính năng mới, bao gồm các cải tiến lớn đầu tiên cho trình tối ưu hóa truy vấn trong nhiều năm, nhiều API plugin hơn (ví dụ: một cho tìm kiếm toàn văn), cải tiến sao chép và thiết bị mở rộng đáng kể trong cơ sở dữ liệu

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
64. Nhóm Innodb cũng rất khó khăn, với rất nhiều thay đổi và cải tiến đã được phát hành trong các mốc phát triển và xem trước phòng thí nghiệm. Trong khi MySQL 5.5 dường như là về việc làm nổi bật và sửa chữa các nguyên tắc cơ bản, với số lượng giới thiệu mới, MySQL 5.6 dường như tập trung vào việc thúc đẩy phát triển và thực hiện máy chủ, sử dụng thành công 5.5.

Phiên bản 6.0 (bị hủy)

Phiên bản 6.0 khó hiểu vì niên đại chồng chéo. Nó đã được công bố trong những năm phát triển 5.1. Có tin đồn hoặc lời hứa về nhiều tính năng mới, chẳng hạn như sao lưu trực tuyến và khóa nước ngoài cấp máy chủ cho tất cả các công cụ lưu trữ, cải tiến dưới mức và gộp chủ đề. Bản phát hành này đã bị hủy và Sun nối lại phát triển với phiên bản 5.4, cuối cùng được phát hành dưới dạng phiên bản 5.5. Nhiều tính năng của cơ sở mã 6.0 đã được phát hành (hoặc sẽ) trong các phiên bản 5.5 và 5.6.

Chúng tôi sẽ tóm tắt lịch sử của MySQL theo cách này: Đó rõ ràng là một sự đổi mới đột phá [9] ngay từ đầu trong vòng đời của nó, với chức năng hạng hai và đôi khi của nó, nhưng các tính năng của nó và giá thấp đã khiến nó trở thành một ứng dụng giết người để cung cấp năng lượng . Vào đầu các bản phát hành 5.x, nó đã cố gắng di chuyển vào lãnh thổ doanh nghiệp với các tính năng như tầm nhìn và thủ tục được lưu trữ, nhưng đây là những lỗi và giòn, do đó, nó luôn luôn thuận buồm xuôi gió. Nhìn nhận lại, lũ sửa lỗi lỗi MySQL 5.0 đã không ổn định cho đến khoảng các phiên bản 5.0.50 và MySQL 5.1 đã không có giá vé tốt hơn nhiều. Các bản phát hành 5.0 và 5.1 đã bị trì hoãn, và việc mua lại Mặt trời và Oracle khiến nhiều nhà quan sát sợ hãi. Nhưng theo ý kiến ​​của chúng tôi, mọi thứ đang đi đúng hướng: MySQL 5.5 là bản phát hành chất lượng cao nhất trong lịch sử MySQL, sở hữu của Oracle, đang làm cho MySQL trở nên ngon miệng hơn nhiều đối với khách hàng doanh nghiệp và phiên bản 5.6 hứa hẹn những cải thiện tuyệt vời về chức năng và hiệu suất.

Nói về hiệu suất, chúng tôi nghĩ rằng sẽ rất thú vị khi hiển thị một chuẩn mực cơ bản về hiệu suất của máy chủ theo thời gian. Chúng tôi đã quyết định không các phiên bản điểm chuẩn cũ hơn 4.1, bởi vì nó rất hiếm khi thấy 4.0 trở lên trong sản xuất những ngày này. Ngoài ra, một điểm chuẩn táo sang táo rất khó sản xuất trên rất nhiều phiên bản khác nhau, vì lý do bạn sẽ đọc thêm về chương tiếp theo. Chúng tôi đã có rất nhiều niềm vui khi tạo ra một phương pháp điểm chuẩn sẽ hoạt động đồng đều trên các phiên bản máy chủ mà chúng tôi đã sử dụng và phải mất nhiều lần để làm cho nó đúng. Bảng & NBSP; 1-2 cho thấy kết quả trong các giao dịch mỗi giây trong một số cấp độ đồng thời.

Bảng & NBSP; 1-2. & NBSP; Điểm chuẩn đọc của một số phiên bản MySQL

Chủ đề

MySQL 4.1

MySQL 5.0

MySQL 5.1

MySQL 5.1 với plugin innodb

MySQL 5.5

MySQL 5.6 [A]

1

686

640

596

594

531

526

2

1307

1221

1140

1139

1077

1019

4

2275

2168

2032

2043

1938

1831

8

3879

3746

3606

3681

3523

3320

16

4374

4527

4393

6131

5881

5573

32

4591

4864

4698

7762

7549

7139

64

4688

5078

4910

7536

7269

6994

[A] Tại thời điểm điểm chuẩn của chúng tôi, MySQL 5.6 chưa được phát hành dưới dạng GA.

Điều này dễ dàng hơn một chút để thấy ở dạng đồ họa, mà chúng tôi đã hiển thị trong Hình & NBSP; 1-2.

Hướng dẫn how does mysql store data? - mysql lưu trữ dữ liệu như thế nào?

Hình & NBSP; 1-2. & NBSP; Điểm chuẩn đọc của một số phiên bản MySQL

Trước khi chúng tôi giải thích kết quả, chúng tôi cần cho bạn biết một chút về điểm chuẩn. Chúng tôi đã chạy nó trên máy Cisco UCS C250 của chúng tôi, có hai CPU sáu lõi, mỗi CPU có hai luồng phần cứng. Máy chủ chứa 384 GB RAM, nhưng chúng tôi đã chạy điểm chuẩn với bộ dữ liệu 2,5 GB, vì vậy chúng tôi đã cấu hình MySQL với nhóm đệm 4 GB. Điểm chuẩn là khối lượng công việc chỉ đọc Sysbench tiêu chuẩn, với tất cả dữ liệu trong Innodb, hoàn toàn trong bộ nhớ và giới hạn CPU. Chúng tôi đã chạy điểm chuẩn trong 60 phút cho mỗi điểm đo, đo thông lượng cứ sau 10 giây và sử dụng 900 giây đo sau khi máy chủ nóng lên và ổn định để tạo kết quả cuối cùng.

Bây giờ, nhìn vào kết quả, hai xu hướng rộng là rõ ràng. Đầu tiên, các phiên bản MySQL bao gồm plugin Innodb hoạt động tốt hơn nhiều ở mức độ đồng thời cao hơn, nghĩa là chúng có thể mở rộng hơn. Điều này được mong đợi, bởi vì chúng tôi biết các phiên bản cũ hơn bị hạn chế nghiêm trọng ở mức độ đồng thời cao. Thứ hai, các phiên bản MySQL mới hơn chậm hơn các phiên bản cũ hơn trong khối lượng công việc đơn luồng, mà bạn có thể không mong đợi nhưng dễ dàng giải thích bằng cách lưu ý rằng đây là khối lượng công việc chỉ đọc rất đơn giản. Các phiên bản máy chủ mới hơn có ngữ pháp SQL phức tạp hơn và rất nhiều tính năng và cải tiến khác cho phép các truy vấn phức tạp hơn nhưng chỉ đơn giản là chi phí bổ sung cho các truy vấn đơn giản mà chúng tôi đang chuẩn bị ở đây. Các phiên bản cũ hơn của máy chủ đơn giản hơn và do đó có lợi thế cho các truy vấn đơn giản.

Chúng tôi muốn cho bạn thấy một điểm chuẩn đọc/ghi phức tạp hơn (chẳng hạn như TPC-C) trong phạm vi đồng thời rộng hơn, nhưng chúng tôi thấy cuối cùng không thể thực hiện được sự đa dạng của các phiên bản máy chủ như vậy. Chúng ta có thể nói rằng nói chung, các phiên bản mới hơn của máy chủ có hiệu suất tốt hơn và phù hợp hơn trên khối lượng công việc phức tạp hơn, đặc biệt là ở mức độ đồng thời cao hơn và với bộ dữ liệu lớn hơn.

Bạn nên sử dụng phiên bản nào? Điều này phụ thuộc vào doanh nghiệp của bạn nhiều hơn là nhu cầu kỹ thuật của bạn. Bạn nên xây dựng một cách lý tưởng trên phiên bản mới nhất mà có sẵn, nhưng tất nhiên bạn có thể chọn đợi cho đến khi các lỗi đầu tiên được thực hiện từ một bản phát hành hoàn toàn mới. Nếu bạn đang xây dựng một ứng dụng mà không có trong sản xuất, bạn thậm chí có thể xem xét việc xây dựng nó trên bản phát hành sắp tới để bạn trì hoãn vòng đời nâng cấp của mình càng nhiều càng tốt.

Mô hình phát triển MySQL từ

Mô hình phát hành và phát hành phát triển của MySQL, đã thay đổi rất nhiều trong những năm qua, nhưng bây giờ dường như đã ổn định thành một nhịp điệu ổn định. Oracle phát hành các mốc phát triển mới theo định kỳ, với các bản xem trước các tính năng cuối cùng sẽ được đưa vào bản phát hành GA [10] tiếp theo. Đây là để thử nghiệm và phản hồi, không phải để sử dụng sản xuất, mà là tuyên bố của Oracle, là họ có chất lượng cao và về cơ bản sẵn sàng phát hành bất cứ lúc nào và chúng tôi không thấy lý do gì để không đồng ý với điều đó. Oracle cũng định kỳ phát hành các bản xem trước trong phòng thí nghiệm, là các bản dựng đặc biệt chỉ bao gồm một tính năng được chọn cho các bên quan tâm để đánh giá. Các tính năng này không được đảm bảo sẽ được đưa vào bản phát hành tiếp theo của máy chủ. Và cuối cùng, thỉnh thoảng Oracle sẽ gói các tính năng mà nó cho là đã sẵn sàng và gửi một bản phát hành GA mới của máy chủ.

MySQL vẫn được cấp phép GPL và nguồn mở, với mã nguồn đầy đủ (ngoại trừ các plugin được cấp phép thương mại, tất nhiên) có sẵn cho cộng đồng. Oracle dường như hiểu rằng sẽ không khôn ngoan khi gửi các phiên bản khác nhau của máy chủ cho cộng đồng và khách hàng trả tiền của nó. MySQL AB đã thử điều đó, dẫn đến việc khách hàng trả tiền trở thành chuột lang tiên tiến, cướp đi lợi ích của việc thử nghiệm và phản hồi của cộng đồng. Chính sách đó là mặt trái của những gì khách hàng doanh nghiệp cần, và đã bị ngừng trong những ngày mặt trời.

Bây giờ, Oracle đang phát hành một số plugin máy chủ chỉ để trả cho khách hàng, MySQL dành cho tất cả ý định và mục đích theo mô hình được gọi là mô hình mở. Mặc dù có một số tiếng lẩm bẩm về việc phát hành các plugin độc quyền cho máy chủ, nhưng nó đến từ một thiểu số và đôi khi đã được phóng đại. Hầu hết người dùng MySQL mà chúng ta biết (và chúng ta biết rất nhiều người trong số họ) dường như không quan tâm. Các plugin chỉ được cấp phép thương mại, chỉ có thể chấp nhận được đối với những người dùng thực sự cần chúng.

Trong mọi trường hợp, các phần mở rộng độc quyền chỉ là: các phần mở rộng. Chúng không đại diện cho một mô hình phát triển phần mềm Cripple và máy chủ là quá đủ mà không có chúng. Thành thật mà nói, chúng tôi đánh giá cao cách mà Oracle đang xây dựng nhiều tính năng hơn như các plugin. Nếu các tính năng được xây dựng ngay vào máy chủ mà không có API, sẽ không có sự lựa chọn nào: bạn sẽ có được chính xác một triển khai, với cơ hội hạn chế để xây dựng một cái gì đó phù hợp với bạn hơn. Ví dụ: nếu Oracle cuối cùng phát hành chức năng tìm kiếm toàn văn bản Innodb, dưới dạng plugin, thì đó sẽ là cơ hội để sử dụng cùng một API để phát triển một plugin tương tự cho Sphinx hoặc Lucene, mà nhiều người có thể thấy hữu ích hơn. Chúng tôi cũng đánh giá cao API sạch bên trong máy chủ. Họ giúp thúc đẩy mã chất lượng cao hơn và ai không muốn điều đó?

Bản tóm tắt

MySQL có kiến ​​trúc xếp lớp, với các dịch vụ toàn bộ máy chủ và thực thi truy vấn trên đầu và các công cụ lưu trữ bên dưới. Mặc dù có nhiều API plugin khác nhau, API công cụ lưu trữ là quan trọng nhất. Nếu bạn hiểu rằng MySQL thực hiện các truy vấn bằng cách đưa các hàng qua lại trên API công cụ lưu trữ, bạn đã nắm bắt được một trong những nguyên tắc cơ bản cốt lõi của kiến ​​trúc máy chủ.

MySQL được xây dựng xung quanh ISAM (và sau đó là Myisam), và nhiều công cụ và giao dịch lưu trữ đã được thêm vào sau đó. Nhiều người trong số các máy chủ quirks phản ánh di sản này. Ví dụ: cách MySQL cam kết giao dịch khi bạn thực hiện

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
65 là kết quả trực tiếp của kiến ​​trúc công cụ lưu trữ, cũng như thực tế là từ điển dữ liệu được lưu trữ trong các tệp .frm. ..frm files. (There’s nothing in InnoDB that forces an
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
66 to be nontransactional, by the way; absolutely everything InnoDB does is transactional.)

API công cụ lưu trữ có nhược điểm của nó. Đôi khi, sự lựa chọn không phải là một điều tốt, và sự bùng nổ của các động cơ lưu trữ trong những ngày đầu của phiên bản 5.0 và 5.1 của MySQL có thể đã đưa ra quá nhiều sự lựa chọn. Cuối cùng, Innodb hóa ra là một công cụ lưu trữ rất tốt cho một cái gì đó như 95% người dùng trở lên (đó chỉ là một phỏng đoán sơ bộ). Tất cả những động cơ khác thường chỉ làm cho mọi thứ phức tạp và dễ vỡ hơn, mặc dù có những trường hợp đặc biệt trong đó một sự thay thế chắc chắn được yêu cầu.

Việc mua lại Oracle của First Innodb và sau đó MySQL đã mang cả hai sản phẩm dưới một mái nhà, nơi chúng có thể được phát triển. Điều này dường như đang hoạt động tốt cho tất cả mọi người: Innodb và bản thân máy chủ đang trở nên tốt hơn bằng những bước nhảy vọt theo nhiều cách, MySQL vẫn là nguồn mở và hoàn toàn mở, cộng đồng và khách hàng đang nhận được một cơ sở dữ liệu vững chắc và ổn định và Máy chủ đang trở nên mở rộng và hữu ích hơn bao giờ hết.

Dữ liệu được lưu trữ trong cơ sở dữ liệu MySQL như thế nào?

MySQL lưu trữ mỗi cơ sở dữ liệu (còn được gọi là lược đồ) như một thư mục con của thư mục dữ liệu của nó trong hệ thống tập tin cơ bản. Khi bạn tạo một bảng, MySQL lưu trữ định nghĩa bảng trong a. Tệp FRM có cùng tên với bảng. Do đó, khi bạn tạo một bảng có tên MyTable, MySQL sẽ lưu trữ định nghĩa bảng trong mytable.as a subdirectory of its data directory in the underlying filesystem. When you create a table, MySQL stores the table definition in a . frm file with the same name as the table. Thus, when you create a table named MyTable , MySQL stores the table definition in MyTable.

MySQL lưu trữ dữ liệu của nó ở đâu?

Giới thiệu. Thông thường, MySQL sẽ lưu trữ dữ liệu trong thư mục mặc định của/var/lib/mysql./var/lib/mysql.

MySQL có lưu trữ dữ liệu trong bộ nhớ không?

MySQL yêu cầu bộ nhớ và mô tả cho bộ đệm bảng.Các cấu trúc xử lý cho tất cả các bảng sử dụng được lưu trong bộ đệm bảng và được quản lý dưới dạng đầu tiên, đầu tiên ra khỏi (FIFO).Biến hệ thống TAGE_OPEN_CACHE xác định kích thước bộ đệm bảng ban đầu;Xem Phần 8.4.3.1, Cách mà MySQL mở ra và đóng bảng.. Handler structures for all in-use tables are saved in the table cache and managed as “First In, First Out” (FIFO). The table_open_cache system variable defines the initial table cache size; see Section 8.4. 3.1, “How MySQL Opens and Closes Tables”.

Những loại dữ liệu được lưu trữ trong MySQL?

Cơ sở dữ liệu MySQL là quan hệ.Một cơ sở dữ liệu quan hệ lưu trữ dữ liệu trong các bảng riêng biệt thay vì đặt tất cả dữ liệu vào một kho lưu trữ lớn.Các cấu trúc cơ sở dữ liệu được tổ chức thành các tệp vật lý được tối ưu hóa cho tốc độ.A relational database stores data in separate tables rather than putting all the data in one big storeroom. The database structures are organized into physical files optimized for speed.