MySQL数据库优化经验详谈
同时在线访问量继续增大 对于1G内存的💈服务器【fú wù qì】🏄明显感【míng xiǎn gǎn】觉到吃【jiào dào chī】力严重时甚至每天都会死机⌛ 或者时【huò zhě shí】不时的【bú shí de】服务器【fú wù qì】🏄卡一下🔘 这个问【zhè gè wèn】题曾经困扰了我半个【wǒ bàn gè】🏫多月MySQL使用是很具伸㊗缩性的🈚算法❇,因此你【yīn cǐ nǐ】通常能【tōng cháng néng】🛺用很少的内存运行或【yùn háng huò】😰给MySQL更多的被存以【bèi cún yǐ】得到更【dé dào gèng】🕳好的性🐈能🛺。
安装好💡mysql后🐕,配制文【zhì wén】🎱件应该😾在【zài】/usr/local/mysql/share/mysql目录中😣,配制文【zhì wén】🎱件有几【jiàn yǒu jǐ】个,有【yǒu】my- huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的💣网站和【wǎng zhàn hé】不同配制的服务器环【wù qì huán】境,当然需【dāng rán xū】🎁要有【yǒu】不同的配制文【zhì wén】🎱件了。
一般的【yī bān de】情况下🖕,my-medium.cnf这个配【zhè gè pèi】制文件💊就能满【jiù néng mǎn】足我们【zú wǒ men】的大多需要🎍;一般我【yī bān wǒ】💙们会把【men huì bǎ】配置文🥀件拷贝到【dào】/etc/my.cnf 只需要🎍修改这个配【zhè gè pèi】置文🥀件就可【jiàn jiù kě】以了【yǐ le】,使用🕯mysqladmin variables extended-status –u root –p 可以看到【dào】目前的参数,有3个配置参数是🍺最重要⛷的,即:
key_buffer_size query_cache_size table_cache |
key_buffer_size只对🖊MyISAM表起作【biǎo qǐ zuò】用。
key_buffer_size指定索【zhǐ dìng suǒ】引缓冲🖨区的📤大小,它决定【tā jué dìng】索引处【suǒ yǐn chù】理的📤速度,尤其是索引读的📤速度。一般我们设为【men shè wéi】16M,实际上🛅稍微大一点的【yī diǎn de】📤站点 这个数字是远远不够的📤,通过检🌡查状态值🌈Key_read_requests和【hé】🦕Key_reads,可以知【kě yǐ zhī】道【dào】key_buffer_size设置是否合理🎍。比例【bǐ lì】key_reads / key_read_requests应该尽【yīng gāi jìn】可能的🥍低,至少是【zhì shǎo shì】1:100,1:1000更好(上述状【shàng shù zhuàng】态值🌈可以使用SHOW STATUS LIKE ‘key_read%’获得)。 或者如💸果你装【guǒ nǐ zhuāng】了【le】😮phpmyadmin 可以通过服务【guò fú wù】器运行🔴状态看⛎到,笔者推【bǐ zhě tuī】荐用phpmyadmin管理mysql,以下的📏状态值🌈都是本人通过【rén tōng guò】🚁phpmyadmin获得的【huò dé de】🤫实例分🚙析🛳:
这个服务器已经运行了20天
key_buffer_size – 128M key_read_requests – 650759289 key_reads - 79112 |
比例接近1:8000 健康状况非常好
另外一【lìng wài yī】个估计key_buffer_size的办法:把你网【bǎ nǐ wǎng】⬆站数据库的每个表的【gè biǎo de】索引所占空间🎙大【dà】小加🥜起来看【qǐ lái kàn】⭕看以此服务器【fú wù qì】为例:比较大【dà】🤙的几个【de jǐ gè】🆓表索引❕加起来大【dà】概125M 这个数字会随【zì huì suí】着表变🦉大【dà】而变大【dà】。
从4.0.1开始🐮,MySQL提供了【tí gòng le】查询缓冲【xún huǎn chōng】机制。使用查🦗询缓冲【xún huǎn chōng】,MySQL将【jiāng】SELECT语句和【yǔ jù hé】😳查询结果存放📠在缓冲【zài huǎn chōng】区中,今后对【jīn hòu duì】于同样的【de】🕉SELECT语句(区分大💴小写【xiǎo xiě】),将【jiāng】直接🧤从缓冲区中读取结果【qǔ jié guǒ】。根据【gēn jù】MySQL用户手🤥册🍆,使用查🦗询缓冲【xún huǎn chōng】最多可以达到238%的【de】🕉效率。
通过调🦍节以下几个参数可以✉知道【zhī dào】query_cache_size设置得是否合【shì fǒu hé】🔛理【lǐ】
Qcache inserts Qcache hits Qcache lowmem prunes Qcache free blocks Qcache total blocks |
Qcache_lowmem_prunes的值非常大📿,则表明【zé biǎo míng】经常出现缓冲【chōng】✡不够的🚟情况,同时Qcache_hits的值非常大📿,则表明【zé biǎo míng】查询缓【chá xún huǎn】冲【chōng】📒使用非常频【cháng pín】❣繁【fán】,此时需要增加📩缓冲【chōng】✡大小Qcache_hits的值不👎大,则表明【zé biǎo míng】你的查📈询重复率【lǜ】很低,这种情【zhè zhǒng qíng】况下使用查询缓【chá xún huǎn】冲【chōng】📒反而会影响效【yǐng xiǎng xiào】率【lǜ】🥍,那么可以考虑【yǐ kǎo lǜ】🐆不用查【bú yòng chá】😚询缓冲【chōng】📒。此外【cǐ wài】,在🏎SELECT语句中【yǔ jù zhōng】加入SQL_NO_CACHE可以明确表示Ⓜ不使用😸查询缓【chá xún huǎn】冲【chōng】📒。
Qcache_free_blocks,如果该值非常♍大【dà】,则表明【zé biǎo míng】缓冲区【huǎn chōng qū】📹中碎片很多🤓query_cache_type指定是否使用【fǒu shǐ yòng】查询缓冲🏨
我设置:
query_cache_size = 32M query_cache_type= 1 |
得到如下状态值:
Qcache queries in cache 12737 表明目【biǎo míng mù】🕯前缓存的条数 Qcache inserts 20649006 Qcache hits 79060095 看来重🎊复查询【fù chá xún】🖋率还挺高的 Qcache lowmem prunes 617913 有这么多次出现缓存过低的【guò dī de】情况 Qcache not cached 189896 Qcache free memory 18573912 目前剩【mù qián shèng】❓余缓存【yú huǎn cún】空间 Qcache free blocks 5328 这个数字似乎🥧有点大【yǒu diǎn dà】💌 碎片不少 Qcache total blocks 30953 |
如果内存允许32M应该要往上加点
table_cache指定表高速缓🍱存的大🏼小【xiǎo】。每当🎷MySQL访问一【fǎng wèn yī】个表时,如果在【rú guǒ zài】🤚表缓冲🚫区中还🛹有空间【yǒu kōng jiān】,该表就被打开并放入【bìng fàng rù】👬其中【qí zhōng】,这样可以更快地访问【dì fǎng wèn】表内容。通过检查峰值🔤时间的🎈状态值【tài zhí】⬅Open_tables和⬅Opened_tables,可以决定是否需要增【xū yào zēng】加table_cache的值【de zhí】🔤。如果你发现open_tables等于table_cache,并且opened_tables在不断【zài bú duàn】增长【zēng zhǎng】,那么你【nà me nǐ】就需要增【xū yào zēng】加table_cache的值【de zhí】🔤了(上述状态值【tài zhí】⬅可以使【kě yǐ shǐ】用SHOW STATUS LIKE ‘Open%tables’获得【huò dé】)。注意📛,不能盲目地把【mù dì bǎ】table_cache设置成🖤很大的值【de zhí】🔤。如果设置得太高,可能会造成文【zào chéng wén】件描述【jiàn miáo shù】🔌符不足,从而造🍻成性能🍮不稳定🕸或者连【huò zhě lián】🧠接失败。
对于有1G内存的🛐机器【jī qì】,推荐值💻是【shì】128-256。
笔者设置【zhì】💐table_cache = 256
得到以下状态:
Open tables 256 Opened tables 9046 |
虽然【suī rán】🌼open_tables已经等于🎿table_cache,但是相🔻对于🎿服务器运【yùn】🗓行时间【háng shí jiān】来说,已经运【yùn】行了🆕20天【tiān】,opened_tables的值也非常低【fēi cháng dī】。因此【yīn cǐ】🏉,增加table_cache的值应【de zhí yīng】该用处不大😎。如果运【rú guǒ yùn】行了🆕6个小时就出现上述值【shàng shù zhí】 那就要考虑增🕰大table_cache。
如果你不需要【bú xū yào】🐤记录🔊2进制【jìn zhì】log 就把这【jiù bǎ zhè】🛬个功能关掉👹,注意关掉👹以后就不能恢【bú néng huī】复出问【fù chū wèn】题前的数据了,需要您【xū yào nín】🎣手动备👴份😒,二进制日【jìn zhì rì】志包含所有更新数【gèng xīn shù】🎹据的语句,其目的【qí mù de】是在恢【shì zài huī】🏐复数据【fù shù jù】库时用📙它来把数据尽可能恢🛫复到最后的状态【tài】。另外,如果做同步复🏊制【zhì】( Replication )的话【de huà】,也需要🎛使用二🗑进制日【jìn zhì rì】志传送修改情况。
log_bin指定日【zhǐ dìng rì】志文件,如果不【rú guǒ bú】提供文件名,MySQL将自己【jiāng zì jǐ】产生缺🔦省文件名。MySQL会在文件名后♋面自动【miàn zì dòng】添加数🍴字引,每次启🐞动服务时📬,都会重😁新生成一个新【yī gè xīn】的二进【de èr jìn】😪制文件【zhì wén jiàn】。
此外,使用【shǐ yòng】📿log-bin-index可以指【kě yǐ zhǐ】🍮定索引文件【wén jiàn】💣;使用【shǐ yòng】📿binlog-do-db可以指【kě yǐ zhǐ】🍮定记录【dìng jì lù】📥的数据库【jù kù】⛎;使用【shǐ yòng】📿binlog-ignore-db可以指【kě yǐ zhǐ】🍮定不记【dìng bú jì】录的数🥓据库【jù kù】🏰。注意的是:binlog-do-db和🛤binlog-ignore-db一次只【yī cì zhī】指定一个数据库【jù kù】⛎,指定多【zhǐ dìng duō】个数据库【jù kù】⛎需要多个语句【gè yǔ jù】🏊。而且🚆,MySQL会将所有的数据库【jù kù】⛎名称改【míng chēng gǎi】成📺小写,在指定【zài zhǐ dìng】数据库【jù kù】⛎时必须全部使【quán bù shǐ】🤚用⛓小写名字,否则不【fǒu zé bú】会起作用⛓。
关掉这个功能只需要在他前面加上#号
#log-bin
开启慢【kāi qǐ màn】查询【chá xún】⭕日志【rì zhì】🕒( slow query log ) 慢查询【chá xún】⭕日志【rì zhì】🕒对于跟【duì yú gēn】踪有问题【tí】😱的查询【chá xún】🥟非常有【fēi cháng yǒu】用。它记录所有查【suǒ yǒu chá】过【guò】😭long_query_time的查询【chá xún】🥟,如果需要,还可以🚎记录不使用索引的记录。下面是一个慢查询【chá xún】⭕日志【rì zhì】🕒的例子【de lì zǐ】🏘:
开启慢查询日志【zhì】♋,需要设🗞置参数【zhì cān shù】log_slow_queries、long_query_times、log-queries-not-using-indexes。
log_slow_queries指定日💶志文件🌄,如果不提供文件名【míng】,MySQL将自己🚻产生缺【chǎn shēng quē】省文件【shěng wén jiàn】名【míng】。
long_query_times指定慢😖查询的
关键词:MySQL,数据库【shù jù kù】🔖优化【yōu huà】
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0