程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 10個MySQL機能調優的辦法

10個MySQL機能調優的辦法

編輯:MySQL綜合教程

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機能調優的辦法,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved