慣例,先交代一下問題背景,遇到一個JavaWeb的項目,使用了Mysql數據庫,其中有一張歷史記錄history表…此處想到這張表就有些許頭疼頭疼頭疼,那麼問題來了,這表噁心到什麼程度呢?每秒鐘400多條,每秒…什麼數據量呢?客戶要求保留一年曆史記錄…一年的數據量預估計400✖️60✖️60✖️24✖️365=12614400000,百億級別的數據量...可能不少認爲分佈式數據包括大數據處理方式處理這點數據不是很容易嗎?若是能夠這樣我就開心的笑了...客戶的要求是,服務器上只能安裝JavaWeb環境和一個MYSQL,服務器是什麼呢?就是一臺超大容量硬盤的臺式機,這是重點,這也是全部問題的根源。沒有分佈式環境,各類先進的技術用不上,原本還能夠用一些數據庫中間件,如Mycat、sharding-sphere等等,由於啥都不讓往服務器(臺式機)上裝。這裏小小的吐槽一下,我門作的是JavaWeb項目,客戶的服務器(臺式機)是不用的時候關機,用的時候開機,開機以後各類服務應用隨機啓動。這TMD是JavaWeb服務器啊!!!mysql
1、 數據量 1)數據分割: 一年的數據量太大了,首先要考慮分割,如何分割?按照計算,天天的數據量是34560000,顯然千萬級的仍是太大,繼續分割,最後我選擇按照小時分割1440000,小百萬級,問題不大了。 2)分割數據依據: 按小時分割顯然就是數據建立時間了create_time***。 2、查詢效率: 1)大表帶來的第一個問題就是查詢效率的問題,合理創建索引是很關鍵的。 2)切分數據,也就是分區的使用(這裏後面會詳細介紹,畢竟這篇文章就是分享MYSQL分區表使用經驗的)*git
1、優化您的SQL 2、優化您的SQL 3、創建良好的索引 4、合理使用MYSQL自帶的分區功能 5、根據分區的實際狀況再優化您的SQL (重要的事情說三遍)程序員
先發一下個人分區表使用入門文章連接github
1、使用分區表不像咱們使用傳統意義上的分庫/分表那樣麻煩,須要修改應用層的邏輯代碼,水平拆分還須要考慮全局主鍵的問題。 2、MYSQL的分區表是數據層面上的,程序員能夠無感,具體分區表的介紹我發的文章連接裏面已經很詳細了,我就不重複BB了。sql