2010-05-14 34 views
5

Tôi đang nhập dữ liệu vào cơ sở dữ liệu trong tương lai sẽ có một bảng MyISAM tĩnh (sẽ chỉ đọc từ). Tôi đã chọn MyISAM bởi vì theo tôi hiểu nó nhanh hơn cho các yêu cầu của tôi (tôi hoàn toàn không có kinh nghiệm với MySQL/SQL).Chuẩn hóa cơ sở dữ liệu hay không? Chỉ đọc bảng MyISAM, hiệu suất là ưu tiên chính (MySQL)

Bảng đó sẽ có các cột khác nhau như ID, Tên, Giới tính, Điện thoại, Trạng thái ... và Quốc gia, Thành phố, cột Đường. Bây giờ câu hỏi là, tôi có nên tạo các bảng (ví dụ: Quốc gia: Country_ID, Country_Name) cho 3 cột cuối cùng và tham chiếu chúng trong bảng chính theo ID (bình thường hóa ... [?]) Hoặc chỉ lưu chúng dưới dạng VARCHAR trong bảng chính (có bản sao, rõ ràng)?

Mối quan tâm chính của tôi là tốc độ - vì bảng sẽ không được ghi vào, tính toàn vẹn của dữ liệu không phải là ưu tiên. Các hành động duy nhất sẽ chọn một hàng cụ thể hoặc tìm kiếm các hàng có nhiều tiêu chí nhất định.

Tìm kiếm theo cột Quốc gia, Thành phố và/hoặc Đường phố (và có thể cả các cột khác trong cùng một tìm kiếm) sẽ nhanh hơn nếu tôi chỉ sử dụng VARCHAR?

EDIT: Bảng có khoảng 30 cột và khoảng 10m hàng.

+0

Bạn có xem xét các cơ chế lưu trữ khác không? MySQL có thể khiến bạn mất chi phí mà bạn không cần phải trả vì khả năng bạn không sử dụng. Bạn có thể xác định vị trí một số lựa chọn thay thế ở đây: http://en.wikipedia.org/wiki/Nosql http://en.wikipedia.org/wiki/Embedded_database –

Trả lời

4

Có thể tìm kiếm nhanh hơn nếu bạn chuẩn hóa vì cơ sở dữ liệu sẽ chỉ phải so sánh số nguyên thay vì chuỗi. Dữ liệu bảng cũng sẽ nhỏ hơn, giúp tìm kiếm nhanh hơn khi có thể tải nhiều dữ liệu hơn vào bộ nhớ cùng một lúc.

Nếu bảng của bạn được lập chỉ mục một cách chính xác thì nó sẽ rất nhanh theo một trong hai cách - bạn có thể sẽ không nhận thấy sự khác biệt đáng kể.

Bạn cũng có thể muốn xem full text search nếu bạn thấy mình viết LIKE '%foo%' vì sau này sẽ không thể sử dụng chỉ mục và sẽ cho kết quả quét toàn bộ bảng.

+0

1 @hello BẢO ĐẢM BẠN INDEX BẢNG CỦA BẠN ĐÚNG !!!! –

+0

Tôi không nhất thiết phải đồng ý rằng nó * sẽ * nhanh hơn để tìm kiếm nếu các bảng được chuẩn hóa, nhưng nhìn chung đây là lời khuyên tốt. –

+0

Đồng ý, lập chỉ mục là ưu tiên cao cho hiệu suất. Tuy nhiên, bình thường hóa không có gì để làm với so sánh số nguyên vs chuỗi. Giới thiệu các khóa thay thế không bình thường hóa. – reaanb

1

Tôi sẽ cố gắng cung cấp cho bạn điều gì đó nhiều hơn câu trả lời "Phụ thuộc" thông thường.

# 1 - Mọi thứ đều nhanh cho N nhỏ - nếu bạn có ít hơn 100.000 hàng, chỉ cần tải phẳng, lập chỉ mục khi cần và chuyển sang ưu tiên cao hơn. Giữ mọi thứ bằng phẳng trong một bảng nhanh hơn để đọc mọi thứ (tất cả các cột), nhưng để tìm kiếm hoặc tìm kiếm nó, bạn thường cần chỉ mục, nếu dữ liệu của bạn rất lớn với thông tin Thành phố và Quốc gia dư thừa, có thể tốt hơn có các khóa ngoại thay thế thành các bảng riêng biệt, nhưng bạn thực sự không thể nói mạnh và nhanh. Đây là lý do tại sao một số loại nguyên tắc mô hình dữ liệu hầu như luôn được sử dụng - hoặc chuẩn hóa truyền thống (ví dụ: Entity-Relationship) hoặc chiều (ví dụ Kimball) thường được sử dụng - các quy tắc hoặc phương pháp luận trong cả hai trường hợp được thiết kế để giúp bạn mô hình hóa dữ liệu mà không cần phải lường trước mọi trường hợp sử dụng. Rõ ràng, việc biết tất cả các mẫu sử dụng sẽ thiên vị mô hình dữ liệu của bạn theo hướng hỗ trợ chúng - vì vậy rất nhiều tập hợp và phân tích là một chỉ báo mạnh mẽ để sử dụng một mô hình chiều không chuẩn hóa.

Vì vậy, nó thực sự phụ thuộc rất nhiều vào hồ sơ dữ liệu của bạn (chiều rộng hàng và số hàng) và các mẫu sử dụng.

+0

Tôi đã quên đề cập đến "kích thước" của bảng. Khoảng 30 cột rộng (các loại cột khác nhau, chủ yếu là VARCHAR) và khoảng 10m hàng. Vì vậy, tôi đoán bình thường hóa sẽ khôn ngoan hơn. – hello

+0

@hello Bình thường hóa nói chung là tốt, nhưng một cách tiếp cận chiều có thể có một số lợi ích thực sự - đặc biệt, tôi đang nghĩ đến kỹ thuật "kích thước rác" có thể tìm kiếm kết hợp mã/loại/nhân khẩu học rất nhanh. –

0

Tôi không có nhiều hơn câu trả lời "Phụ thuộc" thông thường.

Đi với nhiều chuẩn hóa như bạn cần cho các tìm kiếm bạn thực sự thực hiện. Nếu bạn không bao giờ thực sự tìm kiếm những người sống trên Elm Street ở Sacramento hoặc trên Maple Avenue ở Denver, bất kỳ nỗ lực nào để bình thường hóa những cột đó đều lãng phí khá nhiều.Thông thường bạn sẽ bình thường hóa một cái gì đó như thế để tránh các lỗi cập nhật, nhưng bạn đã nói rằng tính toàn vẹn dữ liệu không phải là một rủi ro.

Xem nhật ký truy vấn chậm của bạn như chim ưng! Điều đó sẽ cho bạn biết những gì bạn cần để bình thường hóa. Làm EXPLAIN trên các truy vấn đó và xác định xem bạn có thể thêm chỉ mục để cải thiện hay không hoặc bạn có cần bình thường hóa hay không.

Tôi đã làm việc với một số mô hình dữ liệu mà chúng tôi gọi là "siêu chuẩn hóa". Họ ở trong tất cả các hình thức bình thường thích hợp, nhưng thường cho những thứ mà không cần nó cho cách chúng tôi sử dụng dữ liệu. Những loại mô hình dữ liệu này rất khó hiểu với một cái nhìn bình thường, và chúng có thể rất khó chịu.

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