本文主要给大家简单讲讲影响MySQL数据库性能主要有哪些因素,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望影响MySQL数据库性能主要有哪些因素这篇文章可以给大家带来一些实际帮助。
影响数据库性能的因素:
很多sql性能是慢查询造成的
目前的mysql版本中,并不能支持多cpu并发运算,就是说一个sql只能用到一个cpu。常用qps、tps衡量cpu处理效率
qps/tps:每秒处理的查询量
max_connections可以根据情况设置大一些。如果实际超出这个数,会造成要用的云服务器无法连接数据库,会出现500错误
大表带来的问题:
(一般满足上述两条的表会造成性能影响)
大表会产生慢查询,让数据库很难在一定时间内过滤出所需要的数据
然而,分库分表要消耗大量人力物力,还要冒着影响后端业务的风险,不一定适合所有公司。还可以用另一种方式对大表进行处理:
大表历史数据归档(尽量减少对前后端业务的影响)(比如历史订单)
难点:
归档时间点的选择
如何进行归档操作(对大表的操作,轻则主从延迟,重则大量阻塞影响业务访问)
大事务带来的问题:
事务的特点:
原子性:不可分割的最小单元,要么全成功,要么全失败
一致性:从一种一致性状态转换到另一种一致性状态,在事务开始之前和事务结束后数据中数据的完整性没有被破坏(比如,转账前和转账后的总金额一致)
隔离性:要求一个事务对数据库中的数据的修改,在未提交完成前对于其他事务是不可见的
持久性: 一旦事务提交,则其所有的修改就会永久保存到数据库中。此时即使系统崩溃,已经提交的修改数据也不会丢失
什么是大事务:
定义:运行时间较长,操作的数据比较多的事务
风险:
锁定太多的数据,造成大量的阻塞和锁超时
回滚所需时间比较长(回滚过程中仍然会被锁定)
执行时间长,容易造成主从延迟(如果延迟1个小时,这就...)
如何处理大事务:
1.避免一次处理太多数据
2.移出不必要在事务中的select操作
新版本的mysql对多核cpu支持改善了
centos参数优化:
(上面的配置可以相应调大)
(上面的会决定tcp连接回收速度)
(上面的会决定tcp连接、接收、发送缓冲区大小的默认值、最大值。应该相应调大些)
(上面参数用于减少失效连接所占用的tcp系统资源的数量,加快资源回收的效率。应该改小些)
mysql参数:
......
基准测试:
基准测试不同于压力测试,压力测试通常是真实数据,基准测试的数据由测试工具生成,只是简化的压力测试
shell脚本写测试程序
运行保存测试结果
图标展示
测试工具:
ab、mysqlslap、sysbench......
适当反范式,适当增加冗余提高查询效率
(范式化提高了写的性能,但降低了读的性能)
(同一个表中可以属于同一个索引的,在不同表中就无法放到同一个索引了)
(反范式化在修改数据的时候会需要更改多个地方)
数据类型的选择:
注意:长度是字符,不是字节
(mysql为了更有效的优化查询,在内存中,对字符串使用的是固定的宽度,特别是使用隐式的内存零时表的时候,若把varchar宽度定义得更长,会消耗更多的内存)
(date只保留到日期部分,不保留时分秒。比如存储生日)
(mysql提供了足够多的时间存储类型,不要用字符串类型存储日期、时间数据)
mysql复制:
web云服务器访问过大后,可以通过增加web云服务器来解决。只要程序完全一样,就可以很好的分担这些负担。但数据库就不同了!
mysql的复制是异步的,在同一时间点上,备库和主库的数据存在不一样的情况,并且无法消除主库和备库之间的延迟
(复制并不能代替备份。复制无法对错误操作删除更改的数据进行恢复)
binlog日志中的记录都是已经执行成功的,回滚、由于错误执行不成功的事务是不会被记录的
表的复制,未完待续...
索引优化:
(覆盖索引之所以能提高查询性能,因为索引大小比行的大小小得多,如果索引本身很大,就没有覆盖索引的必要了,特别是对select *的查询,不可能有索引覆盖到所有的列。所以查询中不能使用太多列)
覆盖索引例子:
(完全可以通过索引来获取到,使用了覆盖索引)
(using where说明不能从索引中获取索要查的数据,也就是不能用到覆盖索引,而必须把索引数据先放到内存中,然后进行where条件的过滤)
(有using index,使用了覆盖查询)
索引排序优化的例子:
(上面是用索引来排序的。该表是innodb引擎。而同样的数据结构,若是myisam引擎,extra会显示using filesort)
(不管是myisam还是innodb,都没有用到using filesort)
(此处用到了using filesort!索引升降序的规则必须和order by升降序规则一致才行,不然无法用到索引列排序)
(增加了并发性,提高了性能)
(重复索引完全没必要,冗余索引有时候是可以有的)
sql优化:
获取有性能问题的sql:
设置慢查询:
(long_query_time单位秒)
然而,慢查询不大可能自己一个个看,还是要借助工具:
实时获取有性能问题的sql:
sql查询的步骤:
如何确定查询处理各个阶段所消耗的时间:
特定sql的优化:
(如果表中数据很多,count()查询会很慢,可以再建立一个表,用于汇总:)
可以每天凌晨的什么时候进行count(*)的统计,并写入到汇总表。今天要查询的话,就把汇总表中的数据和今天的数据进行union all
影响MySQL数据库性能主要有哪些因素就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的行业资讯。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。