1.訪問慢問題
1.1 應用反應mysql網站打開慢
top查看CPU是否是mysql占得較多;
uptime查看負載情況;
進入到mysql庫中,查看進程數:show (full) processlist;
1.2 開啟慢查詢日志
long_query_time=1
log-slow-queries = /data/3306/slow.log
1.3 explain某一條語句,看是否走索引
索引建議建在唯一值較多(即重復值少的)的列上,若三個列都很多,則可基於三個列建立聯合索引。
對於數據庫中像like‘%XXX%’這樣的語句特別多,會導致數據庫負載很高,但是沒有太大的優化余地(如百度的搜索欄界面),這種情況下的優化方案思路:
1)從業務上實現用戶登錄后再搜索,可減少搜索次數,從而減輕數據庫服務壓力
2)如果有大量頻繁的搜索,可能是爬蟲在爬,這時需要分析web日志,封掉其IP
3)配置多個主從同步,程序上實現讀寫分離(最好讓like這種查詢去從庫查),減輕主庫讀寫壓力
4)在數據庫前端增加memcached緩存服務器
5)可以通過搜索服務Sphinx實現搜索
6)可以利用c,ruby開發程序,實現每日讀庫計算搜索索引,保存在服務器上提供搜索,然后每五分鍾多一個從庫做一次增量
2.mysql優化
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緩存等;
3.架構優化
業務拆分:如搜索功能的拆分
某些業務應用使用nosql持久化存儲,如memcachedb,Redis,ttserver,粉絲關注、好友關系等
數據庫前端必須加cache,如memcached,用戶登錄、商品查詢等
動態的數據靜態化,整個文件靜態化,頁面片段靜態化
數據庫集群與讀寫分離,一主多從等,通過程序或dbproxy進行集群讀寫分離
單表超過2000萬,拆庫拆表,人工拆表拆庫(登錄、商品、訂單)
4.流程、制度、安全優化
任何一次人為數據庫記錄的更新,都要走相應的流程:
人:開發--->核心開發--->運維或DBA
測試:內網測試--->IDC測試--->線上執行
客戶端管理:PHPMYADMIN
2018年11月7日
祝好!
