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:

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;
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:

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;
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ế?
khuongCOMPUTER viết 15:38 ngày 10/10/2018
- Nên sử dụng Innodb. Nó hỗ trợ row locking chứ không table locking như MyISAM.
- 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.
dnv2006 viết 15:27 ngày 10/10/2018
nhất trí với bác ở trên về MariaDB. Với các website được đầu tư bài bản, dự phòng cho khả năng mở rộng sau này, dùng MariaDB thay thế cho MySQL.
hostnaotot.com viết 15:38 ngày 10/10/2018
Được gửi bởi khuongCOMPUTER
- Nên sử dụng Innodb. Nó hỗ trợ row locking chứ không table locking như MyISAM.
- 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.
Bác Khương có vẻ thành thạo về dữ liệu lớn quá, e cũng thích tìm hiểu cái này mà chả biết học tập ai. ^^
sincos viết 15:41 ngày 10/10/2018
Mangodb mà phang đi bác.
congnghevps.net viết 15:36 ngày 10/10/2018
Mình không khoái dùng MariaDB cho lắm dù nó cũng được nhiều người vote cao.

Chủ topic nên xem qua các giải pháp có ở trang này : http://www.percona.com/software/percona-xtradb-cluster
pixelart viết 15:31 ngày 10/10/2018
Bạn cache nguyên cái query database ra thành mảng. Khi query, VD : where ID=1 .... thì load file 1.php chẳng hạn

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.
seaurchin viết 15:36 ngày 10/10/2018
Theo kinh nghiệm của mình thì nên xài NoSQL mà điển hình là MongoDB, tốc độ read write nhanh hơn hẳn MySQL
Bài liên quan
0