mysql耗內(nèi)存嗎?很多人都說(shuō)MySQL占用了很大的虛擬內(nèi)存,那么這個(gè)問(wèn)題應(yīng)該怎么解決呢?下面是我收集整理的一些方法,現(xiàn)在分享給大家!
創(chuàng)新互聯(lián)建站主營(yíng)吉林網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App定制開(kāi)發(fā),吉林h5成都微信小程序搭建,吉林網(wǎng)站營(yíng)銷推廣歡迎吉林等地區(qū)企業(yè)咨詢
解決mysql耗內(nèi)存的具體方法一:
在分析的過(guò)程中發(fā)現(xiàn)最耗內(nèi)存的是MySQL,其中近1GB的內(nèi)存被它吞了,而且不在任務(wù)管理器體現(xiàn)出來(lái)。這個(gè)數(shù)據(jù)庫(kù)軟件是EMS要用到了,所以必須要運(yùn)行。這個(gè)軟件在安裝的時(shí)候會(huì)根據(jù)機(jī)器的實(shí)際內(nèi)存自動(dòng)進(jìn)行配置,PC機(jī)物理內(nèi)存越多,它默認(rèn)占有的內(nèi)存就越多,難怪3GB的內(nèi)存被它給吞了近1GB。
優(yōu)化方法:
1. 退出EMS clientserver
2. 在CMD里運(yùn)行:net stop mysql
3. 找到MySQL\MySQL Server的安裝目錄,里面有個(gè)my.ini文件,參考附件的配置對(duì)參數(shù)query_cache_size tmp_table_size myisam_sort_buffer_size key_buffer_size innodb_buffer_pool_size進(jìn)行修改,注意不要改動(dòng)innodb_log_file_size,修改前備份my.ini
4. 在CMD里運(yùn)行:net start mysql,如果提示成功,則說(shuō)明修改的參數(shù)沒(méi)有什么問(wèn)題,如果失敗,重新調(diào)整一下上面的參數(shù)
5. 找到EMS 安裝目錄runGUI.bat runServer.bat腳本,找到-Xmx700m,改為-Xmx256m,注意修改前備份這兩個(gè)文件,感謝Liping Sun提供幫助
6. 重新運(yùn)行EMS
前后對(duì)比,對(duì)于3GB的PC,發(fā)現(xiàn)可以節(jié)省近1GB的內(nèi)存。對(duì)于2GB的PC,也可以節(jié)省600-800MB。優(yōu)化后發(fā)現(xiàn)EMS啟動(dòng)稍微慢一些,但是其它的軟件運(yùn)行速度提高了很多,不在經(jīng)常出現(xiàn)卡機(jī)現(xiàn)象了。如果在運(yùn)行過(guò)程中發(fā)現(xiàn)EMS特別慢的話,自己也可以適當(dāng)放大上面提到的一些參數(shù)。
my.ini
# MySQL Server Instance Configuration File
# ----------------------------------------------------------------------
# Generated by the MySQL Server Instance Configuration Wizard
#
#
# Installation Instructions
# ----------------------------------------------------------------------
#
# On Linux you can copy this file to /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options
# (@localstatedir@ for this installation) or to
# ~/.my.cnf to set user-specific options.
#
# On Windows you should keep this file in the installation directory
# of your server (e.g. C:\Program Files\MySQL\MySQL Server X.Y). To
# make sure the server reads the config file use the startup option
# "--defaults-file".
#
# To run run the server from the command line, execute this in a
# command line shell, e.g.
# mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server X.Y\my.ini"
#
# To install the server as a Windows service manually, execute this in a
# command line shell, e.g.
# mysqld --install MySQLXY --defaults-file="C:\Program Files\MySQL\MySQL Server X.Y\my.ini"
#
# And then execute this in a command line shell to start the server, e.g.
# net start MySQLXY
#
#
# Guildlines for editing this file
# ----------------------------------------------------------------------
#
# In this file, you can use all long options that the program supports.
# If you want to know the options a program supports, start the program
# with the "--help" option.
#
# More detailed information about the individual options can also be
# found in the manual.
#
#
# CLIENT SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by MySQL client applications.
# Note that only client applications shipped by MySQL are guaranteed
# to read this section. If you want your own MySQL client program to
# honor these values, you need to specify it as an option during the
# MySQL client library initialization.
#
[client]
port=3306
[mysql]
default-character-set=utf8
# SERVER SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this
# file.
#
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306
#Path to installation directory. All paths are usually resolved relative to this.
basedir="D:/Program Files/MySQL/MySQL Server 5.1/"
#Path to the database root
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/"
# The default character set that will be used when a new schema or table is
# created and no character set is defined
character-set-server=utf8
# The default storage engine that will be used when create new tables when
default-storage-engine=INNODB
# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
# The maximum amount of concurrent sessions the MySQL server will
# allow. One of these connections will be reserved for a user with
# SUPER privileges to allow the administrator to login even if the
# connection limit has been reached.
max_connections=1510
# Query cache is used to cache SELECT results and later return them
# without actual executing the same query once again. Having the query
# cache enabled may result in significant speed improvements, if your
# have a lot of identical queries and rarely changing tables. See the
# "Qcache_lowmem_prunes" status variable to check if the current value
# is high enough for your load.
# Note: In case your tables change very often or if your queries are
# textually different every time, the query cache may result in a
# slowdown instead of a performance improvement.
query_cache_size=16M
# The number of open tables for all threads. Increasing this value
# increases the number of file descriptors that mysqld requires.
# Therefore you have to make sure to set the amount of open files
# allowed to at least 4096 in the variable "open-files-limit" in
# section [mysqld_safe]
table_cache=3020
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
tmp_table_size=4M
# How many threads we should keep in a cache for reuse. When a client
# disconnects, the client's threads are put in the cache if there aren't
# more than thread_cache_size threads from before. This greatly reduces
# the amount of thread creations needed if you have a lot of new
# connections. (Normally this doesn't give a notable performance
# improvement if you have a good thread implementation.)
thread_cache_size=64
#*** MyISAM Specific options
# The maximum size of the temporary file MySQL is allowed to use while
# recreating the index (during REPAIR, ALTER TABLE or LOAD DATA INFILE.
# If the file-size would be bigger than this, the index will be created
# through the key cache (which is slower).
myisam_max_sort_file_size=100G
# If the temporary file used for fast index creation would be bigger
# than using the key cache by the amount specified here, then prefer the
# key cache method. This is mainly used to force long character keys in
# large tables to use the slower key cache method to create the index.
myisam_sort_buffer_size=4M
# Size of the Key Buffer, used to cache index blocks for MyISAM tables.
# Do not set it larger than 30% of your available memory, as some memory
# is also required by the OS to cache rows. Even if you're not using
# MyISAM tables, you should still set it to 8-64M as it will also be
# used for internal temporary disk tables.
key_buffer_size=16M
# Size of the buffer used for doing full table scans of MyISAM tables.
# Allocated per thread, if a full scan is needed.
read_buffer_size=64K
read_rnd_buffer_size=256K
# This buffer is allocated when MySQL needs to rebuild the index in
# REPAIR, OPTIMZE, ALTER table statements as well as in LOAD DATA INFILE
# into an empty table. It is allocated per thread so be careful with
# large settings.
sort_buffer_size=256K
#*** INNODB Specific options ***
# Use this option if you have a MySQL server with InnoDB support enabled
# but you do not plan to use it. This will save memory and disk space
# and speed up some things.
#skip-innodb
# Additional memory pool that is used by InnoDB to store metadata
# information. If InnoDB requires more memory for this purpose it will
# start to allocate it from the OS. As this is fast enough on most
# recent operating systems, you normally do not need to change this
# value. SHOW INNODB STATUS will display the current amount used.
innodb_additional_mem_pool_size=9M
# If set to 1, InnoDB will flush (fsync) the transaction logs to the
# disk at each commit, which offers full ACID behavior. If you are
# willing to compromise this safety, and you are running small
# transactions, you may set this to 0 or 2 to reduce disk I/O to the
# logs. Value 0 means that the log is only written to the log file and
# the log file flushed to disk approximately once per second. Value 2
# means the log is written to the log file at each commit, but the log
# file is only flushed to disk approximately once per second.
innodb_flush_log_at_trx_commit=1
# The size of the buffer InnoDB uses for buffering log data. As soon as
# it is full, InnoDB will have to flush it to disk. As it is flushed
# once per second anyway, it does not make sense to have it very large
# (even with long transactions).
innodb_log_buffer_size=5M
# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system. Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
innodb_buffer_pool_size=32M
# Size of each log file in a log group. You should set the combined size
# of log files to about 25%-100% of your buffer pool size to avoid
# unneeded buffer pool flush activity on log file overwrite. However,
# note that a larger logfile size will increase the time needed for the
# recovery process.
innodb_log_file_size=88M
# Number of threads allowed inside the InnoDB kernel. The optimal value
# depends highly on the application, hardware as well as the OS
# scheduler properties. A too high value may lead to thread thrashing.
innodb_thread_concurrency=8
解決mysql耗內(nèi)存的具體方法二:
更改后如下:
innodb_buffer_pool_size=576M -256M InnoDB引擎緩沖區(qū)占了大頭,首要就是拿它開(kāi)刀
query_cache_size=100M -16M 查詢緩存
tmp_table_size=102M -64M 臨時(shí)表大小
key_buffer_size=256m -32M
重啟mysql服務(wù)后,虛擬內(nèi)存降到200以下.
另外mysql安裝目錄下有幾個(gè)文件:my-huge.ini 、my-large.ini、my-medium.ini...這幾個(gè)是根據(jù)內(nèi)存大小作的建議配置,新手在設(shè)置的時(shí)候也可以參考一下。
2G內(nèi)存的MYSQL數(shù)據(jù)庫(kù)服務(wù)器 my.ini優(yōu)化 (my.ini)
2G內(nèi)存,針對(duì)站少,優(yōu)質(zhì)型的設(shè)置,試驗(yàn)特:
table_cache=1024 物理內(nèi)存越大,設(shè)置就越大.默認(rèn)為2402,調(diào)到512-1024最佳
innodb_additional_mem_pool_size=8M 默認(rèn)為2M
innodb_flush_log_at_trx_commit=0 等到innodb_log_buffer_size列隊(duì)滿后再統(tǒng)一儲(chǔ)存,默認(rèn)為1
innodb_log_buffer_size=4M 默認(rèn)為1M
innodb_thread_concurrency=8 你的服務(wù)器CPU有幾個(gè)就設(shè)置為幾,默認(rèn)為8
key_buffer_size=256M 默認(rèn)為218 調(diào)到128最佳
tmp_table_size=64M 默認(rèn)為16M 調(diào)到64-256最掛
read_buffer_size=4M 默認(rèn)為64K
read_rnd_buffer_size=16M 默認(rèn)為256K
sort_buffer_size=32M 默認(rèn)為256K
max_connections=1024 默認(rèn)為1210
試驗(yàn)一:
table_cache=512或1024
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=0
innodb_log_buffer_size=1M
innodb_thread_concurrency=8 你的服務(wù)器CPU有幾個(gè)就設(shè)置為幾,默認(rèn)為8
key_buffer_size=128M
tmp_table_size=128M
read_buffer_size=64K或128K
read_rnd_buffer_size=256K
sort_buffer_size=512K
max_connections=1024
試驗(yàn)二:
table_cache=512或1024
innodb_additional_mem_pool_size=8M
innodb_flush_log_at_trx_commit=0
innodb_log_buffer_size=4M
innodb_thread_concurrency=8
key_buffer_size=128M
tmp_table_size=128M
read_buffer_size=4M
read_rnd_buffer_size=16M
sort_buffer_size=32M
max_connections=1024
一般:
table_cache=512
innodb_additional_mem_pool_size=8M
innodb_flush_log_at_trx_commit=0
innodb_log_buffer_size=4M
innodb_thread_concurrency=8
key_buffer_size=128M
tmp_table_size=128M
read_buffer_size=4M
read_rnd_buffer_size=16M
sort_buffer_size=32M
max_connections=1024
經(jīng)過(guò)測(cè)試.沒(méi)有特殊情況,最好還是用默認(rèn)的.
2G內(nèi)存,針對(duì)站多,抗壓型的設(shè)置,最佳:
table_cache=1024 物理內(nèi)存越大,設(shè)置就越大.默認(rèn)為2402,調(diào)到512-1024最佳
innodb_additional_mem_pool_size=4M 默認(rèn)為2M
innodb_flush_log_at_trx_commit=1
(設(shè)置為0就是等到innodb_log_buffer_size列隊(duì)滿后再統(tǒng)一儲(chǔ)存,默認(rèn)為1)
innodb_log_buffer_size=2M 默認(rèn)為1M
innodb_thread_concurrency=8 你的服務(wù)器CPU有幾個(gè)就設(shè)置為幾,建議用默認(rèn)一般為8
key_buffer_size=256M 默認(rèn)為218 調(diào)到128最佳
tmp_table_size=64M 默認(rèn)為16M 調(diào)到64-256最掛
read_buffer_size=4M 默認(rèn)為64K
read_rnd_buffer_size=16M 默認(rèn)為256K
sort_buffer_size=32M 默認(rèn)為256K
max_connections=1024 默認(rèn)為1210
thread_cache_size=120 默認(rèn)為60
query_cache_size=64M
優(yōu)化mysql數(shù)據(jù)庫(kù)性能的十個(gè)參數(shù)
(1)、max_connections:
允許的同時(shí)客戶的數(shù)量。增加該值增加 mysqld 要求的文件描述符的數(shù)量。這個(gè)數(shù)字應(yīng)該增加,否則,你將經(jīng)??吹?too many connections 錯(cuò)誤。 默認(rèn)數(shù)值是100,我把它改為1024 。
(2)、record_buffer:
每個(gè)進(jìn)行一個(gè)順序掃描的線程為其掃描的每張表分配這個(gè)大小的一個(gè)緩沖區(qū)。如果你做很多順序掃描,你可能想要增加該值。默認(rèn)數(shù)值是131072(128k),我把它改為16773120 (16m)
(3)、key_buffer_size:
索引塊是緩沖的并且被所有的線程共享。key_buffer_size是用于索引塊的緩沖區(qū)大小,增加它可得到更好處理的索引(對(duì)所有讀和多重寫(xiě)),到你能負(fù)擔(dān)得起那樣多。如果你使它太大,系統(tǒng)將開(kāi)始換頁(yè)并且真的變慢了。默認(rèn)數(shù)值是8388600(8m),我的mysql主機(jī)有2gb內(nèi)存,所以我把它改為 402649088(400mb)。
4)、back_log:
要求 mysql 能有的連接數(shù)量。當(dāng)主要mysql線程在一個(gè)很短時(shí)間內(nèi)得到非常多的連接請(qǐng)求,這就起作用,然后主線程花些時(shí)間(盡管很短)檢查連接并且啟動(dòng)一個(gè)新線程。
back_log 值指出在mysql暫時(shí)停止回答新請(qǐng)求之前的短時(shí)間內(nèi)多少個(gè)請(qǐng)求可以被存在堆棧中。只有如果期望在一個(gè)短時(shí)間內(nèi)有很多連接,你需要增加它,換句話說(shuō),這值對(duì)到來(lái)的tcp/ip連接的偵聽(tīng)隊(duì)列的大小。你的操作系統(tǒng)在這個(gè)隊(duì)列大小上有它自己的限制。試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無(wú)效的。
當(dāng)你觀察你的主機(jī)進(jìn)程列表,發(fā)現(xiàn)大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | null | connect | null | login | null 的待連接進(jìn)程時(shí),就要加大 back_log 的值了。默認(rèn)數(shù)值是50,我把它改為500。
(5)、interactive_timeout:
服務(wù)器在關(guān)閉它前在一個(gè)交互連接上等待行動(dòng)的秒數(shù)。一個(gè)交互的客戶被定義為對(duì) mysql_real_connect()使用 client_interactive 選項(xiàng)的客戶。 默認(rèn)數(shù)值是28800,我把它改為7200。
(6)、sort_buffer:
每個(gè)需要進(jìn)行排序的線程分配該大小的一個(gè)緩沖區(qū)。增加這值加速order by或group by操作。默認(rèn)數(shù)值是2097144(2m),我把它改為 16777208 (16m)。
(7)、table_cache:
為所有線程打開(kāi)表的數(shù)量。增加該值能增加mysqld要求的文件描述符的數(shù)量。mysql對(duì)每個(gè)唯一打開(kāi)的表需要2個(gè)文件描述符。默認(rèn)數(shù)值是64,我把它改為512。
(8)、thread_cache_size:
可以復(fù)用的保存在中的線程的數(shù)量。如果有,新的線程從緩存中取得,當(dāng)斷開(kāi)連接的時(shí)候如果有空間,客戶的線置在緩存中。如果有很多新的線程,為了提高性能可以這個(gè)變量值。通過(guò)比較 connections 和 threads_created 狀態(tài)的變量,可以看到這個(gè)變量的作用。我把它設(shè)置為 80。
(9)mysql的搜索功能
用mysql進(jìn)行搜索,目的是能不分大小寫(xiě),又能用中文進(jìn)行搜索
只需起動(dòng)mysqld時(shí)指定 --default-character-set=gb2312
(10)、wait_timeout:
服務(wù)器在關(guān)閉它之前在一個(gè)連接上等待行動(dòng)的秒數(shù)。 默認(rèn)數(shù)值是28800,我把它改為7200。
注:參數(shù)的調(diào)整可以通過(guò)修改 /etc/my.cnf 文件并重啟 mysql 實(shí)現(xiàn)。這是一個(gè)比較謹(jǐn)慎的工作,上面的結(jié)果也僅僅是我的一些看法,你可以根據(jù)你自己主機(jī)的硬件情況(特別是內(nèi)存大小)進(jìn)一步修改。
我們?nèi)匀皇褂脙蓚€(gè)會(huì)話,一個(gè)會(huì)話 run,用于運(yùn)行主 SQL;另一個(gè)會(huì)話 ps,用于進(jìn)行 performance_schema 的觀察:
主會(huì)話線程號(hào)為 29,
將 performance_schema 中的統(tǒng)計(jì)量重置,
臨時(shí)表的表大小限制取決于參數(shù)? tmp_table_size 和 max_heap_table_size 中較小者,我們實(shí)驗(yàn)中以設(shè)置 max_heap_table_size 為例。
我們將會(huì)話級(jí)別的臨時(shí)表大小設(shè)置為 2M(小于上次實(shí)驗(yàn)中臨時(shí)表使用的空間),執(zhí)行使用臨時(shí)表的 SQL:
查看內(nèi)存的分配記錄:
會(huì)發(fā)現(xiàn)內(nèi)存分配略大于 2M,我們猜測(cè)臨時(shí)表會(huì)比配置略多一點(diǎn)消耗,可以忽略。
查看語(yǔ)句的特征值:
可以看到語(yǔ)句使用了一次需要落磁盤(pán)的臨時(shí)表。
那么這張臨時(shí)表用了多少的磁盤(pán)呢?
我們開(kāi)啟 performance_schema 中 waits 相關(guān)的統(tǒng)計(jì)項(xiàng):
重做實(shí)驗(yàn),略過(guò)。
再查看 performance_schema 的統(tǒng)計(jì)值:
可以看到幾個(gè)現(xiàn)象:
1. 臨時(shí)表空間被寫(xiě)入了 7.92MiB 的數(shù)據(jù)。
2. 這些數(shù)據(jù)是語(yǔ)句寫(xiě)入后,慢慢逐漸寫(xiě)入的。
來(lái)看看這些寫(xiě)入操作的特征,該方法我們?cè)?實(shí)驗(yàn) 03?使用過(guò):
可以看到寫(xiě)入的線程是 page_clean_thread,是一個(gè)刷臟操作,這樣就能理解數(shù)據(jù)為什么是慢慢寫(xiě)入的。
也可以看到每個(gè) IO 操作的大小是 16K,也就是刷數(shù)據(jù)頁(yè)的操作。
結(jié)論:
我們可以看到,
1. MySQL 會(huì)基本遵守 max_heap_table_size 的設(shè)定,在內(nèi)存不夠用時(shí),直接將表轉(zhuǎn)到磁盤(pán)上存儲(chǔ)。
2. 由于引擎不同(內(nèi)存中表引擎為 heap,磁盤(pán)中表引擎則跟隨 internal_tmp_disk_storage_engine 的配置),本次實(shí)驗(yàn)寫(xiě)磁盤(pán)的數(shù)據(jù)量和?實(shí)驗(yàn) 05?中使用內(nèi)存的數(shù)據(jù)量不同。
3. 如果臨時(shí)表要使用磁盤(pán),表引擎配置為 InnoDB,那么即使臨時(shí)表在一個(gè)時(shí)間很短的 SQL 中使用,且使用后即釋放,釋放后也會(huì)刷臟頁(yè)到磁盤(pán)中,消耗部分 IO。
一個(gè)傳輸?shù)陌?a communication packet 代表著:
1. 客戶端發(fā)送到mysql 服務(wù)端的單個(gè)SQL STATEMENT
2. 服務(wù)端發(fā)送到客戶端的單行數(shù)據(jù)
3. master發(fā)往slave的一個(gè)binary log event。
MySQL 8.0單個(gè)packet可以允許的最大值是1GB。
當(dāng)傳輸?shù)膒acket大于 max_allowed_packet 時(shí),觸發(fā)錯(cuò)誤 EN_NET_PACKET_TOO_LARGE ,并且關(guān)閉Connection。在有的客戶端中也會(huì)顯示信息 Lost connection to MySQL server during query
客戶端和服務(wù)端都有自己的 max_allowed_packet 變量,所以要調(diào)節(jié)此參數(shù)時(shí),必須同時(shí)增加server端和client端的配置變量。
如果是在使用mysql自帶的cleint,它的默認(rèn) max_allowed_packet 是16MB。要加大此值
服務(wù)端 max_allowed_packet 的默認(rèn)值是64M。
我們可以增大此值以便于server端接收更大的SQL(比如,涉及 BLOB 列)。實(shí)例如下
也可以通過(guò)option file去配置此項(xiàng)。
增大此配置的值并不會(huì)有太多危險(xiǎn),因?yàn)轭~外的內(nèi)存僅僅只在需要的時(shí)候被分配。比如,mysqld只在客戶端發(fā)送了一個(gè)大的查詢或者mysqld必須返回一個(gè)很大的result row時(shí)去分配更多的內(nèi)存。之所以默認(rèn)配置很小是為了預(yù)防意外情況下發(fā)送了巨大的packet導(dǎo)致out of memory。
當(dāng)有用到 blob 值時(shí),如果此配置過(guò)小可能導(dǎo)致奇怪的問(wèn)題。如果懷疑是此配置導(dǎo)致的,嘗試在 mysqld_safe 腳本開(kāi)頭增加 ulimit -d 256000 ,并重啟mysqld。
翻譯自官網(wǎng):
mysql 開(kāi)啟查詢緩存可以有兩種方法來(lái)開(kāi)啟一種是使用set命令來(lái)進(jìn)行開(kāi)啟,另一種是直接修改my.ini文件來(lái)直接設(shè)置都是非常的簡(jiǎn)單的哦。
開(kāi)啟緩存,設(shè)置緩存大小,具體實(shí)施如下:
windows下是my.ini,linux下是my.cnf;
在配置文件的最后追加上:
需要重啟mysql生效;
b) 開(kāi)啟緩存,兩種方式:
a)使用mysql命令:
如果報(bào)錯(cuò):
Query cache is disabled; restart the server with query_cache_type=1 to enable it,還是老老實(shí)實(shí)的該配置文件,然后重啟吧,原因如下:
查看是否設(shè)置成功
show variables like "%query_cache%" 查看是否設(shè)置成功:
當(dāng)然如果你的數(shù)據(jù)表有更新怎么辦,沒(méi)關(guān)系mysql默認(rèn)會(huì)和這個(gè)表有關(guān)系的緩存刪掉,下次查詢的時(shí)候會(huì)直接讀表然后再緩存
下面是一個(gè)簡(jiǎn)單的例子:
以上的相關(guān)內(nèi)容就是對(duì)mysql緩存查詢和設(shè)置的介紹,望你能有所收獲。
一般,我們會(huì)把 query_cache_type 設(shè)置為 ON,默認(rèn)情況下應(yīng)該是ON
query_cache_type有3個(gè)值 0代表關(guān)閉查詢緩存OFF,1代表開(kāi)啟ON,2(DEMAND)代表當(dāng)sql語(yǔ)句中有SQL_CACHE關(guān)鍵詞時(shí)才緩存,如:
這樣 當(dāng)我們執(zhí)行 select id,name from tableName; 這樣就會(huì)用到查詢緩存。
①在 query_cache_type 打開(kāi)的情況下,如果你不想使用緩存,需要指明
select sql_no_cache id,name from tableName;
②當(dāng)sql中用到mysql函數(shù),也不會(huì)緩存
當(dāng)然也可以禁用查詢緩存: mysql set session query_cache_type=off;
上面的顯示,表示設(shè)置查詢緩存是可用的。
表示查詢緩存大小,也就是分配內(nèi)存大小給查詢緩存,如果你分配大小為0,
那么 第一步 和 第二步 起不到作用,還是沒(méi)有任何效果。
上面是 mysql6.0設(shè)置默認(rèn)的,之前的版本好像默認(rèn)是0的,那么就要自己設(shè)置下。
設(shè)置
這里是設(shè)置1M左右,900多K。
再次查看下:
顯示我們?cè)O(shè)置新的大小,表示設(shè)置成功。
例如: 如果查詢結(jié)果很大, 也緩存????這個(gè)明顯是不可能的。
MySql 可以設(shè)置一個(gè)最大的緩存值,當(dāng)你查詢緩存數(shù)結(jié)果數(shù)據(jù)超過(guò)這個(gè)值就不會(huì)
進(jìn)行緩存。缺省為1M,也就是超過(guò)了1M查詢結(jié)果就不會(huì)緩存。
這個(gè)是默認(rèn)的數(shù)值,如果需要修改,就像設(shè)置緩存大小一樣設(shè)置,使用set
重新指定大小。
好了,通過(guò)4個(gè)步驟就可以 打開(kāi)了查詢緩存,具體值的大小和查詢的方式 這個(gè)因不同
的情況來(lái)指定了。
mysql查詢緩存相關(guān)變量
MySQL 提供了一系列的 Global Status 來(lái)記錄 Query Cache 的當(dāng)前狀態(tài),具體如下:
Qcache_free_blocks:目前還處于空閑狀態(tài)的 Query Cache 中內(nèi)存 Block 數(shù)目
Qcache_free_memory:目前還處于空閑狀態(tài)的 Query Cache 內(nèi)存總量
Qcache_hits:Query Cache 命中次數(shù)
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數(shù),也就是沒(méi)有命中的次數(shù)
Qcache_lowmem_prunes:當(dāng) Query Cache 內(nèi)存容量不夠,需要從中刪除老的 Query Cache 以給新的 Cache 對(duì)象使用的次數(shù)
Qcache_not_cached:沒(méi)有被 Cache 的 SQL 數(shù),包括無(wú)法被 Cache 的 SQL 以及由于 query_cache_type 設(shè)置的不會(huì)被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 數(shù)量
Qcache_total_blocks:Query Cache 中總的 Block 數(shù)量
檢查是否從查詢緩存中受益的最簡(jiǎn)單的辦法就是檢查緩存命中率
當(dāng)服務(wù)器收到SELECT 語(yǔ)句的時(shí)候,Qcache_hits 和Com_select 這兩個(gè)變量會(huì)根據(jù)查詢緩存
的情況進(jìn)行遞增
查詢緩存命中率的計(jì)算公式是:Qcache_hits/(Qcache_hits + Com_select)。
query_cache_min_res_unit的配置是一柄”雙刃劍”,默認(rèn)是4KB,設(shè)置值大對(duì)大數(shù)據(jù)查詢有好處,但如果你的查詢都是小數(shù)據(jù) 查詢,就容易造成內(nèi)存碎片和浪費(fèi)。
查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢緩存碎片率超過(guò)20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數(shù)據(jù)量的話。
查詢緩存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查詢緩存利用率在25%以下的話說(shuō)明query_cache_size設(shè)置的過(guò)大,可適當(dāng)減小;查詢緩存利用率在80%以上而且 Qcache_lowmem_prunes 50的話說(shuō)明query_cache_size可能有點(diǎn)小,要不就是碎片太多。
查詢緩存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%
示例服務(wù)器 查詢緩存碎片率 = 20.46%,查詢緩存利用率 = 62.26%,查詢緩存命中率 = 1.94%,命中率很差,可能寫(xiě)操作比較頻繁吧,而且可能有些碎片。
查詢緩存可以看做是SQL文本和查詢結(jié)果的映射。如果第二次查詢的SQL和第一次查詢的SQL完全相同(注意必須是完全相同,即使多一個(gè)空格或者大小寫(xiě)不同都認(rèn)為不同)且開(kāi)啟了查詢緩存,那么第二次查詢就直接從查詢緩存中取結(jié)果,可以通過(guò)下面的SQL來(lái)查看緩存命中次數(shù)(是個(gè)累加值):
另外即使完全相同的SQL,如果使用不同的字符集、不同的協(xié)議等也會(huì)被認(rèn)為是不同的查詢而分別進(jìn)行緩存。
在表的結(jié)構(gòu)或數(shù)據(jù)發(fā)生改變時(shí),查詢緩存中的數(shù)據(jù)不再有效。有這些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE會(huì)導(dǎo)致緩存數(shù)據(jù)失效。所以查詢緩存適合有大量相同查詢的應(yīng)用,不適合有大量數(shù)據(jù)更新的應(yīng)用。
可以使用下面三個(gè)SQL來(lái)清理查詢緩存:
1、FLUSH QUERY CACHE; // 清理查詢緩存內(nèi)存碎片。
2、RESET QUERY CACHE; // 從查詢緩存中移出所有查詢。
3、FLUSH TABLES; //關(guān)閉所有打開(kāi)的表,同時(shí)該操作將會(huì)清空查詢緩存中的內(nèi)容。
Query Cache是MySQL Server層的一個(gè)非常好的特性,對(duì)于小數(shù)據(jù)集或訪問(wèn)量非常集中的應(yīng)用場(chǎng)景,有非常好的性能提升,但是Query Cache引入了一些新的問(wèn)題,而且大部分場(chǎng)景下比較雞肋,官方打算棄用了
參考:
linux 怎么給mysql分配內(nèi)存大小
修改mysql配置文件,優(yōu)化緩存大小和連接數(shù)連接方式,優(yōu)化sql語(yǔ)句 ,記得mysql好像是有工具可以查看最占用資源的sql語(yǔ)句,找到他,優(yōu)化他。安裝好mysql后,配制文件應(yīng)該在/usr/local/mysql/share/mysql目錄中,配制文件有幾個(gè),有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的網(wǎng)站和不同配制的服務(wù)器環(huán)境,當(dāng)然需要有不同的配制文件了。
本文題目:mysql怎么分配內(nèi)存 mysql配置內(nèi)存占用
網(wǎng)頁(yè)路徑:http://m.rwnh.cn/article12/doopegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、手機(jī)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、微信小程序、品牌網(wǎng)站設(shè)計(jì)、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)