1.1 應用反應mysql網站打開慢前端
top查看CPU是不是mysql佔得較多;mysql
uptime查看負載狀況;web
進入到mysql庫中,查看進程數:show (full) processlist;sql
1.2 開啓慢查詢日誌數據庫
long_query_time=1緩存
log-slow-queries = /data/3306/slow.log安全
1.3 explain某一條語句,看是否走索引ruby
索引建議建在惟一值較多(即重複值少的)的列上,若三個列都不少,則可基於三個列創建聯合索引。服務器
對於數據庫中像like‘%XXX%’這樣的語句特別多,會致使數據庫負載很高,可是沒有太大的優化餘地(如百度的搜索欄界面),這種狀況下的優化方案思路:mysql優化
1)從業務上實現用戶登陸後再搜索,可減小搜索次數,從而減輕數據庫服務壓力
2)若是有大量頻繁的搜索,多是爬蟲在爬,這時須要分析web日誌,封掉其IP
3)配置多個主從同步,程序上實現讀寫分離(最好讓like這種查詢去從庫查),減輕主庫讀寫壓力
4)在數據庫前端增長memcached緩存服務器
5)能夠經過搜索服務Sphinx實現搜索
6)能夠利用c,ruby開發程序,實現每日讀庫計算搜索索引,保存在服務器上提供搜索,而後每五分鐘多一個從庫作一次增量
2.1 硬件優化
CPU:一臺服務器8-16顆
內存:96G-128G跑3-4個實例,32G-64G跑2個實例
硬盤:數量越多越好,性能:ssd(高併發) > sas(普通業務線上) > sata(線下)
raid 以4塊盤爲例:raid0>raid10>raid5>raid1
網卡:多塊網卡bond
以及buffer、tcp優化
2.2 軟件優化
操做系統:x86_64
軟件:mysql編譯優化
2.3 my.cnf裏參數的優化
#優化的幅度很小,大部分要靠架構以及SQL語句優化
幾個參數的解釋:
innodb_buffer_pool_size建議設置爲物理內存的1/3-1/2,不要超過50%
sort_buffer_size、read_buffer_size這種線程buffer不要給大了,通常2M便可
query_cache_size=64M 也不建議配置太大
key_buffer_size=32M 若是用於myisam引擎的話建議給大一點,用於索引
skip-name-resolve #若沒有此項,在show processlist 時會顯示權限不足
max_allowed_packet 服務器和客戶端之間最大能發送的可能信息包,設的大備份會快
wait_time 服務器在關閉它以前在一個鏈接上等待行動的秒數
interactive_timeout 服務器在關閉它以前在一個交互鏈接上等待行動的秒數
也可經過監控查看生產參數的情況:
show global status\G
工具:MySQLreport ----wget http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.604.tar.gz wget http://cpan.uwinnipeg.ca/cpan/authors/id/T/TI/TIMB/DBI-1.605.tar.gz
tar zxvf DBI-1.605.tar.gz cd DBI-1.605 more README perl Makefile.PL make make test make install
另外還有一個分析參數的工具:wget http://www.day32.com/MySQL/tuning-primer.sh
./mysqlreport --user=root --password=oldboy123 --socket=/data/3306/mysql.sock
2.4 SQL語句優化
索引優化:
1)抓出慢SQL,配置my.cnf long_query_time=2 log-slow-queries=/data/3306/slow-log.log
2)慢查詢日誌分析工具-----mysqlsla
mysqldumpslow,mysqlsla,myprofi,mysql-explain-slow-log,mysqllogfilter;
大的複雜的SQL語句拆分紅多個小的SQL語句;
子查詢,JOIN連表查詢;
數據庫是存儲數據的地方,但不是計算數據的地方,把計算的部分拿到前端應用解決;
搜索功能通常不要用mysql數據庫,能夠用單獨搜索的工具,或加memcached緩存等;
業務拆分:如搜索功能的拆分
某些業務應用使用nosql持久化存儲,如memcachedb,Redis,ttserver,粉絲關注、好友關係等
數據庫前端必須加cache,如memcached,用戶登陸、商品查詢等
動態的數據靜態化,整個文件靜態化,頁面片斷靜態化
數據庫集羣與讀寫分離,一主多從等,經過程序或dbproxy進行集羣讀寫分離
單表超過2000萬,拆庫拆表,人工拆表拆庫(登陸、商品、訂單)
任何一次人爲數據庫記錄的更新,都要走相應的流程:
人:開發--->核心開發--->運維或DBA
測試:內網測試--->IDC測試--->線上執行
客戶端管理:PHPMYADMIN
2018年11月7日
祝好!