10/10/2018, 13:26
Làm sao lập trình web với hơn 1 tỷ record?
Tôi đang phát triển một website chụp ảnh và chia sẽ ảnh. Phần lưu trữ ảnh, tôi có thể dùng hệ thống phân tán để mở rộng không giới hạn. Hiện tôi đang vướng mắc ở lập chỉ mục ảnh với số lượng lớn ảnh. Tôi đang dùng MySQL, cấu trúc bảng của tôi như sau:
Các bạn có kinh nghiệm làm hệ thống lớn cho tôi hỏi: Liệu tôi có thể lưu trữ hơn 1 tỷ record với cấu trúc bảng đó. Nếu tôi rút gọn cấu trúc bảng thành:
Liệu có thể lưu trữ hơn 1 tỷ record?
Cấu hình server tối thiểu như thế nào để lưu trữ và query số lượng lớn record như thế?
Code:
CREATE TABLE IF NOT EXISTS `shotiz_shot` ( `code` varchar(36) COLLATE utf8_general_ci NOT NULL, `url` varchar(1000) COLLATE utf8_general_ci NOT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `status` int(11) NOT NULL DEFAULT '0', `title` varchar(1000) COLLATE utf8_general_ci NOT NULL, `description` varchar(8000) COLLATE utf8_general_ci NOT NULL, `my_name` varchar(1000) COLLATE utf8_general_ci NOT NULL DEFAULT ', `my_email` varchar(1000) COLLATE utf8_general_ci NOT NULL DEFAULT ', `share_emails` varchar(8000) COLLATE utf8_general_ci NOT NULL DEFAULT ', `shared` int(11) NOT NULL DEFAULT '0', `fb_shared` int(11) NOT NULL DEFAULT '0', `fb_username` varchar(255) COLLATE utf8_general_ci NOT NULL DEFAULT ', `fb_password` varchar(255) COLLATE utf8_general_ci NOT NULL DEFAULT ', `tw_shared` int(11) NOT NULL DEFAULT '0', `tw_username` varchar(255) COLLATE utf8_general_ci NOT NULL DEFAULT ', `tw_password` varchar(255) COLLATE utf8_general_ci NOT NULL DEFAULT ', `storage` varchar(36) COLLATE utf8_general_ci NOT NULL DEFAULT ', PRIMARY KEY (`code`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Code:
CREATE TABLE IF NOT EXISTS `shotiz_shot` ( `code` varchar(36) COLLATE utf8_general_ci NOT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `status` int(11) NOT NULL DEFAULT '0', `shared` int(11) NOT NULL DEFAULT '0', `fb_shared` int(11) NOT NULL DEFAULT '0', `tw_shared` int(11) NOT NULL DEFAULT '0', `storage` varchar(36) COLLATE utf8_general_ci NOT NULL DEFAULT ', PRIMARY KEY (`code`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Cấu hình server tối thiểu như thế nào để lưu trữ và query số lượng lớn record như thế?
Bài liên quan
- MyISAM cho phép 2^32 rows trên 1 table, còn Innodb là 2^64 => lý do thứ 2 để lựa chọn Innodb
- RAM nên cao một chút để set cache lên mem cho performance tốt hơn. Khoảng 8-16GB.
- CPU vừa đủ dùng là được, chỉ cần XEON ~1220 là ổn. Quan trọng hơn là ổ cứng => nên có SSD cached để tăng tốc, và RAID 10 hoặc RAID 6 để bảo đảm dữ liệu.
- Nếu có kinh nghiệm optimize thì bạn hãy dùng thử MariaDB thay cho mySQL.
Với cấu hình trên và optimize tốt có thể xử lý 10 tỉ rows, khoảng 1000-1500 insert vào db mỗi giây và ~5000 query select mỗi giây.
Chủ topic nên xem qua các giải pháp có ở trang này : http://www.percona.com/software/percona-xtradb-cluster
Như vậy data bạn có 1 tỷ rows cũng ko ảnh hưởng gì. Khi nào cache đó hết hạn, bạn delete đi.