MySQL数据库MyISAM表类型优化设置参考 帝国CMS百万访问量真实操作后结论

MySQL数据库MyISAM表类型优化设置参考 帝国CMS百万访问量真实操作后结论

浏览次数:
作者: 墨鱼
信息来源: 本站原创
更新日期: 2024-04-12 00:39:56
文章简介

墨鱼今天为什么不说InnoDB表类型,反而要说MyISAM表类型呢?因为墨鱼使用帝国CMS,而它的默认表类型就是MyISAM。说之前先简单介绍一下这两个表类型。Mysql中的InnoDB和MyISAM是在

  • 正文开始
  • 相关阅读
  • 推荐作品

墨鱼今天为什么不说InnoDB表类型,反而要说MyISAM表类型呢?因为墨鱼使用帝国CMS,而它的默认表类型就是MyISAM。说之前先简单介绍一下这两个表类型。

Mysql中的InnoDB和MyISAM是在使用MySQL中最常用的两个表类型,各有优缺点.两种类型最主要的差别就是 InnoDB 支持事务处理与外键和行级锁.而MyISAM不支持.所以Myisam往往就容易被人认为只适合在小项目中使用。但是从数据库需求角度讲,要求99.9%的稳定性,方便的扩展性和高可用性来说的话,那MyISAM绝对应该是首选。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快, 只是不提供事务支持.大部分项目是读多写少的项目,而Myisam的读性能是比innodb强不少的.

接着说数据库优化参数怎么调吧,说是百万访问量是墨鱼一个客户的站点,严格来说它的访问量是80W-110W左右。使用的帝国CMS7.5 utf8,前台使用伪静态模式。当然找我帮忙肯定是使用了我的模版啦。模版去掉了一些繁杂调用,主要过程为文章列表和内容展现,没有交互部分。

服务器硬件方面还是很强的,毕竟要应对百万级访问,WEB服务和数据库服务是分离服务器的。其中双服务器都用了阿里云的超级硬盘,就是最贵、盘性能最高的那个,CPU和内存也不小。

找我是因为定制了一个随机调用优化的改造,这个在往期的篇章里也有介绍:https://www.moyublog.com/notes/1221.html 制作完以后,老铁想让墨鱼顺便看看最近数据库服务器CPU容易跑满的问题,于是就顺手帮他看了下。

查看的过程不表,总之用了一个下午,具体使用了一些MYSQL的性能计算公式,然后不停的观察调整,最后优化方案如下:

key_buffer_size – 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%。但是注意,分多少内存应该是根据需求决 定,而不是不管什么机器,都砍掉一半内存用作 key_buffer_size .合理的值取决于索引大小、数据量以及负载 — 记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。可以通过SHOW GLOBAL STATUS 时的 Key_blocks_unused来查看,只要还有剩余,就说明 key_buffer_size 没用满。如果你很少使用MyISAM表,那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引所需。

query_cache — 如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通 常设置为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,如果缓存命中率太低了,就启用它。

sort_buffer_size –如果你只有一些简单的查询,那么就无需增加它的值了,尽管你有 64GB 的内存。搞不好也许会降低性能。

 query_cache_size -查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,查询缓冲也许引起性能下降而不是性能提升.注意:设置query_cache_limit,只有小于此设定值的结果才会被缓冲, 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.

bulk_insert_buffer_size -MyISAM 使用特殊的类似树的cache来使得突发插入, (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA INFILE) 更快. 此变量限制每个进程中缓冲树的字节数. 设置为 0 会关闭此优化.为了最优化不要将此值设置大于 “key_buffer_size”.当突发插入被检测到时此缓冲将被分配.

read_rnd_buffer_size -当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.如果你增高此值,可以提高很多ORDER BY的性能.当需要时由每个线程分配

thread_cache_size - 我们在cache中保留多少线程用于重用,当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,则客户端线程被放入cache中.这可以在你需要大量新连接的时候极大的减少线程创建的开销

附录:适用于日IP 50-100w,PV 100-300w的站点,针对Dell R710,双至强E5620、16G内存的硬件配置。CentOS 5.6 64位系统,MySQL 5.5.x 稳定版的部分数据库配置文件,供大家参考

back_log = 300

max_connections = 3000

max_connect_errors = 30

table_cache = 4096

max_allowed_packet = 32M

#external-locking

#skip-networking

binlog_cache_size = 4M

max_heap_table_size = 128M

sort_buffer_size = 16M

join_buffer_size = 16M

thread_cache_size = 16

thread_concurrency = 8

query_cache_size = 128M

ft_min_word_len = 8

#memlock

thread_stack = 512K

transaction_isolation = REPEATABLE-READ

tmp_table_size = 128M

#log_slave_updates

#log

#log_warnings

log_slow_queries

long_query_time = 6

log_long_format


编写bat批处理脚本为文件批量添加前缀,可填文件扩展名
« 上一篇 2024年04月12日
墨鱼分享两个“马虎”导致的“抓狂”问题,一定要注意PHP开发中书写习惯和文本格式
下一篇 » 2024年04月18日

如本文对您有帮助,就请墨鱼抽根烟吧!