Thiết kế CSDL và Denormalizing để tối ưu hiệu năng (Phần 1)

Như các bạn cũng biết thì hiệu năng và tối ưu luôn là vấn đề ưu tiên hàng đầu trong một ứng dụng. Chả ai mà muốn ngồi đợi Facebook tải mấy cái feeds mà mất cả 1 phút hay upload 1 cái ảnh lên Instagram mà mất nhiều thời gian. Chính vì thế trong bài viết này mình sẽ tập trung vào việc tối ưu CSDL để giúp các bạn có 1 ứng dụng nhanh hơn thông qua thiết kế 1 CSDL tốt hơn.

Mình viết bài viết này cũng vì hiện tại ở công ty mình làm việc áp dụng việc denormalizing rất bừa bãi. Cứ thiết kế loạn xạ hết cả lên chả theo chuẩn nào cả mình tìm trên mạng thì phần này cũng không có nhiều đặc biệt là trang tiếng Việt nên viết lên blog để mọi người thảo luận

Thiết kế CSDL

Thiết kế CSDL là quá trình chuyển đổi các mô hình real-world business model sang một mô hình cơ sở dữ liệu đáp ứng được các yêu cầu này.

Đối với CSDL Server, các bạn sẽ tuân theo 3 tiêu chuẩn  được gọi là Third Normal Form  (gọi tắt là 3NF) để tạo ra các bảng dữ liệu chuẩn. Quá trình này được gọi là Normalize tiếng Việt gọi là Chuẩn hóa

Khi các bản chuyển một mô hình thực thể-quan hệ (entity-relationship) sang mô hỉnh quan hệ (relational model) trong 3NF

  • Các quan hệ trở thành bảng
  • Các thuộc tính trở thành cột
  • Các mối quan hệ trờ thành dữ liệu tham chiếu (data references) (khóa chính và khóa ngoại)
  • fig2_1

Chuẩn hóa dữ liệu (normalization)

Đối với một bảng dữ liệu được normalize thì các cột không phải khóa sẽ phụ thuộc toàn bộ vào cột khóa.

Khi chúng ta áp dụng 3NF cho việc thiết kế CSDL sẽ mang lại rất nhiều tiện lợi từ việc bảo trì, mở rộng CSDL đến việc tối ưu, chỉnh sửa dữ liệu.

Tuy nhiên một thiết kế CSDL bình thường được chuẩn hóa có thể không mang lại hiệu năng tốt nhất cho ứng dụng của bạn nên mình nghĩ là khi các bạn tiến hành thiết kế thì vẫn áp dụng theo mô hình 3NF, còn sau đó nếu có vấn đề phát sinh thì denormalize (từ này mình cũng chả biết dịch sang tiếng Việt là gì nên sẽ để nguyên đại ý thì là không chuẩn hóa) sẽ giải quyết chúng

Lợi ích của chuẩn hóa dữ liệu

Việc chuẩn hóa CSDL sẽ tạo ra các bảng nhỏ hơn với các dòng nhỏ hơn

  • Nhiều dòng trên 1 page hơn (ít logical I/O)
  • Nhiều dòng trên I/O hơn (hiệu quả hơn)
  • Nhiều dòng trên cache hơn (giảm physical I/O)

Bổ sung thêm cả page về Sql cho các bạn (mình copy từ sqlviet :3)

SQL Server chia mỗi bảng thành các trang (page) có kích thước đều nhau 8KB. Các bản ghi được lưu nối tiếp nhau vào từng trang, đến khi đầy trang thì lưu tiếp sang trang mới. Tùy theo kích thước của bản ghi (bằng kích thước của các cột cộng lại) mà có bao nhiêu bản ghi được xếp vừa vào một trang. Nếu kích thước nhỏ sẽ có nhiều bản ghi được chứa trong một trang, ngược lại nếu kích thước lớn thì mỗi trang sẽ chứa được ít bản ghi. Thậm chí nếu kích thước này vượt quá 8KB thì vài trang mới chứa hết một bản ghi

Mình xin cóp 1 đoạn từ trang của Microsoft giải thích về I/O cho mọi người

The I/O from an instance of SQL Server is
divided into logical and physical I/O. A logical read occurs every time the
database engine requests a page from the buffer cache. If the page is not
currently in the buffer cache, a physical read is then performed to read the
page into the buffer cache. If the page is currently in the cache, no physical
read is generated; the buffer cache simply uses the page already in memory

Ý chung thì đại loại là logical I/O là đọc từ cache còn physical thì đọc từ disk. Chả biết mình có hiểu sai không :)) mình sẽ có 1 bài viết chia sẻ chi tiết về cái này cho các bạn sau :3

Những lợi ích của sự bình thường hóa bao gồm:

  • Tìm kiếm, sắp xếp, và tạo index nhanh hơn
  • Chấm dứt việc thiết kế có nhiều bảng. Bạn sẽ có nhiều clusteredindex hơn (bạn chỉ có một bảng cho mỗi) để bạn có được sự linh hoạt hơn trong các truy vấn điều chỉnh.
  • Tìm kiếm theo index thường là nhanh hơn do index có xu hướng nhỏ và bé hơn.
  • Các bảng cho phép sử dụng tốt hơn các segment để kiểm soát vị trí vật lý của dữ liệu.
  • Sẽ giảm các giá trị null, bớt đi các dữ liệu dữ thừa. Điều này làm cho CSDL của bạn trở nên nhỏ gọn hơn
  • Triggers sẽ thực thi nhanh hơn nếu bạn không phải maintain các dữ liệu thừa
  • Việc chỉnh sửa dữ liệu bất thường sẽ giảm đi đáng kể
  • Chuẩn hóa sẽ làm dữ liệu sạch sẽ và dễ bảo trì và dễ thay đổi khi cần

Khi 1 CSDL được chuẩn hóa (fully normailized) sẽ yêu cầu rất nhiều toán tử JOIN, JOIN thông thường sẽ vấn thực hiện rất nhanh nếu index được avaiabe trên các cột tiến hành JOIN. SQL Server được tối ưu vì lưu các index trong cache vì vậy mỗi câu query chỉ yêu cầu 1 hoặc 2 I/O. Chí phí để tìm dòng dữ liệu lưu trên cache là rất thấp.

Tạm thời thì mình viết đến đây bài sau mình sẽ viết chi tiết về normalize cho các bạn :D. Dự định viết tầm 4 part mới đủ nên cứ từ từ :))

 

 

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s