MySQL优化的一些需要注意的地方

1、控制适当的数据文件大小:

数据量越大,数据文件的大小也会越大,索引文件也就越大,从而影响性能,会使性能急剧下降,所以,要限制数据库单表的数据量和数据文件大小;

2、碎片空洞注意:

往往我们在删除表数据的时候,明明已经删除可是在底层只是被标记为删除,实际上并没有释放空间,所以要定期查看表的碎片,

show  table  status  ---发现表的碎片情况(查看实际数据data_length和空洞数据data_free的比例如果,data_free非常大,则说明该表需要优化了)

优化的方法是:optimize  table  表名;   或者  alter  table  表名 engine=innodb来重建表空间;

3、行存储格式注意:

在MySQL5.7.9之后,innodb表的行格式由之前默认的compact变成了dynamic,二者的区别可以查看官方文档,但是,compact格式会节约20%的空间,同时在存储UTF8或UTF8MB4数据的时候,compact格式在存储时会尽量的节约空间,不对其中的空格进行存储;

4、正确使用索引:

索引虽然能提升查询性能,但是会降低MySQL写数据的速度,同时,也会增大数据文件的大小,加的索引越多,写入数据越慢,数据文件也就越大。所以在设计索引的时候,会要求主键的字段类型一定要用数字类型,并且要尽可能的小,能用INT的,绝对不要用bigint。在设计二级索引的时候,只添加需要的索引,避免添加重复索引和冗余索引,针对长字符串字段,尽量添加前缀索引;

---如何正确使用索引:

①:MySQL在使用索引时,采用的是最左匹配原则,如果是多列索引:idx_a_b_c(a,b,c),则可以发挥索引功能组合有:a, (a,b)  (a,b,c)

②:MySQL在计算列里无法使用索引

③:MySQL在否定条件中不能使用索引

④:MySQL在join中连接字段类型如果不一致,则不能使用索引

*********************************************************************************

在MySQL中一些比较常用的系统参数:

1、general_log:

建议在数据库正常服务时,将该参数关闭,因为他会记录提交到MySQL的一切东西,即浪费磁盘又影响效率。同时它也是分析问题的利器,可以在数据库有异常的时候,把它打开,然后截取一段时间的日志,以帮助定位问题;

2、query_cache_size:

是用来缓存sql语句文本和对应查询结果的缓存空间。如果表没有变化,再次查询会直接返回结果,这是很高效的;如果表变化非常频繁,则要不断更新cache中的内容,并且这个时候所粒度非常大,反而会成为瓶颈。所以很多情况下会关闭这个选项,将参数设置0

3、tmp_table_size:

在group by 或 distinct 的时候,如果sql语句用不到索引,就会使用系统内部临时表记录中间状态。如果tmp_table_size不够大,则MySQL会自动使用物理磁盘,这会对查询性能造成很大影响,增加此参数可以降低这种情况发生的概率;(注意:这是占用物理内存的,要考虑实际的内存空闲情况)

4、innodb_buffer_pool_size:

innodb最只要的缓存,用来缓存innodb索引页面,undo页面及其他一些辅助数据,建议配置物理内存的50%--75%

5、innodb_buffer_pool_instances:

这个参数,把原来一整块buffer pool分割为多块内存空间,每个空间独立管理自己的空闲链表、刷新链表、LRU及其他数据结构。这大大增加了并发性,能更有效利用缓存;

6、innodb_log_file_size和innodb_log_files_in_group

这两个参数结合,决定了redo空间的大小,redo空间越大,可以存储的增量更新日志越大,有效降低buffer pool脏页面被淘汰的速度,同时减少了checkpoint的次数,降低磁盘IO置换率,从而提升数据库的写入效率。不过也有可能导致数据库异常退出时,恢复时间被拉长;

7、innodb_old_blocks_pct和innodb_old_blocks_time

这两个参数控制buffer pool中缓存数据的过期和移动行为,二者结合设置,可以优化一些全表扫描带来的大规模更新buffer等问题;

8、innodb_numa_interleave:

该参数避免出现内存被交换到SWAP分区,影响性能

9、innodb_autoinc_lock_mode:

在innodb有自增列的情况下,在插入数据的时候,会自动产生自增值,这个参数是控制自增值生成的方式。目前有3个选项:0 1  2 ;使用2即in特人leave的,这样在insert数据的时候不会用到标记的auto-inc锁,避免了auto-inc的死锁问题,在insert...select场景下会极大提升性能,在做普通insert的时候,也会提升并发执行的效率;

---注意:这个时候产生的自增值不是连续的,同时binlog格式需要设置为ROW,才能保证数据的安全性和一致性;

10、innodb_flush_method

innodb刷新数据和日志到磁盘文件的方式,默认为NULL,但其实如果是Unix系统上,默认是fsync;在使用SSD或PCIE类型的存储时,可以设置为O_DIRECT, 该参数会提升性能;

11、innodb_doublewrite

如果底层存储时支持原子写的,则可以关闭两次写,以提升效率;

12、innodb_io_capacity

如果使用SSD设备的时候,可以适当提高这个参数值,以加速flush的频率;

13、innodb_thread_concurrency

在并发量大的实列上,增加这个值,可以降低innodb在并发线程之间切换的花销,以增加系统的并发吞吐量;

14、innodb_flush_log_at_trx_commit

该参数的值0 1  2;0性能最好,但不安全; 1 最安全,但性能最差,如果使用的磁盘足够好,还是建议使用1  ,否则根据实际情况选择性的设置2

15、sync_binlog

MySQL同步binlog到磁盘的方式, 1 最安全,但性能最差; 0性能最好,但最不安全。建议设置1

16、binlog_format

MySQL的日志格式,在MySQL5.7.7以后,官方就默认为ROW了,这也是最建议的设置

17、binlog_order_commits

事务在提交的时候写入binlog的顺序,这是双刃剑,如果打开,可以保证事务都以相同的顺序写入二进制文件,如果关闭则可以提升性能。根据实际情况决定吧

18、tx_isolation

设置MySQL的隔离级别,推荐设置read committed,这在保证性能的前提下,同时设置binlog_format=ROW,确保通过binlog同步数据主从库的一致性,兼顾安全,满足绝大多数业务的需求;

19、slave_parallel_workers

在进行多线程复制的时候,如果设置此参数为非零值,则可以打开多线程并发执行回放日志的操作,以提升slave的同步性能;

时间: 2024-10-06 02:22:13

MySQL优化的一些需要注意的地方的相关文章

MySQL阶段七——MySQL优化

mysql优化 -一.硬件优化(优化的主要点) 01.CPU----最好是64位的,例:8-16颗CPU 02.内存----例:96G-128G,3-4个实例 03.disk----数量越多越好,性能:ssd(适合高并发业务)>sas(普通上线业务)>sata(适合线下) RAID----部署合适的RAID 04.网卡----多块网卡bond,以及buffer,tcp优化 -二.软件优化 01.操作系统----x86_64 02.软件:mysql,编译优化 -三.my.cnf里面参数优化 (一

一.mysql优化

一.mysql优化 1.网站请求走向分析优化的方面 需要优化的地方: a:网络优化,服务器硬件方面,CDN加速(访问离用户最近一台服务器获取资源文件(jquery,js)) b:页面静态化处理,访问速度更快 c:php代码本身需要优化(需要自身经验的积累) d:使用memcache,redis减轻数据库的压力,减少磁盘的i/o开销 e:mysql本身的优化 f:mysql架构(读写分离,主从复制) 2.mysql的优化的方向 存储层:选择合适的存储引擎,选择适当的列类型 设计层:给数据表建立合适

我必须得告诉你的MySQL优化原理3

聊聊MySQL配置. 大多数开发者可能不太会关注MySQL的配置,毕竟在基本配置没有问题的情况下,把更多的精力放在schema设计.索引优化和SQL优化上,是非常务实的策略.这时,如果再花力气去优化配置项,获得的收益通常都比较小.更多的时候,基于安全因素的考量,普通开发者很少能够接触到生产环境的MySQL配置.正是这样,导致开发者(包括我)对MySQL的配置不甚了解,希望本文能帮你更好的了解MySQL配置. 如果让你在某种环境上安装配置MySQL,你会怎么做?安装后,直接copy修改示例配置文件

Mysql优化之问题定位

Mysql优化之问题定位 先扯淡下,很久没有来csdn写博客了, 最近在学燕18的mysql优化,并且这位老师讲的高达上还接地气,  今天刚好有空可以来总结这段时间学到的东西 先上一张流程图(这张图引自燕18的教程) 当遇到一台db服务器有问题的时候, 首先不是去看代码哪里有问题, 想sql语句是否写,表的结构是否合理之类的问题:而是需要从宏观的角度去看哪些地方有问题 第一步找出服务器问题所在, 是否是硬件有瓶颈 如果一台服务器硬件本身就不好, 只能承受100M的io读写, 如果你非要它提供的i

MySQL必须调整的10项配置mysql优化

from:http://www.opsers.org/server/10-configuration-mysql-mysql-must-adjust-optimization.html 大多数配置能在运行时使用SET GLOBAL改变.这是非常便捷的方法它能使你在出问题后快速撤销变更.但是,要永久生效你需要在配置文件里做出改动. 一个变更即使重启了MySQL也没起作用?请确定你使用了正确的配置文件.请确定你把配置放在了正确的区域内(所有这篇文章提到的配置都属于 [mysqld]) 服务器在改动一

Mysql 优化方案

Mysql 优化方案 从开发角度优化mysql,让数据库效率更高.更快. 索引优化 查看mysql状态 通过周期性观察mysql状态优化,更有利于确定mysql性能瓶颈在哪里. 通过 show status 命令观察mysql的运行状态.其中比较主要的几个: 命令格式: show [global|session] status like 'command'; 默认是session: 当前会话:global: 全局会话. show status like "up_time"; 查看mys

MYSQL 优化指南

数据库设计原则 标准化和规范化 数据库设计范式(3NF) 第一范式 数据属性唯一标示 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库. 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性.如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系.在第一范式(1NF)中表的每一行只包含一个实例的

(转)MySQL优化系列

原文:http://blog.csdn.net/jack__frost/article/details/71194208 数据库,后端开发者必学,而且现在以MySQL居多.这个系列将系统化MySQL一些高级用法.打算先讲很多人关注的使用方式(增删改查以及其优化),然后就讲数据库和表的操作(很多我们学习忽略的地方),接着就是引擎还有更高级的查询等等.OK,不多说,Let's go! 本系列会逐步更新,从基本知识总结,到sql优化,索引设计优化,存储过程使用优化......并且到后面会给出一些方案设

关于mysql优化之个人见解

从事PHP也有3年的时间了,期间接触了Mysql,大学时候学的是SQL SERVER,相对而言,虽然少了SQL SERVER 的那种视图界面操作,但是我更喜欢cmd命令行这种黑屏操作,mysql以开源免费轻量著称,操作方便,用起来更是得心顺手,好了,废话不多说了,我们来聊聊Mysql的优化吧. 说起MySQL优化,很多人会首先想到查询优化,我不否认这种想法,但是我想纠正下这种观点,首先MySQL优化指的不仅仅是查询优化,比如MySQL的引擎选择,分库分表,以及索引多少的选择和使用,还有更新等都是