欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql緩沖和緩存設(shè)置詳解

 更新時(shí)間:2016年12月17日 17:02:53   投稿:hebedich  
本文主要給大家講解的是mysql優(yōu)化過程中比較重要的2個(gè)參數(shù)緩沖和緩存的設(shè)置,希望大家能夠喜歡

MySQL 可調(diào)節(jié)設(shè)置可以應(yīng)用于整個(gè) mysqld進(jìn)程,也可以應(yīng)用于單個(gè)客戶機(jī)會(huì)話。

服務(wù)器端的設(shè)置

每個(gè)表都可以表示為磁盤上的一個(gè)文件,必須先打開,后讀取。為了加快從文件中讀取數(shù)據(jù)的過程,mysqld對(duì)這些打開文件進(jìn)行了緩存,其最大數(shù)目由 /etc/mysqld.conf 中的table_cache 指定。清單 4給出了顯示與打開表有關(guān)的活動(dòng)的方式。

清單 4. 顯示打開表的活動(dòng)

mysql> SHOW STATUS LIKE 'open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables  | 5000 |
| Opened_tables | 195  |
+---------------+-------+
2 rows in set (0.00 sec)

清單 4 說明目前有 5,000 個(gè)表是打開的,有 195個(gè)表需要打開,因?yàn)楝F(xiàn)在緩存中已經(jīng)沒有可用文件描述符了(由于統(tǒng)計(jì)信息在前面已經(jīng)清除了,因此可能會(huì)存在 5,000 個(gè)打開表中只有 195個(gè)打開記錄的情況)。如果 Opened_tables 隨著重新運(yùn)行SHOW STATUS 命令快速增加,就說明緩存命中率不夠。如果Open_tables 比table_cache設(shè)置小很多,就說明該值太大了(不過有空間可以增長總不是什么壞事)。例如,使用 table_cache =5000 可以調(diào)整表的緩存。

與表的緩存類似,對(duì)于線程來說也有一個(gè)緩存。 mysqld在接收連接時(shí)會(huì)根據(jù)需要生成線程。在一個(gè)連接變化很快的繁忙服務(wù)器上,對(duì)線程進(jìn)行緩存便于以后使用可以加快最初的連接。

清單 5 顯示如何確定是否緩存了足夠的線程。

清單 5. 顯示線程使用統(tǒng)計(jì)信息

mysql> SHOW STATUS LIKE 'threads%';
+-------------------+--------+
| Variable_name   | Value |
+-------------------+--------+
| Threads_cached  | 27   |
| Threads_connected | 15   |
| Threads_created  | 838610 |
| Threads_running  | 3   |
+-------------------+--------+
4 rows in set (0.00 sec)
 

此處重要的值是 Threads_created,每次mysqld 需要?jiǎng)?chuàng)建一個(gè)新線程時(shí),這個(gè)值都會(huì)增加。如果這個(gè)數(shù)字在連續(xù)執(zhí)行SHOW STATUS 命令時(shí)快速增加,就應(yīng)該嘗試增大線程緩存。例如,可以在my.cnf 中使用 thread_cache = 40 來實(shí)現(xiàn)此目的。

關(guān)鍵字緩沖區(qū)保存了 MyISAM 表的索引塊。理想情況下,對(duì)于這些塊的請(qǐng)求應(yīng)該來自于內(nèi)存,而不是來自于磁盤。清單 6顯示了如何確定有多少塊是從磁盤中讀取的,以及有多少塊是從內(nèi)存中讀取的。

清單 6. 確定關(guān)鍵字效率

mysql> show status like '%key_read%';
+-------------------+-----------+
| Variable_name   | Value   |
+-------------------+-----------+
| Key_read_requests | 163554268 |
| Key_reads     | 98247   |
+-------------------+-----------+
2 rows in set (0.00 sec)

Key_reads 代表命中磁盤的請(qǐng)求個(gè)數(shù),Key_read_requests是總數(shù)。命中磁盤的讀請(qǐng)求數(shù)除以讀請(qǐng)求總數(shù)就是不中比率 —— 在本例中每 1,000 個(gè)請(qǐng)求,大約有 0.6 個(gè)沒有命中內(nèi)存。如果每1,000 個(gè)請(qǐng)求中命中磁盤的數(shù)目超過 1 個(gè),就應(yīng)該考慮增大關(guān)鍵字緩沖區(qū)了。例如,key_buffer =384M 會(huì)將緩沖區(qū)設(shè)置為 384MB。

臨時(shí)表可以在更高級(jí)的查詢中使用,其中數(shù)據(jù)在進(jìn)一步進(jìn)行處理(例如 GROUPBY字句)之前,都必須先保存到臨時(shí)表中;理想情況下,在內(nèi)存中創(chuàng)建臨時(shí)表。但是如果臨時(shí)表變得太大,就需要寫入磁盤中。清單 7給出了與臨時(shí)表創(chuàng)建有關(guān)的統(tǒng)計(jì)信息。

清單 7. 確定臨時(shí)表的使用

mysql> SHOW STATUS LIKE 'created_tmp%';
+-------------------------+-------+
| Variable_name      | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 30660 |
| Created_tmp_files    | 2   |
| Created_tmp_tables   | 32912 |
+-------------------------+-------+
3 rows in set (0.00 sec)
 

每次使用臨時(shí)表都會(huì)增大 Created_tmp_tables;基于磁盤的表也會(huì)增大 Created_tmp_disk_tables。對(duì)于這個(gè)比率,并沒有什么嚴(yán)格的規(guī)則,因?yàn)檫@依賴于所涉及的查詢。長時(shí)間觀察Created_tmp_disk_tables會(huì)顯示所創(chuàng)建的磁盤表的比率,您可以確定設(shè)置的效率。 tmp_table_size和 max_heap_table_size都可以控制臨時(shí)表的最大大小,因此請(qǐng)確保在 my.cnf 中對(duì)這兩個(gè)值都進(jìn)行了設(shè)置。

每個(gè)會(huì)話 的設(shè)置

下面這些設(shè)置針對(duì)于每個(gè)會(huì)話。在設(shè)置這些數(shù)字時(shí)要十分謹(jǐn)慎,因?yàn)樗鼈冊(cè)诔艘钥赡艽嬖诘倪B接數(shù)時(shí)候,這些選項(xiàng)表示大量的內(nèi)存!您可以通過代碼修改會(huì)話中的這些數(shù)字,或者在 my.cnf 中為所有會(huì)話修改這些設(shè)置。

當(dāng) MySQL必須要進(jìn)行排序時(shí),就會(huì)在從磁盤上讀取數(shù)據(jù)時(shí)分配一個(gè)排序緩沖區(qū)來存放這些數(shù)據(jù)行。如果要排序的數(shù)據(jù)太大,那么數(shù)據(jù)就必須保存到磁盤上的臨時(shí)文件中,并再次進(jìn)行排序。如果 sort_merge_passes狀態(tài)變量很大,這就指示了磁盤的活動(dòng)情況。清單 8 給出了一些與排序相關(guān)的狀態(tài)計(jì)數(shù)器信息。

清單 8. 顯示排序統(tǒng)計(jì)信息

mysql> SHOW STATUS LIKE "sort%";
+-------------------+---------+
| Variable_name   | Value  |
+-------------------+---------+
| Sort_merge_passes | 1    |
| Sort_range    | 79192  |
| Sort_rows     | 2066532 |
| Sort_scan     | 44006  |
+-------------------+---------+
4 rows in set (0.00 sec) 

如果 sort_merge_passes 很大,就表示需要注意sort_buffer_size。例如,sort_buffer_size = 4M 將排序緩沖區(qū)設(shè)置為 4MB。

MySQL也會(huì)分配一些內(nèi)存來讀取表。理想情況下,索引提供了足夠多的信息,可以只讀入所需要的行,但是有時(shí)候查詢(設(shè)計(jì)不佳或數(shù)據(jù)本性使然)需要讀取表中大量數(shù)據(jù)。要理解這種行為,需要知道運(yùn)行了多少個(gè) SELECT語句,以及需要讀取表中的下一行數(shù)據(jù)的次數(shù)(而不是通過索引直接訪問)。實(shí)現(xiàn)這種功能的命令如清單 9 所示。

清單 9. 確定表掃描比率

mysql> SHOW STATUS LIKE "com_select";
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| Com_select  | 318243 |
+---------------+--------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE "handler_read_rnd_next";
+-----------------------+-----------+
| Variable_name     | Value   |
+-----------------------+-----------+
| Handler_read_rnd_next | 165959471 |
+-----------------------+-----------+
1 row in set (0.00 sec)

Handler_read_rnd_next /Com_select 得出了表掃描比率 —— 在本例中是 521:1。如果該值超過4000,就應(yīng)該查看 read_buffer_size,例如read_buffer_size = 4M。如果這個(gè)數(shù)字超過了8M,就應(yīng)該與開發(fā)人員討論一下對(duì)這些查詢進(jìn)行調(diào)優(yōu)了!

查看數(shù)據(jù)庫緩存配置情況

mysql> SHOW VARIABLES LIKE ‘%query_cache%';
+——————————+———+
| Variable_name | Value |
+——————————+———+
| have_query_cache | YES | –查詢緩存是否可用
| query_cache_limit | 1048576 | –可緩存具體查詢結(jié)果的最大值
| query_cache_min_res_unit | 4096 |
| query_cache_size | 599040 | –查詢緩存的大小
| query_cache_type | ON | –阻止或是支持查詢緩存
| query_cache_wlock_invalidate | OFF |
+——————————+———+

配置方法:

在MYSQL的配置文件my.ini或my.cnf中找到如下內(nèi)容:

# Query cache is used to cache SELECT results and later returnthem

# without actual executing the same query once again. Having thequery

# cache enabled may result in significant speed improvements, ifyour

# have a lot of identical queries and rarely changing tables.See the

# "Qcache_lowmem_prunes" status variable to check if the currentvalue

# is high enough for your load.

# Note: In case your tables change very often or if your queriesare

# textually different every time, the query cache may result ina

# slowdown instead of a performance improvement.

query_cache_size=0

以上信息是默認(rèn)配置,其注釋意思是說,MYSQL的查詢緩存用于緩存select查詢結(jié)果,并在下次接收到同樣的查詢請(qǐng)求時(shí),不再執(zhí)行實(shí)際查詢處理而直接返回結(jié)果,有這樣的查詢緩存能提高查詢的速度,使查詢性能得到優(yōu)化,前提條件是你有大量的相同或相似的查詢,而很少改變表里的數(shù)據(jù),否則沒有必要使用此功能。可以通過Qcache_lowmem_prunes變量的值來檢查是否當(dāng)前的值滿足你目前系統(tǒng)的負(fù)載。注意:如果你查詢的表更新比較頻繁,而且很少有相同的查詢,最好不要使用查詢緩存。

具體配置方法:

1. 將query_cache_size設(shè)置為具體的大小,具體大小是多少取決于查詢的實(shí)際情況,但最好設(shè)置為1024的倍數(shù),參考值32M。

2. 增加一行:query_cache_type=1

query_cache_type參數(shù)用于控制緩存的類型,注意這個(gè)值不能隨便設(shè)置,必須設(shè)置為數(shù)字,可選項(xiàng)目以及說明如下:

如果設(shè)置為0,那么可以說,你的緩存根本就沒有用,相當(dāng)于禁用了。但是這種情況下query_cache_size設(shè)置的大小系統(tǒng)是否要為其分配呢,這個(gè)問題有待于測(cè)試?

如果設(shè)置為1,將會(huì)緩存所有的結(jié)果,除非你的select語句使用SQL_NO_CACHE禁用了查詢緩存。

如果設(shè)置為2,則只緩存在select語句中通過SQL_CACHE指定需要緩存的查詢。

OK,配置完后的部分文件如下:

query_cache_size=128M

query_cache_type=1

保存文件,重新啟動(dòng)MYSQL服務(wù),然后通過如下查詢來驗(yàn)證是否真正開啟了:

mysql> show variables like '%query_cache%';

+——————————+———–+

| Variable_name      |Value  |

+——————————+———–+

| have_query_cache     |YES   |

| query_cache_limit     |1048576  |

| query_cache_min_res_unit  |4096   |

| query_cache_size     | 134217728|

| query_cache_type     |ON    |

| query_cache_wlock_invalidate | OFF   |

+——————————+———–+

6 rows in set (0.00 sec)

主要看query_cache_size和query_cache_type的值是否跟我們?cè)O(shè)的一致:

這里query_cache_size的值是134217728,我們?cè)O(shè)置的是128M,實(shí)際是一樣的,只是單位不同,可以自己換算下:134217728 = 128*1024*1024。

query_cache_type設(shè)置為1,顯示為ON,這個(gè)前面已經(jīng)說過了。

總之,看到上邊的顯示表示設(shè)置正確,但是在實(shí)際的查詢中是否能夠緩存查詢,還需要手動(dòng)測(cè)試下,我們可以通過show statuslike '%Qcache%';語句來測(cè)試,現(xiàn)在我們開啟了查詢緩存功能,在執(zhí)行查詢前,我們先看看相關(guān)參數(shù)的值:

mysql> show status like '%Qcache%';

+————————-+———–+

| Variable_name    |Value  |

+————————-+———–+

| Qcache_free_blocks   |1    |

| Qcache_free_memory   | 134208800|

| Qcache_hits     |0    |

相關(guān)文章

  • MySQL之JSON類型字段的使用技巧分享

    MySQL之JSON類型字段的使用技巧分享

    這篇文章主要介紹了MySQL之JSON類型字段的使用技巧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL中使用group by 是總是出現(xiàn)1055的錯(cuò)誤(推薦)

    MySQL中使用group by 是總是出現(xiàn)1055的錯(cuò)誤(推薦)

    這篇文章主要介紹了MySQL中使用group by 是總是出現(xiàn)1055的錯(cuò)誤,小編通過查閱相關(guān)資料才把問題解決,今天小編記錄下分享到腳本之家平臺(tái),需要的朋友可以參考下
    2020-02-02
  • php 不能連接數(shù)據(jù)庫 php error Can''t connect to local MySQL server

    php 不能連接數(shù)據(jù)庫 php error Can''t connect to local MySQL server

    php 不能連接數(shù)據(jù)庫 php error Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    2011-05-05
  • MySQL?表查詢必備:基本操作詳解

    MySQL?表查詢必備:基本操作詳解

    MySQL表基本查詢指南,帶你輕松掌握SQL查詢技巧!無論你是初學(xué)者還是老手,都能在本文中找到適合自己的學(xué)習(xí)內(nèi)容,讓我們一起探索MySQL的世界吧!
    2024-01-01
  • MySQl數(shù)據(jù)庫必知必會(huì)sql語句(加強(qiáng)版)

    MySQl數(shù)據(jù)庫必知必會(huì)sql語句(加強(qiáng)版)

    本文給大家分享了一篇關(guān)于mysql數(shù)據(jù)庫必會(huì)sql語句加強(qiáng)版內(nèi)容,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-04-04
  • Mysql按條件計(jì)數(shù)多種實(shí)現(xiàn)方法詳解

    Mysql按條件計(jì)數(shù)多種實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Mysql按條件計(jì)數(shù)多種實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • MySQL性能分析工具profile使用教程

    MySQL性能分析工具profile使用教程

    這篇文章主要介紹了MySQL性能分析工具profile使用教程,本文描述了如何使用MySQL profile,不涉及具體的樣例分析,需要的朋友可以參考下
    2014-10-10
  • 計(jì)算機(jī)二級(jí)考試MySQL知識(shí)點(diǎn) mysql alter命令

    計(jì)算機(jī)二級(jí)考試MySQL知識(shí)點(diǎn) mysql alter命令

    這篇文章主要為大家詳細(xì)介紹了計(jì)算機(jī)二級(jí)考試MySQL知識(shí)點(diǎn),詳細(xì)介紹了mysql中alter命令的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • MySQL之my.cnf配置文件圖文詳解

    MySQL之my.cnf配置文件圖文詳解

    my.cnf是mysql啟動(dòng)時(shí)加載的配置文件,一般會(huì)放在mysql的安裝目錄中,用戶也可以放在其他目錄加載,下面這篇文章主要給大家介紹了關(guān)于MySQL之my.cnf配置文件的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 本機(jī)連接虛擬機(jī)MYSQL的操作指南

    本機(jī)連接虛擬機(jī)MYSQL的操作指南

    要讓本機(jī)(主機(jī))連接到虛擬機(jī)上的 MySQL 數(shù)據(jù)庫,你需要確保虛擬機(jī)和主機(jī)之間的網(wǎng)絡(luò)連接正常,并且 MySQL 配置允許外部連接,本文給大家介紹了本機(jī)連接虛擬機(jī)MYSQL的操作指南,需要的朋友可以參考下
    2024-12-12

最新評(píng)論