MySQL Sharding 是一種水平分割數據庫的方法,將單個的大型數據庫分割成多個較小的數據庫實例,每個實例獨立運行,以此來減輕數據庫在處理大規模數據時的壓力。在應對高流量和大數據量的應用場景中,Sharding 可以顯著提升系統的穩定性、可用性、響應速度和擴展能力。
Sharding 的核心思想是將完整的數據集合按照某種規則分成多個部分(例如按用戶 ID 分割,或按時間分割),并將這些部分分布式存儲在多個數據庫服務器上。當用戶數據需要訪問時,可以通過分片鍵判斷所需數據所在分片,從而定位到對應的數據庫服務器進行訪問。這種方式下,每個數據庫服務器只負責一部分數據,因此可以承載更大的數據量。
下面是一個簡單的 MySQL Sharding 實現示例:
CREATE TABLE user_info ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE user_info_1 ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE user_info_2 ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; ## Shard rule: Shard by user ID between 1~1000000 to user_info_1, ## between 1000001~2000000 to user_info_2, else to user_info. DELIMITER $$ CREATE TRIGGER shard_user_info BEFORE INSERT ON user_info FOR EACH ROW BEGIN IF NEW.id BETWEEN 1 AND 1000000 THEN INSERT INTO user_info_1 (id, name, age) VALUES (NEW.id, NEW.name, NEW.age); ELSEIF NEW.id BETWEEN 1000001 AND 2000000 THEN INSERT INTO user_info_2 (id, name, age) VALUES (NEW.id, NEW.name, NEW.age); ELSE INSERT INTO user_info (id, name, age) VALUES (NEW.id, NEW.name, NEW.age); END IF; END$$ DELIMITER ;
上述代碼中,我們創建了三個表 user_info、user_info_1 和 user_info_2,分別用來存儲用戶數據的不同部分。我們定義了一個觸發器 shard_user_info,將 user_info 表的數據根據用戶 ID 自動分片到不同的表中。例如用戶 ID 為 5000 的數據會被分片到 user_info_1 表中,而用戶 ID 為 1500000 的數據會被分片到 user_info_2 表中。
MySQL Sharding 可以應用于各種數據密集型應用場景,例如電商、社交網絡、游戲等,因為這些應用通常需要處理大量的數據請求。通過 Sharding,我們可以將數據庫的負載分散到不同的服務器上,避免單點故障,提升系統的可用性和穩定性。