亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

10個MySQL性能調(diào)優(yōu)的方法

 更新時間:2015年07月28日 09:29:58   作者:小_米  
本文介紹了10個MySQL性能調(diào)優(yōu)的方法,每個方法的講解都很細(xì)致,非常實用,,需要的朋友可以參考下

MYSQL 應(yīng)該是最流行了 WEB 后端數(shù)據(jù)庫。WEB 開發(fā)語言最近發(fā)展很快,PHP, Ruby, Python, Java 各有特點,雖然 NOSQL 最近越來越多的被提到,但是相信大部分架構(gòu)師還是會選擇 MYSQL 來做數(shù)據(jù)存儲。

MYSQL 如此方便和穩(wěn)定,以至于我們在開發(fā) WEB 程序的時候很少想到它。即使想到優(yōu)化也是程序級別的,比如,不要寫過于消耗資源的 SQL 語句。但是除此之外,在整個系統(tǒng)上仍然有很多可以優(yōu)化的地方。

1. 選擇合適的存儲引擎: InnoDB

除非你的數(shù)據(jù)表使用來做只讀或者全文檢索 (相信現(xiàn)在提到全文檢索,沒人會用 MYSQL 了),你應(yīng)該默認(rèn)選擇 InnoDB 。

你自己在測試的時候可能會發(fā)現(xiàn) MyISAM 比 InnoDB 速度快,這是因為: MyISAM 只緩存索引,而 InnoDB 緩存數(shù)據(jù)和索引,MyISAM 不支持事務(wù)。但是 如果你使用 innodb_flush_log_at_trx_commit = 2 可以獲得接近的讀取性能 (相差百倍) 。

1.1 如何將現(xiàn)有的 MyISAM 數(shù)據(jù)庫轉(zhuǎn)換為 InnoDB:

復(fù)制代碼 代碼如下:
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 為每個表分別創(chuàng)建 InnoDB FILE:

復(fù)制代碼 代碼如下:
innodb_file_per_table=1

這樣可以保證 ibdata1 文件不會過大,失去控制。尤其是在執(zhí)行 mysqlcheck -o –all-databases 的時候。

 

2. 保證從內(nèi)存中讀取數(shù)據(jù),講數(shù)據(jù)保存在內(nèi)存中

2.1 足夠大的 innodb_buffer_pool_size

推薦將數(shù)據(jù)完全保存在 innodb_buffer_pool_size ,即按存儲量規(guī)劃 innodb_buffer_pool_size 的容量。這樣你可以完全從內(nèi)存中讀取數(shù)據(jù),最大限度減少磁盤操作。

2.1.1 如何確定 innodb_buffer_pool_size 足夠大,數(shù)據(jù)是從內(nèi)存讀取而不是硬盤?
方法 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)

發(fā)現(xiàn) Innodb_buffer_pool_pages_free 為 0,則說明 buffer pool 已經(jīng)被用光,需要增大 innodb_buffer_pool_size

InnoDB 的其他幾個參數(shù):

復(fù)制代碼 代碼如下:
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 服務(wù)器上是否有足夠內(nèi)存用來規(guī)劃
執(zhí)行 echo 1 > /proc/sys/vm/drop_caches 清除操作系統(tǒng)的文件緩存,可以看到真正的內(nèi)存使用量。

2.2 數(shù)據(jù)預(yù)熱

默認(rèn)情況,只有某條數(shù)據(jù)被讀取一次,才會緩存在 innodb_buffer_pool。所以,數(shù)據(jù)庫剛剛啟動,需要進(jìn)行數(shù)據(jù)預(yù)熱,將磁盤上的所有數(shù)據(jù)緩存到內(nèi)存中。數(shù)據(jù)預(yù)熱可以提高讀取速度。

對于 InnoDB 數(shù)據(jù)庫,可以用以下方法,進(jìn)行數(shù)據(jù)預(yù)熱:

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. 執(zhí)行

復(fù)制代碼 代碼如下:
mysql -uroot -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql

3. 每次重啟數(shù)據(jù)庫,或者整庫備份前需要預(yù)熱的時候執(zhí)行:

mysql -uroot < /root/SelectQueriesToLoad.sql > /dev/null 2>&1

2.3 不要讓數(shù)據(jù)存到 SWAP 中

如果是專用 MYSQL 服務(wù)器,可以禁用 SWAP,如果是共享服務(wù)器,確定 innodb_buffer_pool_size 足夠大?;蛘呤褂霉潭ǖ膬?nèi)存空間做緩存,使用 memlock 指令。

 

3. 定期優(yōu)化重建數(shù)據(jù)庫

mysqlcheck -o –all-databases 會讓 ibdata1 不斷增大,真正的優(yōu)化只有重建數(shù)據(jù)表結(jié)構(gòu):

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 ,假如服務(wù)器當(dāng)機(jī),需要 10 分鐘來恢復(fù)。

推薦 innodb_log_file_size 設(shè)置為 0.25 * innodb_buffer_pool_size

4.2 innodb_flush_log_at_trx_commit

這個選項和寫磁盤操作密切相關(guān):

innodb_flush_log_at_trx_commit = 1 則每次修改寫入磁盤
innodb_flush_log_at_trx_commit = 0/2 每秒寫入磁盤

如果你的應(yīng)用不涉及很高的安全性 (金融系統(tǒng)),或者基礎(chǔ)架構(gòu)足夠安全,或者 事務(wù)都很小,都可以用 0 或者 2 來降低磁盤操作。

4.3 避免雙寫入緩沖

復(fù)制代碼 代碼如下:
innodb_flush_method=O_DIRECT

 

5. 提高磁盤讀寫速度

RAID0 尤其是在使用 EC2 這種虛擬磁盤 (EBS) 的時候,使用軟 RAID0 非常重要。

 

6. 充分使用索引

6.1 查看現(xiàn)有表結(jié)構(gòu)和索引

復(fù)制代碼 代碼如下:
SHOW CREATE TABLE db1.tb1/G

6.2 添加必要的索引

索引是提高查詢速度的唯一方法,比如搜索引擎用的倒排索引是一樣的原理。

索引的添加需要根據(jù)查詢來確定,比如通過慢查詢?nèi)罩净蛘卟樵內(nèi)罩?或者通過 EXPLAIN 命令分析查詢。

復(fù)制代碼 代碼如下:
ADD UNIQUE INDEX
ADD INDEX

6.2.1 比如,優(yōu)化用戶驗證表:
添加索引

復(fù)制代碼 代碼如下:
ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);

每次重啟服務(wù)器進(jìn)行數(shù)據(jù)預(yù)熱

復(fù)制代碼 代碼如下:
echo “select username,password from users;” > /var/lib/mysql/upcache.sql

添加啟動腳本到 my.cnf

復(fù)制代碼 代碼如下:
[mysqld]
init-file=/var/lib/mysql/upcache.sql

6.2.2 使用自動加索引的框架或者自動拆分表結(jié)構(gòu)的框架
比如,Rails 這樣的框架,會自動添加索引,Drupal 這樣的框架會自動拆分表結(jié)構(gòu)。會在你開發(fā)的初期指明正確的方向。所以,經(jīng)驗不太豐富的人一開始就追求從 0 開始構(gòu)建,實際是不好的做法。

7. 分析查詢?nèi)罩竞吐樵內(nèi)罩?/span>

記錄所有查詢,這在用 ORM 系統(tǒng)或者生成查詢語句的系統(tǒng)很有用。

復(fù)制代碼 代碼如下:
log=/var/log/mysql.log

注意不要在生產(chǎn)環(huán)境用,否則會占滿你的磁盤空間。

記錄執(zhí)行時間超過 1 秒的查詢:

復(fù)制代碼 代碼如下:
long_query_time=1
log-slow-queries=/var/log/mysql/log-slow-queries.log

8. 激進(jìn)的方法,使用內(nèi)存磁盤

現(xiàn)在基礎(chǔ)設(shè)施的可靠性已經(jīng)非常高了,比如 EC2 幾乎不用擔(dān)心服務(wù)器硬件當(dāng)機(jī)。而且內(nèi)存實在是便宜,很容易買到幾十G內(nèi)存的服務(wù)器,可以用內(nèi)存磁盤,定期備份到磁盤。

將 MYSQL 目錄遷移到 4G 的內(nèi)存磁盤

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,停止全表掃描。
將非”索引”數(shù)據(jù)分離,比如將大篇文章分離存儲,不影響其他自動查詢。
不用 MYSQL 內(nèi)置的函數(shù),因為內(nèi)置函數(shù)不會建立查詢緩存。
PHP 的建立連接速度非??欤锌梢圆挥眠B接池,否則可能會造成超過連接數(shù)。當(dāng)然不用連接池 PHP 程序也可能將
連接數(shù)占滿比如用了 @ignore_user_abort(TRUE);
使用 IP 而不是域名做數(shù)據(jù)庫路徑,避免 DNS 解析問題

以上就是10個MySQL性能調(diào)優(yōu)的方法,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • MySQL對數(shù)據(jù)庫數(shù)據(jù)進(jìn)行復(fù)制的基本過程詳解

    MySQL對數(shù)據(jù)庫數(shù)據(jù)進(jìn)行復(fù)制的基本過程詳解

    這篇文章主要介紹了MySQL對數(shù)據(jù)庫數(shù)據(jù)進(jìn)行復(fù)制的基本過程,解讀了Slave的一些相關(guān)配置,需要的朋友可以參考下
    2015-11-11
  • MySQL執(zhí)行update語句和原數(shù)據(jù)相同會再次執(zhí)行嗎

    MySQL執(zhí)行update語句和原數(shù)據(jù)相同會再次執(zhí)行嗎

    這篇文章主要給大家介紹了關(guān)于MySQL執(zhí)行update語句和原數(shù)據(jù)相同是否會再次執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • mysql的select?into給多個字段變量賦值方式

    mysql的select?into給多個字段變量賦值方式

    這篇文章主要介紹了mysql的select?into給多個字段變量賦值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法分析

    mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法分析

    這篇文章主要介紹了mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法,結(jié)合實例形式分析了mysql存儲過程循環(huán)語句WHILE,REPEAT和LOOP的原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-12-12
  • MySQL essential版本和普通版本有什么區(qū)別?

    MySQL essential版本和普通版本有什么區(qū)別?

    安裝mysql的朋友可能會發(fā)現(xiàn)有時候我們看到essential版本,究竟與其它mysql版本有什么區(qū)別呢,這里簡單介紹下
    2013-06-06
  • MySQL主從同步原理及應(yīng)用

    MySQL主從同步原理及應(yīng)用

    日常工作中,MySQL數(shù)據(jù)庫是必不可少的存儲,其中讀寫分離基本是標(biāo)配,而這背后需要MySQL開啟主從同步,形成一主一從、或一主多從的架構(gòu)。本篇文章我們就來解紹MySQL主從同步原理及應(yīng)用,需要的朋友可以參考一下
    2021-10-10
  • MySQL中Stmt 預(yù)處理提高效率問題的小研究

    MySQL中Stmt 預(yù)處理提高效率問題的小研究

    在oracle數(shù)據(jù)庫中,有一個變量綁定的用法,很多人都比較熟悉,可以調(diào)高數(shù)據(jù)庫效率,應(yīng)對高并發(fā)等,好吧,這其中并不包括我,當(dāng)同事問我MySQL中有沒有類似的寫法時,我是很茫然的,于是就上網(wǎng)查,找到了如下一種寫法
    2011-08-08
  • CentOS8下MySQL 8.0安裝部署的方法

    CentOS8下MySQL 8.0安裝部署的方法

    這篇文章主要介紹了CentOS 8下 MySQL 8.0 安裝部署的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 記一次因線上mysql優(yōu)化器誤判引起慢查詢事件

    記一次因線上mysql優(yōu)化器誤判引起慢查詢事件

    這篇文章主要介紹了記一次因線上mysql優(yōu)化器誤判引起慢查詢事件的相關(guān)資料以及最終的解決方案,分享給大家,希望能夠給大家一點啟發(fā)。
    2017-02-02
  • MySQL 8.0.15配置MGR單主多從的方法

    MySQL 8.0.15配置MGR單主多從的方法

    這篇文章主要介紹了MySQL 8.0.15配置MGR單主多從的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論