10個MySQL機能調優的辦法。本站提示廣大學習愛好者:(10個MySQL機能調優的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是10個MySQL機能調優的辦法正文
MYSQL 應當是最風行了 WEB 後端數據庫。WEB 開辟說話比來成長很快,PHP, Ruby, Python, Java 各有特色,固然 NOSQL 比來越來越多的被提到,然則信任年夜部門架構師照樣會選擇 MYSQL 來做數據存儲。
MYSQL 如斯便利和穩固,以致於我們在開辟 WEB 法式的時刻很少想到它。即便想到優化也是法式級其余,好比,不要寫過於消費資本的 SQL 語句。然則除此以外,在全部體系上依然有許多可以優化的處所。
1. 選擇適合的存儲引擎: InnoDB
除非你的數據表應用來做只讀或許全文檢索 (信任如今提到全文檢索,沒人會用 MYSQL 了),你應當默許選擇 InnoDB 。
你本身在測試的時刻能夠會發明 MyISAM 比 InnoDB 速度快,這是由於: MyISAM 只緩存索引,而 InnoDB 緩存數據和索引,MyISAM 不支撐事務。然則 假如你應用 innodb_flush_log_at_trx_commit = 2 可以取得接近的讀取機能 (相差百倍) 。
1.1 若何將現有的 MyISAM 數據庫轉換為 InnoDB:
mysql -u [USER_NAME] -p -e "SHOW TABLES IN [DATABASE_NAME];" | tail -n +2 | xargs -I '{}' echo "ALTER TABLE {} ENGINE=InnoDB;" > alter_table.sql
perl -p -i -e 's/(search_[a-z_]+ ENGINE=)InnoDB//1MyISAM/g' alter_table.sql
mysql -u [USER_NAME] -p [DATABASE_NAME] < alter_table.sql
1.2 為每一個表分離創立 InnoDB FILE:
innodb_file_per_table=1
如許可以包管 ibdata1 文件不會過年夜,掉去掌握。特別是在履行 mysqlcheck -o –all-databases 的時刻。
2. 包管從內存中讀取數據,講數據保留在內存中
2.1 足夠年夜的 innodb_buffer_pool_size
推舉將數據完整保留在 innodb_buffer_pool_size ,即按存儲量計劃 innodb_buffer_pool_size 的容量。如許你可以完整從內存中讀取數據,最年夜限制削減磁盤操作。
2.1.1 若何肯定 innodb_buffer_pool_size 足夠年夜,數據是從內存讀取而不是硬盤?
辦法 1
mysql> SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%'; +----------------------------------+--------+ | Variable_name | Value | +----------------------------------+--------+ | Innodb_buffer_pool_pages_data | 129037 | | Innodb_buffer_pool_pages_dirty | 362 | | Innodb_buffer_pool_pages_flushed | 9998 | | Innodb_buffer_pool_pages_free | 0 | !!!!!!!! | Innodb_buffer_pool_pages_misc | 2035 | | Innodb_buffer_pool_pages_total | 131072 | +----------------------------------+--------+ 6 rows in set (0.00 sec)
發明 Innodb_buffer_pool_pages_free 為 0,則解釋 buffer pool 曾經被用光,須要增年夜 innodb_buffer_pool_size
InnoDB 的其他幾個參數:
innodb_additional_mem_pool_size = 1/200 of buffer_pool
innodb_max_dirty_pages_pct 80%
辦法 2
或許用iostat -d -x -k 1 敕令,檢查硬盤的操作。
2.1.2 辦事器上能否有足夠內存用來計劃
履行 echo 1 > /proc/sys/vm/drop_caches 消除操作體系的文件緩存,可以看到真實的內存應用量。
2.2 數據預熱
默許情形,只要某條數據被讀取一次,才會緩存在 innodb_buffer_pool。所以,數據庫方才啟動,須要停止數據預熱,將磁盤上的一切數據緩存到內存中。數據預熱可以進步讀取速度。
關於 InnoDB 數據庫,可以用以下辦法,停止數據預熱:
1. 將以下劇本保留為 MakeSelectQueriesToLoad.sql
SELECT DISTINCT CONCAT('SELECT ',ndxcollist,' FROM ',db,'.',tb, ' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache FROM ( SELECT engine,table_schema db,table_name tb, index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist FROM ( SELECT B.engine,A.table_schema,A.table_name, A.index_name,A.column_name,A.seq_in_index FROM information_schema.statistics A INNER JOIN ( SELECT engine,table_schema,table_name FROM information_schema.tables WHERE engine='InnoDB' ) B USING (table_schema,table_name) WHERE B.table_schema NOT IN ('information_schema','mysql') ORDER BY table_schema,table_name,index_name,seq_in_index ) A GROUP BY table_schema,table_name,index_name ) AA ORDER BY db,tb ;
2. 履行
mysql -uroot -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
3. 每次重啟數據庫,或許整庫備份前須要預熱的時刻履行:
mysql -uroot < /root/SelectQueriesToLoad.sql > /dev/null 2>&1
2.3 不要讓數據存到 SWAP 中
假如是公用 MYSQL 辦事器,可以禁用 SWAP,假如是同享辦事器,肯定 innodb_buffer_pool_size 足夠年夜。或許應用固定的內存空間做緩存,應用 memlock 指令。
3. 按期優化重建數據庫
mysqlcheck -o –all-databases 會讓 ibdata1 赓續增年夜,真實的優化只要重建數據表構造:
CREATE TABLE mydb.mytablenew LIKE mydb.mytable; INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable; ALTER TABLE mydb.mytable RENAME mydb.mytablezap; ALTER TABLE mydb.mytablenew RENAME mydb.mytable; DROP TABLE mydb.mytablezap;
4. 削減磁盤寫入操作
4.1 應用足夠年夜的寫入緩存 innodb_log_file_size
然則須要留意假如用 1G 的 innodb_log_file_size ,假設辦事器當機,須要 10 分鐘來恢復。
推舉 innodb_log_file_size 設置為 0.25 * innodb_buffer_pool_size
4.2 innodb_flush_log_at_trx_commit
這個選項和寫磁盤操作親密相干:
innodb_flush_log_at_trx_commit = 1 則每次修正寫入磁盤
innodb_flush_log_at_trx_commit = 0/2 每秒寫入磁盤
假如你的運用不觸及很高的平安性 (金融體系),或許基本架構足夠平安,或許 事務都很小,都可以用 0 或許 2 來下降磁盤操作。
4.3 防止雙寫入緩沖
innodb_flush_method=O_DIRECT
5. 進步磁盤讀寫速度
RAID0 特別是在應用 EC2 這類虛擬磁盤 (EBS) 的時刻,應用軟 RAID0 異常主要。
6. 充足應用索引
6.1 檢查現有表構造和索引
SHOW CREATE TABLE db1.tb1/G
6.2 添加需要的索引
索引是進步查詢速度的獨一辦法,好比搜刮引擎用的倒排索引是一樣的道理。
索引的添加須要依據查詢來肯定,好比經由過程慢查詢日記或許查詢日記,或許經由過程 EXPLAIN 敕令剖析查詢。
ADD UNIQUE INDEX
ADD INDEX
6.2.1 好比,優化用戶驗證表:
添加索引
ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);
每次重啟辦事器停止數據預熱
echo “select username,password from users;” > /var/lib/mysql/upcache.sql
添加啟動劇本到 my.cnf
[mysqld]
init-file=/var/lib/mysql/upcache.sql
6.2.2 應用主動加索引的框架或許主動拆分表構造的框架
好比,Rails 如許的框架,會主動添加索引,Drupal 如許的框架會主動拆分表構造。會在你開辟的早期指明准確的偏向。所以,經歷不太豐碩的人一開端就尋求從 0 開端構建,現實是欠好的做法。
7. 剖析查詢日記和慢查詢日記
記載一切查詢,這在用 ORM 體系或許生成查詢語句的體系很有效。
log=/var/log/mysql.log
留意不要在臨盆情況用,不然會占滿你的磁盤空間。
記載履行時光跨越 1 秒的查詢:
long_query_time=1
log-slow-queries=/var/log/mysql/log-slow-queries.log
8. 保守的辦法,應用內存磁盤
如今基本舉措措施的靠得住性曾經異常高了,好比 EC2 簡直不消擔憂辦事器硬件當機。並且內存其實是廉價,很輕易買到幾十G內存的辦事器,可以用內存磁盤,按期備份到磁盤。
將 MYSQL 目次遷徙到 4G 的內存磁盤
mkdir -p /mnt/ramdisk sudo mount -t tmpfs -o size=4000M tmpfs /mnt/ramdisk/ mv /var/lib/mysql /mnt/ramdisk/mysql ln -s /tmp/ramdisk/mysql /var/lib/mysql chown mysql:mysql mysql
9. 用 NOSQL 的方法應用 MYSQL
B-TREE 依然是最高效的索引之一,一切 MYSQL 依然不會過時。
用 HandlerSocket 跳過 MYSQL 的 SQL 解析層,MYSQL 就真正釀成了 NOSQL。
10. 其他
單條查詢最初增長 LIMIT 1,停滯全表掃描。
將非”索引”數據分別,好比將年夜篇文章分別存儲,不影響其他主動查詢。
不消 MYSQL 內置的函數,由於內置函數不會樹立查詢緩存。
PHP 的樹立銜接速度異常快,一切可以不消銜接池,不然能夠會形成跨越銜接數。固然不消銜接池 PHP 法式也能夠將
銜接數占滿好比用了 @ignore_user_abort(TRUE);
應用 IP 而不是域名做數據庫途徑,防止 DNS 解析成績
以上就是10個MySQL機能調優的辦法,願望對年夜家的進修有所贊助。