Cassandra Ngôn ngữ truy vấn (CQL): Chèn, cập nhật và xóa

⚡ Tóm tắt thông minh

Cassandra Ngôn ngữ truy vấn (Query Language) xử lý các thao tác chèn, cập nhật, xóa và đọc với cú pháp gần giống SQL nhưng ngữ nghĩa bên dưới khác biệt. Trang này sẽ trình bày chi tiết từng câu lệnh, hành vi upsert (kết hợp chèn và cập nhật), và những giới hạn thực sự của mệnh đề WHERE.

  • Chèn hành vi: Chỉ có khóa chính là bắt buộc, các cột bị bỏ qua sẽ không chiếm dung lượng lưu trữ.
  • 🔄 Ngữ nghĩa Upsert: Thao tác chèn và cập nhật là cùng một thao tác, vì vậy việc ghi đè lên một khóa hiện có sẽ tự động ghi đè lên khóa đó.
  • 🗑️ Xóa chi phí: Các hàng bị xóa sẽ trở thành bia mộ và chỉ biến mất sau khi quá trình nén hoàn tất.
  • 🔍 Điều khoản giới hạn ở đâu: Chức năng lọc hoạt động trên các cột khóa chính, hoặc trên các cột khác sau khi đã có chỉ mục.
  • 📊 Hỗ trợ tổng hợp: Đếm, Giá trị nhỏ nhất, Giá trị lớn nhất, Tổng. AVG Các lệnh GROUP BY được hỗ trợ, tuy nhiên chỉ hoạt động hiệu quả trong phạm vi một phân vùng.
  • 🚫 Vẫn chưa được hỗ trợ: Các phép nối, điều kiện OR và phân tích đa phân vùng vẫn nằm ngoài CQL theo thiết kế.

Cassandra Chèn, cập nhật, xóa bằng CQL.

Chèn dữ liệu

Cassandra câu lệnh chèn ghi dữ liệu vào Cassandra cột ở dạng hàng. Cassandra truy vấn chèn sẽ chỉ lưu trữ những cột do người dùng cung cấp. Bạn nhất thiết phải chỉ định cột khóa chính.

Nó sẽ không chiếm bất kỳ khoảng trống nào cho các giá trị không được đưa ra. Không có kết quả nào được trả về sau khi chèn.

cú pháp

INSERT INTO KeyspaceName.TableName (ColumnName1, ColumnName2, ColumnName3)
VALUES (Column1Value, Column2Value, Column3Value);

Ví dụ

Đây là ảnh chụp nhanh của việc thực hiện Cassandra Chèn vào truy vấn bảng sẽ chèn một bản ghi vào Cassandra bảng 'Sinh viên'.

Chèn dữ liệu

INSERT INTO University.Student (RollNo, Name, dept, Semester)
VALUES (2, 'Michael', 'CS', 2);

Sau khi thực hiện thành công lệnh Insert vào Cassandra, một hàng sẽ được chèn vào Cassandra bảng Học sinh có RollNo 2, Tên Michael, khoa CS và Học kỳ 2.

Đây là ảnh chụp nhanh về trạng thái cơ sở dữ liệu hiện tại.

Chèn dữ liệu

Cập nhật dữ liệu

Cassandra không ủng hộ. Upsert có nghĩa là Cassandra sẽ chèn một hàng nếu khóa chính chưa tồn tại, ngược lại nếu khóa chính đã tồn tại, nó sẽ cập nhật hàng đó.

Điều này dẫn đến một hệ quả thực tiễn cần được nêu rõ: lệnh INSERT không bao giờ báo lỗi khóa trùng lặp, vì vậy việc chèn lại dữ liệu một cách vô tình sẽ ghi đè lên hàng hiện có mà không có cảnh báo. Khi cần ngăn chặn điều đó, hãy thêm IF NOT EXISTS để biến câu lệnh thành một giao dịch nhẹ.

INSERT INTO University.Student (RollNo, Name)
VALUES (2, 'Michael') IF NOT EXISTS;

Các giao dịch nhẹ sử dụng vòng đồng thuận giữa các bản sao, do đó chúng chậm hơn đáng kể so với thao tác ghi thông thường và chỉ nên được dành cho các trường hợp thực sự cần kiểm tra.

Cập nhật dữ liệu

Cassandra Truy vấn cập nhật được sử dụng để cập nhật dữ liệu trong Cassandra bàn. Nếu không có kết quả nào được trả về sau khi cập nhật dữ liệu, điều đó có nghĩa là dữ liệu đã được cập nhật thành công, nếu không sẽ trả về lỗi. Giá trị cột được thay đổi trong mệnh đề 'Set' trong khi dữ liệu được lọc bằng mệnh đề 'Where'.

cú pháp

UPDATE KeyspaceName.TableName
SET ColumnName1 = NewValue1,
    ColumnName2 = NewValue2
WHERE ColumnName = ColumnValue;

Ví dụ

Đây là ảnh chụp màn hình hiển thị trạng thái cơ sở dữ liệu trước khi cập nhật dữ liệu.

Cập nhật dữ liệu

Đây là ảnh chụp nhanh của việc thực hiện Cassandra Lệnh cập nhật cập nhật bản ghi trong bảng Sinh viên.

Cập nhật dữ liệu

UPDATE University.Student
SET name = 'Hayden'
WHERE rollno = 1;

Sau khi thực hiện thành công truy vấn cập nhật trong Cassandra 'Cập nhật sinh viên', tên sinh viên sẽ được đổi từ 'Clark' thành 'Hayden' có số 1.

Đây là ảnh chụp màn hình hiển thị trạng thái cơ sở dữ liệu sau khi cập nhật dữ liệu.

Cập nhật dữ liệu

Do cơ chế upsert, thao tác UPDATE đối với khóa chính không tồn tại sẽ tạo ra hàng đó thay vì báo lỗi.

Cassandra Xóa dữ liệu

Lệnh 'Xóa' xóa toàn bộ một hàng hoặc một số cột khỏi bảng Học sinh. Khi dữ liệu bị xóa, nó không bị xóa khỏi bảng ngay lập tức. Thay vào đó, dữ liệu đã xóa sẽ được đánh dấu bằng bia mộ và bị xóa sau khi nén.

cú pháp

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Trên đây Cassandra Cú pháp xóa hàng sẽ xóa một hoặc nhiều hàng tùy thuộc vào việc lọc dữ liệu trong mệnh đề Where.

DELETE ColumnName1, ColumnName2 FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Cú pháp trên sẽ xóa một số cột khỏi bảng.

Ví dụ

Đây là ảnh chụp nhanh hiển thị trạng thái cơ sở dữ liệu hiện tại trước khi xóa dữ liệu.

Cassandra Xóa dữ liệu

Đây là ảnh chụp nhanh của lệnh sẽ xóa một hàng khỏi bảng Sinh viên.

Cassandra Xóa dữ liệu

DELETE FROM University.Student WHERE rollno = 1;

Sau khi thực thi thành công lệnh CQL Delete, một hàng sẽ bị xóa khỏi bảng Student tại vị trí có giá trị rollno là 1.

Đây là ảnh chụp nhanh hiển thị trạng thái cơ sở dữ liệu sau khi xóa dữ liệu.

Cassandra Xóa dữ liệu

Các bản ghi đánh dấu xóa (tombstones) tồn tại trong gc_grace_seconds, mặc định là mười ngày, để một nút ngoại tuyến trong quá trình xóa không thể khôi phục hàng đó khi nó quay lại. Do đó, việc xóa các khối lượng lớn sẽ để lại các dấu hiệu mà mọi lần đọc tiếp theo phải quét qua.

Điều gì Cassandra không hỗ trợ

CQL mượn cú pháp của SQL nhưng không mượn mô hình thực thi quan hệ, vì vậy một số cấu trúc quen thuộc hoạt động khác nhau hoặc không tồn tại.

  1. CQL không hỗ trợ phép nối giữa các bảng. Dữ liệu liên quan phải được chuẩn hóa lại và đưa vào một bảng duy nhất tại thời điểm ghi.
  2. CQL không hỗ trợ điều kiện OR trong mệnh đề WHERE. Hãy sử dụng IN trên một cột duy nhất, hoặc chạy các truy vấn riêng biệt.
  3. CQL không hỗ trợ UNION hoặc INTERSECT.
  4. Các cột không phải khóa chính không thể được lọc cho đến khi có chỉ mục trên chúng.
  5. Các phép so sánh lớn hơn và nhỏ hơn chỉ áp dụng cho các cột nhóm, vì chỉ những cột đó mới được sắp xếp trên đĩa.
  6. Việc khớp mẫu với LIKE yêu cầu chỉ mục SASI và không khả dụng trên các cột thông thường.

Một tuyên bố đã tồn tại từ lâu cần được đính chính. Các hàm tổng hợp được hỗ trợ: ĐẾM, GIÁ TRỊ NHỎ NHẤT, GIÁ TRỊ LỚN NHẤT, T� AVG đến Cassandra 2.2, và NHÓM THEO Đã có mặt trong phiên bản 3.10. Lưu ý là phạm vi áp dụng chứ không phải tính khả dụng.

SELECT dept, COUNT(*) FROM University.Student
WHERE RollNo = 1 GROUP BY dept;

Khi chỉ giới hạn trong một phân vùng như trên, phép tổng hợp rất hiệu quả. Nhưng khi thực hiện trên toàn bộ bảng, nó trở thành một quá trình quét trên toàn cụm, đó là lý do tại sao... Cassandra vẫn không phù hợp cho phân tích ad hoc và đó là lý do tại sao việc lập báo cáo chi tiết thường được đẩy mạnh. Spark hoặc kho ngoại vi.

Cassandra Trường hợp khoản

In Cassandra, việc truy xuất dữ liệu là một vấn đề nhạy cảm. Cột được lọc trong Cassandra bằng cách tạo chỉ mục trên các cột khóa không chính.

cú pháp

SELECT ColumnNames FROM KeyspaceName.TableName
WHERE ColumnName1 = Column1Value
  AND ColumnName2 = Column2Value;

Ví dụ

  • Dưới đây là ảnh chụp nhanh hiển thị quá trình truy xuất dữ liệu từ bảng Sinh viên mà không cần lọc dữ liệu.

Cassandra Trường hợp khoản

SELECT * FROM University.Student;

Hai bản ghi được lấy từ bảng Sinh viên.

  • Dưới đây là ảnh chụp nhanh hiển thị quá trình truy xuất dữ liệu từ Sinh viên bằng quá trình lọc dữ liệu. Một bản ghi được lấy ra.

Dữ liệu được lọc theo cột tên. Tất cả các bản ghi có tên bằng với đều được truy xuất. Guru99.

Cassandra Trường hợp khoản

SELECT * FROM University.Student WHERE name = 'Guru99';

Các quy tắc chi phối việc mệnh đề WHERE có thể tham chiếu đến cột nào xuất phát trực tiếp từ khóa chính.

  • khóa phân vùng Thông tin này phải được cung cấp đầy đủ để thực hiện bất kỳ truy vấn hiệu quả nào, vì nó xác định nút chứa dữ liệu.
  • Clustercột ing Sau đó, chúng có thể bị hạn chế, nhưng chỉ theo thứ tự đã được công bố. Bỏ quaping Một người bị từ chối.
  • Việc so sánh phạm vi chỉ được phép trên cột phân cụm cuối cùng được tham chiếu, chứ không phải trên các cột trước đó.
  • Bất kì cột khác cần một chỉ mục phụ, được đề cập trong tạo và xóa chỉ mục hướng dẫn.

Khi một truy vấn bị từ chối, Cassandra Thường thì nó đề xuất thêm tùy chọn ALLOW FILTERING. Hãy xem đó như một cảnh báo hơn là một giải pháp: nó quét mọi phân vùng trên mọi nút, và thay đổi lược đồ hầu như luôn là phản hồi đúng đắn.

Câu Hỏi Thường Gặp

Lệnh batch nhóm các câu lệnh lại với nhau để chúng thành công hoặc thất bại cùng lúc. Hãy sử dụng nó để giữ cho các bảng trùng lặp hoạt động đồng bộ, chứ không phải để tải dữ liệu hàng loạt, vì việc xử lý hàng loạt trên nhiều phân vùng sẽ làm chậm trình điều phối một cách đáng kể.

Trình điều khiển tự động phân trang bằng cách sử dụng mã thông báo trạng thái phân trang. Trong cqlsh, PAGING thiết lập kích thước. Tránh mô phỏng OFFSET bằng bộ đếm, bởi vì Cassandra không có phương pháp bỏ qua hàng hiệu quảping cơ chế.

Nếu bản sao bị lỗi lâu hơn gc_grace_seconds và bản ghi đánh dấu đã bị nén xong, bản sao đó vẫn giữ hàng dữ liệu cũ và phân bổ lại. Việc sửa chữa thường xuyên sẽ ngăn chặn điều này.

Các câu lệnh SELECT đơn giản trên một bảng duy nhất chuyển đổi tốt. Bất kỳ câu lệnh nào có JOIN, OR hoặc TRUY VẤN con đều không có CQL tương đương trực tiếp, và AI thường che đậy khoảng trống này bằng ALLOW FILTERING, điều này không phải là giải pháp.

Vâng. Dán TRACThông thường, lệnh ING ON sẽ hiển thị rõ ràng các thông tin về quét bản ghi đã xóa, phân vùng rộng hoặc các bước nhảy giữa các nút. Hãy xác minh thay đổi lược đồ được đề xuất trên một bản sao trước khi áp dụng.

Tóm tắt bài viết này với: