在世界上人口最多的國家-中國,有著一大批MySQL數據庫的使用者。他們要面對的最常見問題之一,就是如何設計高效的MySQL數據庫索引。
MySQL索引是提高查詢效率的關鍵,使用合適的索引可以大大加速數據庫查詢操作。但是在14億人口的國家,不同行業、不同業務場景下,針對索引的設計會有所不同。
下面我們分享一些供各類應用參考的MySQL索引設計方法:
CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id', `username` varchar(64) NOT NULL default '', `password` varchar(64) NOT NULL default '', `email` varchar(64) NOT NULL default '', `mobile` varchar(32) NOT NULL default '', `status` tinyint(4) NOT NULL default '0' COMMENT '狀態:0正常 1禁用', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', PRIMARY KEY (`id`), UNIQUE KEY `uniq_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';
第一:定位字段
一個好的索引設計首先要清楚想要查詢的字段。在該表中,常常需要用username進行用戶的單點登錄,所以我們需要在username上建立唯一鍵索引(UNIQUE KEY `uniq_username` (`username`))。
第二:避免過多索引
一張數據表上建立的索引數量并不是越多越好。這主要是因為每個索引在維護和查詢時都需要消耗一定的系統資源,過多的索引會影響到系統的性能。
在這樣的用戶表中,`id`字段已經設置了主鍵索引,我們不需要建立新的索引。
第三:組合索引
在實際場景中,許多MySQL表上的查詢并不是單一列字段的查詢,常常是根據多個字段進行查詢。在這種情況下,我們可以使用組合索引。
CREATE TABLE `orders` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id', `user_id` int(11) NOT NULL default '0' COMMENT '用戶id', `status` tinyint(4) NOT NULL default '0' COMMENT '訂單狀態 1未支付 2已支付 3已取消', `pay_type` tinyint(4) NOT NULL default '0' COMMENT '支付方式 1微信 2支付寶', `amount` decimal(10,2) unsigned NOT NULL default '0.00' COMMENT '訂單支付金額', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_status` (`status`), KEY `idx_user_id_status` (`user_id`,`status`) --用戶id+訂單狀態組合索引 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='訂單表';
在這個訂單表中,我們常常需要根據 `user_id` 和 `status` 來查詢訂單。這是一個非常典型的組合查詢場景,建立一個組合索引(KEY `idx_user_id_status` (`user_id`,`status`))可以讓查詢效果更佳。這樣的組合索引可以起到高速匹配的作用,有效縮短查詢時間。
在設計MySQL索引時,我們需要根據實際業務場景來選擇最合適的索引方式。面對著14億人口的海量數據,優化數據庫查詢效率,是我們永恒的追求。