2010-06-28 28 views
8

Tôi có một bảng có hơn 10 triệu hàng. Tuy nhiên, tôi cần tạo một chỉ mục trên một cột duy nhất, chỉ mục mất quá nhiều thời gian để tạo ra rằng tôi nhận được khóa trên bảng.tạo chỉ mục mà không khóa DB

Điều quan trọng cần lưu ý là chỉ mục đang được tạo thành một phần của bước 'rake db: migrate' ... Tôi không có hại khi tạo chỉ mục theo cách thủ công nếu điều đó có hiệu quả.

CẬP NHẬT: Tôi cho rằng tôi nên đề cập rằng đây là bảng thường viết.

+0

Ổ khóa là tốt. Bạn đang nhận được thời gian chờ hoặc deadlocks? –

+1

Ổ khóa không ổn. Đó là khiếu nại. – Richard

+0

Bạn đã bao giờ tìm thấy câu trả lời cho điều này chưa? – tj111

Trả lời

3

Công cụ MySQL NDBCLUSTER của MySQL có thể tạo chỉ mục trực tuyến mà không cần khóa ghi vào bảng. Tuy nhiên, động cơ InnoDB được sử dụng rộng rãi nhất không hỗ trợ tính năng này. Một mã nguồn mở miễn phí DB Postgres hỗ trợ 'tạo chỉ mục đồng thời'.

+0

'tạo chỉ mục đồng thời' đã được thêm vào trong phiên bản 8.2 hoặc có abouts. – Richard

+0

Gần đây, chúng tôi đã sử dụng bộ công cụ Percona để thực hiện các thay đổi lược đồ trực tuyến mà không cần khóa bảng với InnoDB. – Daniel

2

bạn có thể ngăn chặn sự tắc nghẽn với một cái gì đó như thế này (pseudo-code):

create table temp like my_table; 
update logger to log in temp; 
alter table my_table add index new_index; 
insert into my_table select * from temp; 
update logger to log in my_table; 
drop table temp 

đâu logger sẽ là bất cứ điều gì thêm hàng/cập nhật bảng của bạn được sử dụng thường xuyên (ví dụ .: php script). Điều này sẽ thiết lập một bảng tạm thời để sử dụng trong khi một bảng khác cập nhật.

+0

Tôi cho rằng tôi nên đề cập rằng đây là một bảng thường ghi. Vì vậy, một bảng tạm thời sẽ khó khăn nhưng không thể thực hiện được. Chỉ là một chút ít hơn lý tưởng. – Richard

0

Hãy thử đảm bảo rằng chỉ mục được tạo trước khi các bản ghi được chèn vào. Bằng cách đó, chỉ mục cũng sẽ được lấp đầy trong dân số của bảng. Mặc dù điều đó sẽ mất nhiều thời gian hơn, ít nhất nó sẽ sẵn sàng để đi khi công việc cào được thực hiện.

+0

Hầu hết các chỉ mục được tạo theo cách này; Tuy nhiên; trái với niềm tin phổ biến, các trình thuật sĩ tại Oracle và Microsoft đang liên tục yêu cầu các DBA của họ xây dựng lại các chỉ số của họ khi hiệu năng bắt đầu chậm trễ. Cũng trong một số trường hợp ETL nó thực sự hiệu quả hơn để lập chỉ mục sau này. – Richard

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