# (四):MySQL建立索引,唯一索引和組合索引
先大致介紹下項目的數據庫信息。
數據庫A:主要存放的通用的表,如User、Project、Report等。
數據庫B、C、D:一個項目對應一個數據庫,而且這幾個項目的表是完全一樣的。
**數據庫表的特點**
A中的表:數據量幾乎都比較小,比如User表中用戶數,頂多也就幾百上千。
B中的表:X/Y/Z 3張表幾乎是確定的,Data表?中的數據量比較大,幾千萬到上億。
周期性的會加入一大批數據,比如,每月末增加幾百萬條數據。
即一般情況下,B中的表只有查詢操作,而且特別是Data查詢頻繁且數據量很大。
**建立索引**
1.為所有的表建立了唯一索引,索引字段是主鍵id。
2.考慮到數據庫A中表的數據量很小,暫時沒有建立組合索引。
如有可能,對頻繁查詢的表和字段,后期嘗試加入組合索引。
3.對Data表建立組合索引。
頻繁查詢的一條SQL語句
select ?from Data where projectId=? and (inputVersion in (201)) and (sideId in (10001)) and (breakId in (?)) and (periodId in (?)) ?order by id desc;
建立組合索引的語句
**ALTER TABLE Data ADD INDEX data_query_index (projectId,inputVersion,sideId,breakId,periodId);**
**建立索引之前,需要花費2.796秒。**
**建立索引之后,只需要0.136秒。**
可以說是,大幅度提升了查詢效率。
**索引的弊端**
隨之而來的問題:如果已經建立了索引,那么批量增加數據的時候,會特別慢。
一種較快的方法是:批量插入數據之前,先刪除索引,提高批量插入數據的效率。
然后,再重新建立索引,提高查詢效率。
1000萬條記錄,重建5個字段的組合索引需要2到3秒。
重建索引的問題是,這個過程中,查詢會比較慢。
應對之策:導入數據,重建索引 應該選擇 晚上/凌晨等用戶較少使用系統的時間段。
**一個建議**
?用 explain sql;
?可以分析sql語句的執行情況,進而對sql語句進行優化。
**天下武功,唯勤不破**
性能優化,以前只是看過一些書,沒啥實踐經驗。
最近項目需要由我來進行優化,只好硬著頭皮一點點去實踐。
網上搜資料、請教同事、請教大牛。
周末再多看看書,認真復習和學習Linux、MySQL、Tomcat、Redis等一大堆,先側重系統優化。