VIEW
STORED PROCEDURE
INDEX
FULL TEXT SEARCH
TRIGGER
TIPS
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thiết kế hệ thống hẹn giờ cho trang tin tức

Chủ đề này trong thực tế rất nhiều bạn vướng mắc nhưng không biết cách giải đáp, nên trong bài này tôi sẽ đưa ra một giải pháp và các bạn sẽ cùng tôi thảo luận chủa đề này nhé. Và trước tiên ta sẽ tìm hiểu qua về cơ chế lưu trữ kiểu ngày tháng trong mysql.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

1. Cơ chế lưu trữ kiểu ngày tháng trong mysql

Như bạn biết trong mysql chúng ta có thể lưu định dạng ngày tháng là kiểu date, kiểu datetime. Đây là hai kiểu chính và các bạn rất thường hay sử dụng để tìm kiếm. Nhưng có một sự thật mà ít bạn quan tâm đến đó là nếu như bạn truy vấn với kiểu INT và có index thì tốc độ sẽ rất nhanh. Ý của tôi tức là thay vì ta lưu kiểu date hoặc datetime thì ta tạo thêm một field kiểu UNSIGN INT nữa và dùng code PHP để chuyển ngày tháng sang trước khi lưu vào CSDL.

Trong mysql năm bắt đầu ta sẽ tính bắt đầu từ năm 1970 và tới nay là năm 2014, tính ra khoảng 44 năm. Và tổng khoảng thời gian 44 năm này chuyển sang kiểu INT sẽ có tổng cộng 1407612770 giây. Nhưng trong mysql, kiểu UNSIGN INT chỉ lưu trữ tới mức khoảng 4294967295 là hết, như vậy tính ra ta còn có thể lưu thê được ít nhất hơn 60 năm nữa mới max. Tới lúc đó thì công nghệ phát triển rồi nên chắc chắn sẽ ko bị hạn chế như vậy.

2. Ý tưởng thiết kế dữ liệu cho chức năng hẹn giờ

Ý tưởng thứ nhất chính là phần phân tích cơ chế lưu trữ trong mysql trên.

Bài viết này được đăng tại [free tuts .net]

Ý tưởng thứ 2 dựa vào ý tưởng thứ nhất ta sẽ lưu trữ một field gọi là news_timer (kiểu UNSIGN INT), field này có giá trị chính là thời gian mà người dùng chọn đăng bài. Như vậy khi hiển thị danh sách tin tức thì ta chỉ cần thêm điều kiện lọc ngày hiện tại phải lơn hoặ hoặc bằng ngày hiển thị trong timer.

Như bạn biết, khi làm việc với tin tức ta sẽ có một field gọi là status, giá trị bằng 1 là hiển thị, giá trị bằng 0 là không hiển thị. Vậy gộp lại ta có điều kiện lọc nhu sau:

Select * from news where status = 1 and timer <= $bien_kieu_int_time_hien_tai

Với điều kiện lọc như vậy thì ta thấy cũng tối ưu rồi, vì cả hai điều kiện ta có thể đánh chỉ số index. Nhưng có cách nào tối ưu hơn không? Để trả lời câu hỏi này các bạn chú ý đến phần phân tích thời gian từ 1970 tới nay mà tôi đề cập ở trên, ta sẽ có ý tưởng như sau:

Chọn thời gian max chính là giá trị max của kiểu UNSIGN INT, tức là số 4294967295, tôi chọn 4200000000 cho chẵn.

Như vậy ta sẽ bỏ đi field status, còn mỗi field timer thôi. Nếu người dùng chọn ẩn tin thì ta sẽ thiết lập gái trị cho timer bằng 4200000000, còn không thì ta lưu thời gian bình thường. Như vậy khi hiển thị tin ta chỉ lọc đúng một điều kiện timer duy nhất. Ta đánh chỉ mục index nữa thì tốc độ sẽ nhanh hơn rất nhiều.

3. Lời kết

Ý tưởng này tôi đã thực hiện trong dự án của bản thân nên hôm nay tôi muốn chia sẽ với các bạn với mong muốn giúp một số bạn có cái nhìn ra xa hơn về vấn đề phân tích CSDL. Và tôi cũng mong muốn nhận được nhiều ý kiến đóng góp từ chính các bạn. Thân chào và hẹn gặp lại ơ bài gần nhất.

Cùng chuyên mục:

Hàm ENCRYPT trong MySQL

Hàm ENCRYPT trong MySQL

Cách sử dụng ENCRYPT trong MySQL

Hàm MD5 trong MySQL

Hàm MD5 trong MySQL

Cách sử dụng MD5 trong MySQL

Hàm OLD_PASSWORD trong MySQL

Hàm OLD_PASSWORD trong MySQL

Cách sử dụng OLD_PASSWORD trong MySQL

Hàm PASSWORD trong MySQL

Hàm PASSWORD trong MySQL

Cách sử dụng PASSWORD trong MySQL

Hàm ASCII trong MySQL

Hàm ASCII trong MySQL

Cách sử dụng ASCII trong MySQL

Hàm CHAR_LENGTH trong MySQL

Hàm CHAR_LENGTH trong MySQL

Cách sử dụng CHAR_LENGTH trong MySQL

Hàm CHARACTER_LENGTH trong MySQL

Hàm CHARACTER_LENGTH trong MySQL

Cách sử dụng CHARACTER_LENGTH trong MySQL

Hàm CONCAT trong MySQL

Hàm CONCAT trong MySQL

Cách sử dụng CONCAT trong MySQL

Hàm CONCAT_WS trong MySQL

Hàm CONCAT_WS trong MySQL

Cách sử dụng CONCAT_WS trong MySQL

Hàm FIELD trong MySQL

Hàm FIELD trong MySQL

Cách sử dụng FIELD trong MySQL

Hàm FIND_IN_SET trong MySQL

Hàm FIND_IN_SET trong MySQL

Cách sử dụng FIND_IN_SET trong MySQL

Hàm FORMAT trong MySQL

Hàm FORMAT trong MySQL

Cách sử dụng FORMAT trong MySQL

Hàm INSERT trong MySQL

Hàm INSERT trong MySQL

Cách sử dụng INSERT trong MySQL

Hàm INSTR trong MySQL

Hàm INSTR trong MySQL

Cách sử dụng INSTR trong MySQL

Hàm LCASE trong MySQL

Hàm LCASE trong MySQL

Cách sử dụng LCASE trong MySQL

Hàm LEFT trong MySQL

Hàm LEFT trong MySQL

Cách sử dụng LEFT trong MySQL

Hàm LENGTH trong MySQL

Hàm LENGTH trong MySQL

Cách sử dụng LENGTH trong MySQL

Hàm LOCATE trong MySQL

Hàm LOCATE trong MySQL

Cách sử dụng LOCATE trong MySQL

Hàm LOWER trong MySQL

Hàm LOWER trong MySQL

Cách sử dụng LOWER trong MySQL

Hàm LPAD trong MySQL

Hàm LPAD trong MySQL

Cách sử dụng LPAD trong MySQL

Top