Việc thêm chỉ mục vào cơ sở dữ liệu Drupal có an toàn không?


12

Tôi đã tìm kiếm và đọc về điều này, nhưng tôi chưa thấy gì dứt khoát về chủ đề thêm chỉ mục vào các bảng Drupal (cả cốt lõi và đóng góp).

Mối quan tâm chính của tôi là những gì xảy ra với bất kỳ chỉ mục tùy chỉnh nào khi bạn cập nhật mã lõi hoặc mã đóng góp và có các thay đổi lược đồ. Điều gì xảy ra trong trường hợp này?

BIÊN TẬP:

Tôi nghĩ rằng một số bối cảnh có thể giúp đỡ. Tôi chủ yếu quan tâm đến việc thêm chỉ mục vào các bảng để điều chỉnh hiệu suất trang web (các truy vấn hiển thị trong nhật ký truy vấn chậm, các trang có chế độ xem chậm, v.v.). Điều này có thể liên quan đến việc thêm một chỉ mục vào một bảng trong mô-đun của người khác. Ví dụ

  1. Tôi cài đặt mô-đun foo
  2. Module foo tạo bảng foo
  3. Tôi thêm một chỉ mục vào bảng foo
  4. Mô-đun foocó bản cập nhật thay đổi lược đồ

Chuyện gì xảy ra

Câu trả lời:


7

Vâng, nó có thể dẫn đến các vấn đề.

Nếu một mô-đun muốn làm một cái gì đó với cột mà bạn đã thêm một chỉ mục, nó sẽ xóa các chỉ mục của chính nó và sau đó thực hiện bất kỳ thao tác nào nó dự định làm.

Chính xác những gì sẽ xảy ra sẽ phụ thuộc vào loại cơ sở dữ liệu của bạn và hoạt động thực sự được thực hiện. Ví dụ, việc đổi tên cột sẽ hoạt động tốt với MySQL, nhưng sẽ thất bại trên PostgreQuery. Nhưng nếu nó cố xóa cột đó (có thể sau khi di chuyển dữ liệu sang một bảng / colun khác), nó sẽ thất bại.

Khả năng điều này sẽ xảy ra là tương đối thấp, ít nhất là đối với các cập nhật nhỏ (tuy nhiên phụ thuộc vào mô-đun thực tế. Tôi thường không thêm bất kỳ thay đổi nào có thể phá vỡ điều gì đó cho các bản phát hành nhỏ), nhưng có thể.

Đề nghị của tôi sẽ là bạn cố gắng làm việc cùng với các nhà bảo trì mô-đun. Nếu các truy vấn / vấn đề có vấn đề là từ chính mô-đun, thì các nhà bảo trì có thể sẽ vui vẻ thêm các chỉ mục, nếu bạn cung cấp một bản vá. Cung cấp đầu ra MÔ TẢ của các truy vấn có vấn đề trước và sau khi thêm chỉ mục. Cũng cung cấp một bản vá cập nhật lược đồ (bao gồm chức năng cập nhật để đặt nó cho các cài đặt hiện có).

Một người nào đó đang tích cực làm việc với những thứ liên quan đến hiệu suất và thực hiện tốt những điều trên là bắt được, đây là một ví dụ: http://drupal.org/node/983950


2

Như đã báo cáo trong DatabaseSchema_pgsql :: changeField và trong db_change_field () :

LƯU Ý QUAN TRỌNG: Để duy trì tính di động của cơ sở dữ liệu, bạn phải tạo lại rõ ràng tất cả các chỉ mục và khóa chính đang sử dụng trường đã thay đổi.

Điều đó có nghĩa là bạn phải loại bỏ tất cả các khóa và chỉ mục bị ảnh hưởng bằng db_drop_ {primary_key, unique_key, index} () trước khi gọi db_change_field (). Để tạo lại các khóa và chỉ mục, hãy chuyển các định nghĩa khóa dưới dạng đối số $ new_keys tùy chọn trực tiếp cho db_change_field ().

Ví dụ: giả sử bạn có:

$schema['foo'] = array(
  'fields' => array(
    'bar' => array('type' => 'int', 'not null' => TRUE)
  ),
  'primary key' => array('bar')
);

và bạn muốn thay đổi foo.bar thành kiểu nối tiếp, để nó làm khóa chính. Trình tự đúng là:

db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
  array('type' => 'serial', 'not null' => TRUE),
  array('primary key' => array('bar'))
);

Mã tương tự được báo cáo cho Drupal 7.

Hãy nhớ rằng, theo kinh nghiệm của tôi, bạn không thể xóa khóa chính sử dụng trường nối tiếp. Trên Drupal 6, tôi đã gặp lỗi tất cả các lần tôi đã thử làm điều đó; Tôi đã không thử điều đó trên Drupal 7.

Ngoài ra, tôi không biết bất kỳ vấn đề nào khác mà bạn có thể gặp phải với các chỉ mục cơ sở dữ liệu.

Về việc thêm một chỉ mục vào bảng cơ sở dữ liệu được tạo từ một mô-đun khác, tôi không khuyên bạn nên làm điều đó, bởi vì:

  • Một mô-đun không bỏ chỉ mục cho một trường đang được thay đổi, nếu chính mô-đun đó không tạo ra chỉ mục đó. Mô-đun sẽ không thể làm điều đó vì nó không biết tên của chỉ mục.
  • Sửa đổi bảng cơ sở dữ liệu được tạo bởi một mô-đun khác không bao giờ là một ý tưởng hay, ngay cả trong trường hợp mô-đun là mô-đun lõi. Nếu có một mô-đun khác thay đổi cùng một bảng, làm thế nào các mô-đun có thể xử lý bất kỳ xung đột nào chúng có với nhau hoặc với các thay đổi mà mô-đun lõi sẽ áp dụng cho cơ sở dữ liệu của chính nó?

Nếu bảng cơ sở dữ liệu đang được tạo từ một mô-đun khác (mô-đun lõi hoặc mô-đun của bên thứ ba), tôi sẽ đề nghị mở một yêu cầu tính năng cho mô-đun, cung cấp trường hợp sử dụng để sử dụng chỉ mục mới; nếu có bất kỳ vấn đề về hiệu năng, việc thêm một chỉ mục có thể là điều mong muốn.

Nếu bạn định thêm một chỉ mục vào một bảng được tạo từ một mô-đun khác vào trang web của riêng bạn, thì hãy chuẩn bị cho mọi thay đổi bạn cần thực hiện cho mô-đun tùy chỉnh của mình mỗi khi mô-đun được cập nhật và trước khi bạn cài đặt nó vào trang web của riêng bạn .
Chính bạn là người có thể quyết định xem công việc làm thêm có xứng đáng với hiệu suất bạn nhận được hay không. Cá nhân, tôi không nghĩ rằng nó là giá trị, mặc dù.


Cảm ơn. Làm thế nào điều này sẽ hoạt động nếu tôi thêm một chỉ mục vào một bảng để chống lại một truy vấn chậm, không chỉ là một thay đổi cho mô-đun của riêng tôi? Tôi sẽ cố gắng chỉnh sửa câu hỏi của mình để rõ ràng hơn một chút khi tôi có cơ hội.
mpdon Arena

3
Ngoài ra, bạn có thể cân nhắc sử dụng DB Tuner , rất tiện để biết nên tạo chỉ mục nào.
tostinni

@tostinni Vâng, câu hỏi gần như liên quan trực tiếp đến việc thực hiện các khuyến nghị từ DB Tuner.
mpdon Arena
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.