我是靠谱客的博主 知性仙人掌,最近开发中收集的这篇文章主要介绍MySQL 性能调优的10个方法一、选择合适的存储引擎二、从内存中读取数据三、定期优化重建数据库四、减少磁盘写入操作五、提高磁盘读写速度六、充分使用索引七、分析查询日志和慢查询日志八、激进的方法,使用内存磁盘九、用NOSQL的方式使用MYSQL十、其它,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 一、选择合适的存储引擎
    • 1.1 如何选择
    • 1.2 InnoDB 引擎独立表空间
  • 二、从内存中读取数据
    • 2.1 足够大的 innodb_buffer_pool_size
    • 2.2 数据预热
  • 三、定期优化重建数据库
  • 四、减少磁盘写入操作
    • 4.1 使用足够大的写入缓存 innodb_log_file_size
    • 4.2 innodb_flush_log_at_trx_commit
    • 4.3 避免双写入缓冲
  • 五、提高磁盘读写速度
  • 六、充分使用索引
    • 6.1 添加必要的索引
    • 6.2 使用自动加索引的框架或者自动拆分表结构的框架
  • 七、分析查询日志和慢查询日志
  • 八、激进的方法,使用内存磁盘
  • 九、用NOSQL的方式使用MYSQL
  • 十、其它

一、选择合适的存储引擎

1.1 如何选择

MyISAM:

  • 做很多count 的计算;
  • 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择;
  • 没有事务。

InnoDB:

  • (1)可靠性要求比较高,或者要求事务;
  • (2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;

1.2 InnoDB 引擎独立表空间

使用:

  • 配置文件中加 innodb_file_per_table=1

优点:

  • 每个表的数据和索引会存在自己独立的表空间中;
  • 实现单表在不同数据库移动;
  • 空间可以自己回收:删除大量数据后,使用 alter table TabelName engine=innodb、回收不用的空间。

缺点:

  • 单表增加过大,如超过100个G。

二、从内存中读取数据

2.1 足够大的 innodb_buffer_pool_size

数据完全保存在 innodb_buffer_pool_size ,即按存储量规划 innodb_buffer_pool_size 的容量。这样你可以完全从内存中读取数据,最大限度减少磁盘操作。

方法:

  • 如果 Innodb_buffer_pool_pages_free 为 0,则说明 buffer pool 已经被用光,需要增大 innodb_buffer_pool_size。
   mysql> SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';
  • 用iostat -d -x -k 1 命令,查看硬盘的操作。

2.2 数据预热

默认情况,只有某条数据被读取一次,才会缓存在 innodb_buffer_pool。所以,数据库刚刚启动,需要进行数据预热,将磁盘上的所有数据缓存到内存中。数据预热可以提高读取速度。

三、定期优化重建数据库

mysqlcheck -o –all-databases 会让 ibdata1 不断增大,真正的优化只有重建数据表结构:

CREATE TABLE mydb.mytablenew LIKE mydb.mytable;
INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytablenew RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;

四、减少磁盘写入操作

4.1 使用足够大的写入缓存 innodb_log_file_size

注意:
如果用 1G 的 innodb_log_file_size ,假如服务器当机,需要 10 分钟来恢复。
推荐:
innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size。

4.2 innodb_flush_log_at_trx_commit

这个选项和写磁盘操作密切相关:

innodb_flush_log_at_trx_commit = 1   ##则每次修改写入磁盘;
innodb_flush_log_at_trx_commit = 0/2 ##每秒写入磁盘;

如果你的应用不涉及很高的安全性 (金融系统),或者基础架构足够安全,或者 事务都很小,都可以用 0 或者 2 来降低磁盘操作。

4.3 避免双写入缓冲

innodb_flush_method=O_DIRECT

五、提高磁盘读写速度

RAID0 尤其是在使用 EC2 这种虚拟磁盘 (EBS) 的时候,使用软 RAID0 非常重要。

六、充分使用索引

6.1 添加必要的索引

  • 索引是提高查询速度的唯一方法,比如搜索引擎用的倒排索引是一样的原理。
  • 索引的添加需要根据查询来确定,通过 EXPLAIN 命令分析查询。

6.2 使用自动加索引的框架或者自动拆分表结构的框架

  • Rails框架 会自动添加索引;
  • Drupal框架 会自动拆分表结构。

七、分析查询日志和慢查询日志

  • 记录所有查询,这在用 ORM 系统或者生成查询语句的系统很有用;
log=/var/log/mysql.log  ##注意不要在生产环境用,否则会占满你的磁盘空间。
  • 记录执行时间超过 1 秒的查询:
long_query_time=1log-slow-queries=/var/log/mysql/log-slow-queries.log

八、激进的方法,使用内存磁盘

  • 现在基础设施的可靠性已经非常高了,比如 EC2 几乎不用担心服务器硬件当机。而且内存实在是便宜,很容易买到几十G内存的服务器,可以用内存磁盘,定期备份到磁盘。
  • 将 MYSQL 目录迁移到 4G 的内存磁盘。
mkdir -p /mnt/ramdisk

sudo mount -t tmpfs -o size=4000M tmpfs /mnt/ramdisk/

mv /var/lib/mysql /mnt/ramdisk/mysql

ln -s /tmp/ramdisk/mysql /var/lib/mysql

chown mysql:mysql mysql

九、用NOSQL的方式使用MYSQL

  • B-TREE 仍然是最高效的索引之一,所有 MYSQL 仍然不会过时。
  • 用 HandlerSocket 跳过 MYSQL 的 SQL 解析层,MYSQL 就真正变成了 NOSQL。

十、其它

  • 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null。
  • 最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库。
  • 将非”索引”数据分离,比如将大篇文章分离存储,不影响其他自动查询。
  • 不用 MYSQL 内置的函数,因为内置函数不会建立查询缓存。
  • 使用 IP 而不是域名做数据库路径,避免 DNS 解析问题。

最后

以上就是知性仙人掌为你收集整理的MySQL 性能调优的10个方法一、选择合适的存储引擎二、从内存中读取数据三、定期优化重建数据库四、减少磁盘写入操作五、提高磁盘读写速度六、充分使用索引七、分析查询日志和慢查询日志八、激进的方法,使用内存磁盘九、用NOSQL的方式使用MYSQL十、其它的全部内容,希望文章能够帮你解决MySQL 性能调优的10个方法一、选择合适的存储引擎二、从内存中读取数据三、定期优化重建数据库四、减少磁盘写入操作五、提高磁盘读写速度六、充分使用索引七、分析查询日志和慢查询日志八、激进的方法,使用内存磁盘九、用NOSQL的方式使用MYSQL十、其它所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部