Mysql优化建议

  1. 永远不要让mysql使用swap内存,会极大的降低性能。

存储hash类型数据的几条性能优化建议:

  1. 使用合适的charset,一般ascii就够了,不需要utf8。utf8在索引、排序等上面占用更多的内存和磁盘。
  2. 使用固定长度(fix-length)、非空的(non-null)的column来存储。
  3. 使用binary类型,比如对于md5存储:binary(16) > char(32) > varchar(100)。
  4. 使用前缀索引,如果使用前几个字符就能区分,则尽量使用前缀索引,更小的索引,意味着更好的性能:Smaller → More cacheable → Less I/O → Faster.
  5. 对于较长的字段,比如url,可以计算其crc32或者md5来加快索引。
  6. crc32只需一个int(4bytes)就可以存储,md5需要16个bytes。crc32更容易碰撞,但是在查询时,使用其作为其中的“最左条件”,可以过滤掉很多数据,从而加快数据。

具体参见:5 Ways to Make Hexadecimal Identifiers Perform Better on MySQL

Mysql通用配置参数优化:

Innodb存储引擎优化实践:

  1. 最重要的几个配置参数,重要程度依次递减:
    • innodb_buffer_pool_size:设置为服务器的70%左右最好。buffer_pool时用来存储cache数据、索引数据等等,更大的缓存,意味着能将更多的数据(索引)存入内存,从而提高性能。Innodb严重依赖这个参数。
    • innodb_log_file_size:Innodb在写入磁盘前,先将更新的数据写入log,所以,更大log size意味着更高的更新效率,但是同时增加了从crash恢复过来的时间。新版的mysql(5.6+),可以最大设置为4G。这个参数是需要根据业务算出来:具体算法参见:How to calculate a good InnoDB log file size
    • innodb_flush_method:设置数据如何从缓存和log中被flush到磁盘。推荐使用O_DIRECT,避免与OS的buffer形成双缓存。具体的可参见官方文档
    • innodb_log_buffer_size: 设置在一个事务还未被提交时,脏数据存放位置的大小。目前,默认的设置16M,能够满足大多数需求。这也是个需要根据业务计算的参数。
    • innodb_flush_log_at_trx_commit:控制事务ACID特性的参数。默认为1,表示完全遵循ACID。如果为了效率设置为0或者2,具体参见文档
    • innodb_file_per_table: 是否每一个表一个文件,而不是共享文件。推荐开启。
    • innodb_buffer_pool_instances:设置多个pool instances可避免锁竞争。默认为8个(如果pool size大于1G)。
    • innodb_thread_concurrency