Linux命令列&連線Linux伺服器&資料庫優化&MyISAM和InnerDB&redis&memcache
Linux
長時間執行穩定的作業系統,當成伺服器(web、db、app)。有C編譯環境,有一些軟體(Redis、nginx)沒有軟體包,需要在Linux編譯獲得軟體包。
常用命令
pwd:獲取當前路徑 cd:跳轉到目錄 su-u:切換到管理員 ls或ll:列舉目錄
- 檔案操作命令
- 檔案
- 檢視 Tail
- 刪除 rm-rf
- vi
- 資料夾
- 建立mkdir
- 刪除rm-rf
- 檔案
怎麼連線遠端Linux伺服器
需依賴於Linux伺服器安裝SSH伺服器、SFTP伺服器,SSH服務的埠為22,SFTP伺服器埠為25,使用SSH客戶端連線,Xshell、Putty 使用SFTP客戶端,上傳和下載檔案(上傳安裝包,修改配置檔案上傳)Winscp、XFTP putty+winscp xshell+xFTP =>xmanager
雲主機
雲主機就是雲服務運營商(阿里、華為、新浪、西部數碼等)提供遠端伺服器功能付費租用對應伺服器。
資料庫優化
- 定位:查詢、定位慢查詢、並優化
- 建立索引:在索引中查詢,直接找到對應記錄
- 分表:當表中資料比較多或默寫欄位的值比較多但很少使用時,採用水平分表和垂直分表
- 讀寫分離:一臺伺服器不滿足需求是,用讀寫分離的方式進行叢集。
- 主從同步:資料庫將資料持久化到磁碟上,每個資料庫伺服器的資料一致。修改操作在主資料庫寫,其他資料庫同步資料。使用負載均衡實現寫操作往主資料庫取,讀往從資料庫取。
- 快取:使用redis來進行快取
查詢、定位慢查詢
在專案自驗後轉測試,啟動資料庫開啟慢查詢,並且把執行慢的呼叫語句寫到日誌中,在執行一定的時間後,通過檢視日誌,找到相應的慢查詢語句。 使用explain慢查詢語句,詳細分析語句的問題
show variables like ‘log_slow_queries’; 開啟 set global log_slow_queries = on;
資料庫優化遵循正規化
首先符合1NF,才能滿足2NF,才能滿足3NF 1NF:表中列具有原子性,不能再分解 2NF:表中記錄唯一,主鍵 3NF:外來鍵,表中不要有冗餘資料 反三正規化
資料庫優化建立索引
- 普通索引:允許重複值出現
- 唯一索引:唯一,不能有重複值
- 主鍵索引:唯一且不為null,根據主鍵建立索引
- 全文索引:根據文字域(varchar、char、text)進行索引—>sphinx
explain select * from articles where match(title,body) against(‘database’);
- 索引佔用磁碟空間、對DML(資料操縱語言SELECT、UPDATE、INSERT、DELETE)操作變慢
- 使用場景: 1.在where條件經常使用 2.欄位內容不是唯一的幾個值 3.欄位內容不頻繁變化
- 具體技巧
- 建立多列索引(複合索引),不使用第一部分就不會使用索引。
- 用like查詢時,前面使用萬用字元%不會用索引,即關鍵字不能使用%或_,反之亦然。只能‘aaa%’\G
- 條件有or,有條件中沒有使用索引,其他條件也不能用。要求每個欄位單獨使用時能索引
- 列型別是字串時,在條件中用引號引用起來
- 使用全表掃描比使用索引快,不使用索引
資料庫優化之分表
水平分表和垂直分表 表資料達到百萬級,查詢效率低,容易造成表鎖。(垂直分表)表中欄位的值多(長文字、二進位制),而且只在少數情況下查詢,可將欄位單獨放在一個表中,用外來鍵連線。
- 水平分表
- 按時間分表:資料時效性強
- 按區間範圍分表:自增ID需求
- Hash分表:通過原始ID或名稱按hash演算法計算出資料儲存表的表名
資料庫優化選擇合適的儲存引擎
myisam/innerDB/memory MYISAM:表對事務要求不高,以查詢和新增為主, INNERDB:對事務要求高,儲存的都是重要資料, MEMORY:資料變化頻繁,不需要入庫,有繁忙的查詢和修改,速度快
MyISAM和InnerDB的區別!!!
- 事務安全:MyISAM不支援事務,innerDB支援
- 新增和查詢速度:myisam不用考慮同步鎖,查詢和新增速度快
- 全文索引:myisam支援
- 鎖機制:myisam支援表鎖,innerDB支援行鎖
- 外來鍵:myisam不支援外來鍵,InnerDB支援外來鍵
資料庫優化之快取
在持久層(dao層)與資料庫(db)之間新增一個快取層,減少資料庫伺服器壓力,減少訪問時間。 Hibernate的二級快取(SessionFactory),但是他不能完成分散式快取,中央快取用redis、memcache
資料庫優化之語句優化
- DDL(Data definition Language)優化:
- 匯入資料時,禁用索引
- 關閉唯一校驗 set unique_checks = 0//關閉
- 修改事務提交方式 set autocommit=0,將多次提交變為一次
- DML優化(data manipulation操縱 language):將多次提交變為一次
- DQL優化:
- order by—多用索引排序、普通結果排序Filesort
- group by:使用order by null取消預設排序
- or優化,or兩邊都用索引效能好
連線阿里雲伺服器建立的資料庫
實現批量插入幾百萬條資料
- 原理:變多次提交為一次,使用批量操作。
redis
key-value的nosql資料庫,先存到記憶體中,根據策略持久化到磁碟上,斷電也不會丟失資料,支援的資料型別多。
- 作用:做快取資料庫和web叢集時當中央快取存放session
- 使用場景:經常查詢、很少修改的資料存放到記憶體中,減少訪問時間、減輕壓力。
- redis中計數器時原子性的記憶體操作,可解決庫存溢位問題
- session快取伺服器:web叢集時作為session的快取伺服器
- 快取佇列
redis和memcache
mysql | redis | memcache | |
---|---|---|---|
型別 | 關係型 | 非關係型 | 非關係型 |
儲存位置 | 磁碟 | 磁碟和記憶體 | 記憶體 |
儲存過期 | 不支援 | 支援 | 支援 |
讀取效能 | 低 | 非常高 | 非常高 |
redis物件儲存方式
JSON字串:需要將物件轉換為JSON字串,當做字串處理,直接使用get、set使用。設定和獲取簡單,但沒有提供專門的方法將物件轉換為JSON。(JSONlib)欄位不多用本方式 位元組流:需要做序列化為位元組儲存,資料量大采用本方式
redis的淘汰機制
設定最大使用記憶體:server.maxmemory 記憶體大小有限,需要儲存有效資料
- noeviction:當記憶體使用達到閾值的時候,所有引起申請記憶體的命令會報錯。
- allkeys-lru:在主鍵空間中,優先移除最近未使用的key。
- volatile-lru:在設定了過期時間的鍵空間中,優先移除最近未使用的key。最近最少
- allkeys-random:在主鍵空間中,隨機移除某個key。
- volatile-random:在設定了過期時間的鍵空間中,隨機移除某個key。
- volatile-ttl:在設定了過期時間的鍵空間中,具有更早過期時間的key優先移除。
Java訪問Redis
- 使用jedis java客戶端訪問redis伺服器
- 使用spring叢集時,可使用spring data訪問redis,二次封裝
redis叢集
當一臺資料庫伺服器無法滿足需求時,用redis叢集處理,採用讀取分離。