##<center/>Mysql相關知識java
1.服務層:處理客服端和服務端鏈接以及安全驗證。 2.核心層:查詢分析,優化,緩存,內置函數/內建視圖,存儲過程/觸發器。 3.存儲引擎:數據的存取。
.mysql
MariaDB 徹底兼容Mysql XtraDB引擎 代替mysql的InnoDB引擎。 企業版:收費 社區版:開源,用的人比較多。 Percona Server:新特性多 MariaDB:國內用的很少。
/etc/my.cnf 1.max_connections.Mysql所容許的最大會話數Too many connections. 2.max_errors(50)最大錯誤容許數 FLUSH HOSTS 重啓服務。 3.key_buffer_size 關聯詞緩衝區大小,緩存MyISAM索引塊, 索引處理速度 讀取索引的速度 4.max_allowed_packet 設置最大包。限制server接受數據塊大 小,執行超長SQL,信息包過大,關閉鏈接,丟失與Mysql服務器鏈接的報錯。 5.thread_cache_size 服務器線程緩存。 6.thread_concurrency 值爲CUP核數*2,設錯時, Mysql不能很好的利用多核處理器性能。 7.sort_buffer_size 不是越大越好,1000個鏈接話, 分配每一個1MB,就須要 1000*1M = 1GB。 8.join_buffer_size join表使用的緩存的大小 9.query_cache_size 查詢緩存大小,查詢結果緩存。緩存期間表 必須沒有更改,不然緩存失效,多寫操做數據庫,設置打了影響 寫入效率。 10.read_buffer_size 在這個MyISAM下 全表掃描的緩衝大小, 並且查詢時沒法添加索引全表掃描,增大它可使得它優化。 11.read_rnd_buufer_size 從排序好的數據中讀取行時, 行數據從緩衝區讀取能夠提高Order by的性能 注意:mysql會爲每一個客戶端申請這個緩衝區,併發過大, 設置過大影響內存開銷大。 12.myisam_sort_buffer_size:MyISAM表發生變化時,從新排序時 所須要的緩存大小。 13.innodb_buffer_pool_size: innoDB 使用的緩存,用於保存索引 原始數據的緩存,能夠有效減小讀取數據所須要的磁盤I/O。 14.innodb_log_file_size:數據日誌文件大小,大的值能夠提升性 能但增長了恢復故障數據庫的時間。 15.innodb_log_buffer_size:日誌文件的緩存,增大該值能夠提升 性能,但增大了突然宕機損失數據的風險。 16.innodb_flush_log_at_trx_commit:執行事務的時候,會往 innodb存儲引擎的日誌緩存中插入事務日誌,寫數據前先寫日誌 預寫日誌方式,設置爲0時,每秒日誌緩存寫入文件,文件實時寫入磁盤。 設置爲1時,緩存實時寫入文件,文件實時寫入磁盤,設置爲2時 緩存實時寫入文件,每秒日誌文件實時寫入磁盤。 17.innodb_lock_wait_timeout:被回滾前,一個innodb事務應該 等待一個鎖被批准多久,innodb沒法檢測死鎖發生,這個值有用。
1.選擇合適的引擎 MyISAM 索引順序訪問方法 支持全文索引,非事務安全,不支持外鍵,表級鎖。 包含三個文件FRM文件存放表結構,MYD文件存放數據,MYI存放索引。 InnoDB 事務性存儲引擎 行鎖(不必定) (update table set age = 3where name like "%jam%"會鎖表 ,沒法知道更新的範圍) InnoDB是有回滾的,以及崩潰恢復還有ACID事務控制。表和索引放在一個表空間裏,表空間會有 多個文件。 2.正確使用索引 a.給合適的列創建索引, where子句,鏈接子句,而不是select選擇列表創建索引 b.索引值應該不相同,惟一值 索引效果最好 有大量重複效果不好。 c.使用短索引,指定前綴長度, char(50) 前20 30值惟一 較小的索引,索引緩存必定 存的索引多,消耗磁盤IO更小,能提升查找速度。 d.最左前綴 n列索引 最左列值匹配。 e.like查詢,索引失效,儘可能少用like 對於百萬,千萬用like Sphinx 開源方案結合Mysql. f.不能濫用索引 1)索引佔用空間 2)更新數據 索引必須更新 儘可能不要在長期不用的字段上創建索引。 3)SQL執行一個查詢語句 增長查詢優化的時間。 3.避免使用select* 1.返回結果多,下降查詢速度。 2.過多的返回結果,增大服務器返回給APP端的數據傳輸量。網絡傳輸速度慢,弱網絡環境下 容易形成請求失效。 4.字段儘可能設置爲NOT NULL。 ""和NULL {"name":"myf"}{"name":""} {"hobby":空array} null佔空間 判斷""仍是NULL java和OC強制型 APP閃退。
1.增長物理內存 Linux內核,內存開緩存,存放數據。 -寫文件, 文件延遲寫入機制,先把文件放到緩存達到必定程度寫入硬盤 -讀文件,讀文件到緩存,下次須要相同文件從緩存中取,沒有從硬盤取。 2.增長應用緩存 a.本地緩存 數據放到服務器內存文件中 b.分佈式緩存 Redis Memcache讀寫性能很是高,QPS(每秒查詢) 1W以上,數據持久化使用Redis 不持久話,二者均可以。 3.SSD代替機械硬盤 a.日誌和數據分開存儲,日誌順序讀寫放入機械硬盤 ,數據隨機讀寫放在SSD中 b.調參數 innodb_flushmethod = O_DIRECT告訴操做系統禁用緩存,fsync方式, 數據刷入機械硬盤。innodb_io_capacity = 10000,控制mysql中一次刷新髒頁的數量 SSD使得IO加強應增大該值。 4.SSD+SATA混合存儲 FlashCache FaceBook開源項目 在文件系統和設備驅動之間加了一層 緩存對熱數據緩存。
1.分表 a.水平拆分 數據分紅多個表 b.垂直拆分 字段分紅多個表 c.MyISAM MERGE存儲引擎, InnoDB用alter table 2.讀寫分離 讀是一些機器,寫是一些機器。二進制文件的主從複製,延遲解決方案 3.分庫 MyCat部署,工做流程。
內容表 id user_id content 分紅索引表(字段) 內容表(key,放數據)
APP搜索商家,後臺數據庫load居高不下 解決方案:like 查詢無索引致使,sphinx Coreseek開源全文檢索。