Cần tư vấn giải pháp MySQL lớn lên đến 10 triệu rows
Câu hỏi của bạn khá chung chung. Nói về MySQL thì 10 triệu dòng không phải là con số nhỏ, nhưng cũng không phải là con số lớn. Trên thế giới đã có rất nhiều Web Site đã Scale MySQL với lượng Data lớn hơn thế này nhiều. Có thể đi theo 1 vài bước sau:
- Optimize Query: Bạn có thể xem cách đọc các Query bị chậm như cách của anh Thắng bên trên, hoặc lấy trực tiếp các Query mà bạn nghi là chậm sau đó chạy trên MySQL Command sẽ thấy thời gian chạy của Query đó. Bạn có thể xem thêm khoá học này để hiểu thêm về cách Optimize Query: https://goo.gl/md5QdB
- Replication. Sử dụng cơ chế Replication của MySQL, tạo 1 bản Master chuyên ghi DB và 1 bản chuyên đọc. Giải pháp này nếu như MySQL DB của bạn thường xuyên được ghi vào.
- Caching. Một giải pháp Caching hay sử dụng hiện nay là Redis. Tốc độ của nó cực cao, nên bạn cứ yên tâm mà sử dụng. Bên Stackoverflow họ dùng SQL Server và Redis để Caching, tốc độ vào trang của họ thì bạn cũng biết rồi đó. Còn về cơ chế Cache thì cũng đơn giản, đầu tiên là kiểm tra ID của bản ghi đó có tồn tại trong Cache không, nếu có thì lấy từ Cache, không thì Query từ DB ra, sau đó cũng Cache bài đó vào Redis. Nếu trang bạn là tin tức là có thể chạy Crontab mỗi ngày lấy ra 100 bài nhiều người đọc nhất, xong đưa vào Cache. Nhìn chung giải quyết vấn đề cho các trang tin tức dễ hơn là các trang thương mại điện tử vì trang tin thì đọc ra là chủ yếu. Về DO thì các vấn đề như Network hay CDN chắc không phải là vấn đề.
Framework
Để làm PHP Framework thì cũng không cần đọc nhiều tài liệu lắm đâu. Chỉ cần hiểu và nắm vững về Design Pattern. Mối quan hệ của các Design Pattern và nguyên lý thiết kế SOLID. Zend, Laravel, Symfony đều là những Framework áp dụng SOLID ở mức cao. Ví dụ sức mạnh của Zend nằm ở Service Locator, của Laravel là ở Service Container thì cả 2 cái đó đều xuất phát từ SOLID. Sau đó thì tham khảo kiến trúc của các Framework. Đơn giản nhất là Codeigniter, áp dụng chủ yếu MVC, không sử dụng quá nhiều kiến trúc phức tạp. Sau đó có thể là Symfony hoặc Laravel. Bản chất của Web App là nhận 1 request và trả lại 1 response. Framework kiến trúc nào thì cũng nhận 1 request và trả lại 1 response. Bạn có thể hình dung Framework như 1 cái pipeline, đầu vào là user request, đi tới đoạn nào đó dựa vào thông tin request mà Framework sẽ gọi tới thành phần tương ứng để xử lí cái request đó. Và cuối cùng đầu ra của cái request đã xử lí là 1 cái response thoả mãn người dùng. Theo nguyên lý đó thì với mô hình MVC đơn giản cái Pipeline đó là từ Route -> Controller -> Model -> View. Còn với các Framework hiện đại nó sẽ phức tạp hơn. Ví dụ như Route -> Dispatcher -> View hoặc Route -> Dispatcher -> Controller -> Service -> Model -> View... Đây là Framework mình viêt dựa trên Domain Driven Design và Symfony Component. Nó chưa hoàn thiện lắm. https://github.com/bienhoang/cloudy-mvc