MySQL性能调优总结

MyISAM表锁优化建议

用表级锁定在锁定实现的过程当中比实现行级锁定或者页级锁所带来的
附加成本都要小,锁定自己所消耗的资源也是最少。可是因为锁定的颗粒度比较到,因此形成锁定资源
的争用状况也会比其余的锁定级别都要多,从而在较大程度上会下降并发处理能力。
一、 缩短锁定时间
惟一的办法就是让咱们的Query执行时间尽量的短。
a) 尽两减小大的复杂Query,将复杂Query分拆成几个小的Query分布进行;
b) 尽量的创建足够高效的索引,让数据检索更迅速;
c) 尽可能让MyISAM存储引擎的表只存放必要的信息,控制字段类型;
d) 利用合适的机会优化MyISAM表数据文件;
二、 分离能并行的操做
说到MyISAM的表锁,并且是读写互相阻塞的表锁,可能有些人会认为在MyISAM存储引擎的表上就只
能是彻底的串行化,没办法再并行了。你们不要忘记了, MyISAM的存储引擎还有一个很是有用的特性,
那就是Concurrent Insert(并发插入)的特性。
MyISAM存储引擎有一个控制是否打开Concurrent Insert功能的参数选项: concurrent_insert, 可
以设置为0, 1 或者2。三个值的具体说明以下:
a) concurrent_insert=2,不管 MyISAM 存储引擎的表数据文件的中间部分是否存在由于删除数据
而留下的空闲空间,都容许在数据文件尾部进行Concurrent Insert;
b) concurrent_insert=1,当 MyISAM存储引擎表数据文件中间不存在空闲空间的时候,能够从文
件尾部进行Concurrent Insert;
c) concurrent_insert=0,不管 MyISAM 存储引擎的表数据文件的中间部分是否存在由于删除数据
而留下的空闲空间,都不容许Concurrent Insert。
三、合理利用读写优先级
在本章各类锁定分析一节中咱们了解到了 MySQL的表级锁定对于读和写是有不一样优先级设定的,默
认状况下是写优先级要大于读优先级。因此,若是咱们能够根据各自系统环境的差别决定读与写的优先
级。若是咱们的系统是一个以读为主,并且要优先保证查询性能的话,咱们能够经过设置系统参数选项
low_priority_updates=1,将写的优先级设置为比读的优先级低,便可让告诉 MySQL 尽可能先处理读请
求。固然,若是咱们的系统须要有限保证数据写入的性能的话,则能够不用设置 low_priority_updates
参数了算法

 

Innodb行锁优化建议

Innodb存储引擎因为实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁
定会要更高一些,可是在总体并发处理能力方面要远远优于MyISAM的表级锁定的。当系统并发量较高的
时候, Innodb的总体性能和MyISAM相比就会有比较明显的优点了。可是, Innodb的行级锁定一样也有其脆弱的一面,当咱们使用不当的时候,可能会让Innodb的总体性能表现不只不能比MyISAM高,甚至可能会更差。数据库

要想合理利用Innodb的行级锁定,作到扬长避短,咱们必须作好如下工做:
a) 尽量让全部的数据检索都经过索引来完成,从而避免Innodb由于没法经过索引键加锁而升级
为表级锁性能优化

b) 合理设计索引,让Innodb在索引键上面加锁的时候尽量准确,尽量的缩小锁定范围,避免
形成没必要要的锁定而影响其余Query的执行;
c) 尽量减小基于范围的数据检索过滤条件,避免由于间隙锁带来的负面影响而锁定了不应锁定
的记录;
d) 尽可能控制事务的大小,减小锁定的资源量和锁定时间长度;
e) 在业务环境容许的状况下,尽可能使用较低级别的事务隔离,以减小 MySQL由于实现事务隔离级
别所带来的附加成本;
因为Innodb的行级锁定和事务性,因此确定会产生死锁,下面是一些比较经常使用的减小死锁产生几率
的的小建议,读者朋友能够根据各自的业务特色针对性的尝试:
a) 相似业务模块中,尽量按照相同的访问顺序来访问,防止产生死锁;
b) 在同一个事务中,尽量作到一次锁定所须要的全部资源,减小死锁产生几率;
c) 对于很是容易产生死锁的业务部分,能够尝试使用升级锁定颗粒度,经过表级锁定来减小死锁
产生的几率网络

 

Query优化思路

Query 语句的优化思路和原则
1. 优化更须要优化的Query;
2. 定位优化对象的性能瓶颈;
3. 明确的优化目标;
4. 从 Explain 入手;
5. 多使用profile
6. 永远用小结果集驱动大的结果集;
7. 尽量在索引中完成排序;
8. 只取出本身须要的Columns;
9. 仅仅使用最有效的过滤条件;
10. 尽量避免复杂的Join和子查询并发


索引的利处:

提升数据检索的效率,下降数据库的IO成本,加快检索时间,下降检索过程当中所须要读取的数据量。函数

下降数据的排序成本,排序字段恰好与索引字段一致。oop


索引的弊端:

索引的建立,索引的更新,会带来资源消耗问题。性能

 

索引创建条件:


◆ 较频繁的做为查询条件的字段应该建立索引;
◆ 惟一性太差的字段不适合单首创建索引,即便频繁做为查询条件;
◆ 更新很是频繁的字段不适合建立索引;
◆ 不会出如今 WHERE 子句中的字段不应建立索引;优化

 

适合索引的建议:

1. 对于单键索引,尽可能选择针对当前 Query 过滤性更好的索引;
2. 在选择组合索引的时候,当前 Query 中过滤性最好的字段在索引字段顺序中排列越靠前越好;
3. 在选择组合索引的时候,尽可能选择能够可以包含当前 Query 的 WHERE 子句中更多字段的索
引;
4. 尽量经过分析统计信息和调整 Query 的写法来达到选择合适索引的目的而减小经过使用
Hint 人为控制索引的选择,由于这会使后期的维护成本增长,同时增长维护所带来的潜在风险spa


MySQL 中索引使用相关的限制


1. MyISAM存储引擎索引键长度总和不能超过1000字节;
2. BLOB和TEXT类型的列只能建立前缀索引;
3. MySQL 目前不支持函数索引;
4. 使用不等于( != 或者 <>)的时候 MySQL 没法使用索引;
5. 过滤字段使用了函数运算后(如abs(column)), MySQL没法使用索引;
6. Join 语句中 Join 条件字段类型不一致的时候 MySQL 没法使用索引;
7. 使用 LIKE 操做的时候若是条件以通配符开始('%abc...') MySQL 没法使用索引;
8. 使用非等值查询的时候 MySQL 没法使用 Hash 索引;
9.在咱们使用索引的时候,须要注意上面的这些限制,尤为是要注意没法使用索引的状况,由于这很
容易让咱们由于疏忽而形成极大的性能隐


Join 的实现原理及优化思路


Join 语句的优化


1. 尽量减小 Join 语句中的 Nested Loop 的循环总次数;如何减小 Nested Loop 的循环总次数?最有效的办法只有一个,那就是让驱动表的结果集尽量的小。用小的结果集驱动大的结果集。

2. 优先优化Nested Loop 的内层循环;
不只仅是在数据库的 Join 中应该作的,实际上在咱们优化程序语言的时候也有相似的优化原则。内层循环是循环中执行次数最多的,每次循环节约很小的资源,在整个循环中就能节约很大的资源。
3. 保证 Join 语句中被驱动表上 Join 条件字段已经被索引;
4. 当没法保证被驱动表的 Join 条件字段被索引且内存资源充足的前提下,不要太吝惜 JoinBuffer 的设置
 

order by 优化

MySQL 目前能够经过两种算法来实现数据的排序操做。
1. 取出知足过滤条件的用于排序条件的字段以及能够直接定位到行数据的行指针信息,在 Sort Buffer 中进行实际的排序操做,而后利用排好序以后的数据根据行指针信息返回表中取得客户端请求的其余字段的数据,再返回给客户端;
2. 根据过滤条件一次取出排序字段以及客户端请求的全部其余字段的数据,并将不须要排序的字段存放在一块内存区域中,而后在 Sort Buffer 中将排序字段和行指针信息进行排序,最后再利用排序后的行指针与存放在内存区域中和其余字段一块儿的行指针信息进行匹配合并结果集,再按照顺序返回给客户端;

Group by优化

两种优化思路:
1. 尽量让 MySQL 能够利用索引来完成 GROUP BY 操做,固然最好是松散索引扫描的方式最佳。
在系统容许的状况下,咱们能够经过调整索引或者调整 Query 这两种方式来达到目的;
2. 当没法使用索引完成 GROUP BY 的时候,因为要使用到临时表且须要 filesort,因此咱们必须
要有足够的 sort_buffer_size 来供 MySQL 排序的时候使用,并且尽可能不要进行大结果集的 GROUP
BY 操做,由于若是超出系统设置的临时表大小的时候会出现将临时表数据 copy 到磁盘上面再进行
操做,这时候的排序分组操做性能将是成数量级的降低
 

Scheme设计性能优化

 

1.适度冗余--让Query减小join次数

2.大字段垂直拆分

将该大字段从原表中拆分出来,经过单独的表进行存放,让咱们在访问其余数据的时候大大下降IO访问,从而使性能获得较大的改善。这种分拆以后的两个表的关系都是彻底肯定的一一对应关系,使用Join在性能方面的影响也并非特别的大。
3.大表水平分拆 - 基于类型的分拆优化


化数据类型提升性能的主要原理在于如下几个方面:
1. 经过选用更“ 小” 的数据类型减小存储空间,使查询相同数据须要的IO资源下降;
2. 经过合适的数据类型加速数据的比较;

 

MySQL Server优化

网络链接与链接线程 ● max_conecctions:整个MySQL容许的最大链接数; ● max_user_connections:每一个用户容许的最大链接数  

相关文章
相关标签/搜索