Kiểu danh sách trong mysql
Thiết kế tốt về cả logic vật lý và là những cột lửa quan trọng hướng tới hiệu năng cao, và bạn phải thiết kế lược đồ của mình theo những câu hỏi mà bạn sẽ chạy. Điều này thường dẫn đến việc trao đổi bị mất. Ví dụ như lược đồ không chuẩn hóa có thể tăng tốc một số loại truy vấn nhưng lại làm chậm các loại truy vấn khác. Thêm vào bảng counter và summary là một cách hay để truy vấn tối ưu, nhưng chúng gây khó khăn khi duy trì. Các tính năng của MySQL bị ảnh hưởng một chút từ suy nghĩ trên. Chương này và chương tiếp theo sẽ tập chung vào đánh chỉ mục, xem xét một chút về thiết kế lược đồ. Chúng tôi cho rằng bạn đã biết về cơ sở dữ liệu thiết kế, nên đây không phải là chương để giới thiệu, hay là chương nâng cao. Đây là chương về thiết kế cơ sở dữ liệu MySQL. Chương này là sự chuẩn bị cho 2 chương tiếp theo. Trong chương 3, chúng ta sẽ tìm hiểu sự tương tác của thiết kế logic, thiết kế vật lý và thực thi truy vấn. Điều này yêu cầu toàn bộ sự hiểu biết toàn cảnh và các chi tiết bên trong. Bạn cần hiểu toàn bộ hệ thống để có thể biết được sao các phần nhỏ tương tác với nhau. Bạn có thể thấy nó hữu ích khi đọc chương này trước khi bước vào mục lục chương, tối ưu hóa truy vấn. Rất nhiều thảo luận có liên hệ với nhau nên đọc hết **Chọn loại dữ liệu tối ưu**
SỐ TOÀN BỘ. Có 2 kiểu số là số nguyên và số thực. If used integer. tinyint, smallint, medinumint, int, or bigint yêu cầu 8, 16, 24, 32 và 64 bit lưu trữ. Số nguyên còn tùy chọn unsigned. MySQL để bạn định nghĩa độ dài của số nguyên như int(11) nhưng nó không có ý nghĩa gì trong hầu hết các ứng dụng. Nó không giới hạn phạm vi giá trị, chỉ hiển thị ra 11 chữ số. Mặc dù khai báo là int(1) nhưng nó có thể chứa đc = int(20) **SỐ THỰC. ** Dành cho kiểu có phần thực, nhưng vẫn dùng cho kiểu nguyên. FLOAT and DOUBLE support toán học hỗ trợ ~ với dấu , động. Type DECIMAL Support Calculator chính xác phần phân số. Cả 2 kiểu , động và DECIMAL đều có thể xác định chính xác định dạng LOẠI CHUỖI. VARCHAR & CHAR
Lời khuyên
Trong trường hợp này nên sử dụng khóa ngoại hoặc bảng tra cứu. Nếu bạn muốn thêm một quốc gia mới, thì có cách nào khác ngoài việc sử dụng bảng thay đổi. And in MySQL 5. 0 trở lên, bạn muốn thêm một phần tử vào vị trí nào đi nữa thì nó vẫn ở cuối danh sách Internations enums dễ gây nhầm lẫn với set. Ví dụ
Trong trường hợp này nên sử dụng ENUM thay vì SET. Vì ENUM chỉ cho phép chứa 1 trong 2 giá trị còn SET cho phép chứa 1 -> nhiều giá trị
Chúng tôi đã viết từ trước về việc tránh sử dụng NULL, và thật lòng chúng tôi đề nghị bạn sử dụng theo một cách khác khi vẫn có thể. Kể cả khi bạn muốn lưu trữ một giá trị “k có giá trị”, bạn cũng không nên sử dụng null. Có thể sử dụng số 0 hoặc 1 giá trị quy ước trước hoặc một chuỗi rỗng. Nhưng trong một số trường hợp sử dụng NULL là tốt hơn và làm cho mã đỡ rắc rối hơn tuy NULL là một lỗi rất khó tránh nhưng nó có thể còn là một cách làm tốt hơn những cái khác. Như đã nhắc từ trước, MySQL has been index for NULL but Oracle then not
Để thực hiện câu truy vấn này, MySQL cần quét chỉ mục đã xuất bản của bảng thông báo. Mỗi hàng nó tìm được, nó sẽ thăm dò người dùng trong bảng và kiểm tra xem người dùng đó có cao cấp không. Cách này chỉ có hiệu quả khi số lượng nhỏ của người dùng là phí bảo hiểm. Một câu truy vấn khác sẽ bắt đầu từ người dùng bảng, chọn người dùng cao cấp và lấy ra tất cả thư sau đó sắp xếp. Trường hợp này còn tệ hơn. Vấn đề nằm ở chỗ tham gia, nó làm cả 2 công việc là sắp xếp và lọc nhưng chỉ với 1 chỉ mục. Nếu bạn không chuẩn hóa dữ liệu bằng cách xếp nhiều bảng xếp hạng và đánh chỉ mục với (account_type, đã xuất bản), bạn sẽ không cần tham gia và có hiệu quả hơn nhiều
Một hỗn hợp chuẩn hóa và không chuẩn hóa Cả normalized và denormalized đều có ưu và nhược điểm. Làm sao chọn được cái nào là thiết kế tốt nhất? . chúng thường không có ý nghĩa gì có thể giới hạn bên ngoài. Trong thế giới bên ngoài, bạn thường kết hợp 2 cách tiếp cận, sử dụng một phần nào đó đã được chuẩn hóa, bảng bộ đệm,. Trong ví dụ trên, thực tế thay vì không chuẩn hóa hoàn toàn bảng thì có thể lưu account_type trên cả bảng người dùng và thông báo. Điều này tránh vấn đề chèn và xóa mất toàn bộ dữ liệu. Bạn sẽ vẫn lưu lại người dùng được mặc dù đã xóa hết tin nhắn. Nó không làm bảng người dùng, thông báo lớn hơn quá nhiều nhưng giúp bạn chọn hiệu quả. Tuy nhiên, bây giờ update user lại khó khăn hơn bởi vì phải thay đổi trên cả 2 bảng. Để xem xét nó có phải là vấn đề thực sự hay không, bạn phải tính toán tần suất thực hiện việc thay đổi có nhiều không và thời gian để hoàn thành thay đổi và so sánh với thời gian thực hiện câu lệnh chọn. Một ví dụ hay khác để chuyển từ bảng cha -> bảng con được sử dụng để sắp xếp. If with normalized schema thì thật là tốn nhiều thời gian để sắp xếp message theo tên tác giả nhưng lược đồ không chuẩn hóa thì nhanh hơn rất nhiều đệm cache và đánh index author_name trong bảng message |