本篇文章主要介绍了" MySQL性能优化——易实现的MySQL优化方案汇总",主要涉及到方面的内容,对于MySql感兴趣的同学可以参考一下:
一、索引优化(有关索引详解可参看博客http://blog.csdn.net/zhangliangzi/article/details/51366345)1、合...
3、对定长、MD5哈希码、长度较短的字段使用char类型,提高效率;对边长而且可能较长字段使用varchar类型,节约内存。
4、适当的进行水平分割与垂直分割,比如当表列数过多时,就将一部分列移出到另一张表中。
关于水平分割与垂直分割表详解:
水平分割表:一种是当多个过程频繁访问数据表的不同行时,水平分割表,并消除新表中的冗余数据列;若个别过程要访问整个数据,则要用连接*作,这也无妨分割表;典型案例是电信话单按月分割存放。另一种是当主要过程要重复访问部分行时,最好将被重复访问的这些行单独形成子集表(冗余储存),这在不考虑磁盘空间开销时显得十分重要;但在分割表以后,增加了维护难度,要用触发器立即更新、或存储过程或应用代码批量更新,这也会增加额外的磁盘I/O开销。
水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。
垂直分割表(不破坏第三范式):一种是当多个过程频繁访问表的不同列时,可将表垂直分成几个表,减少磁盘I/O(每行的数据列少,每页存的数据行就多,相应占用的页就少),更新时不必考虑锁,没有冗余数据。缺点是要在插入或删除数据时要考虑数据的完整性,用存储过程维护。另一种是当主要过程反复访问部分列时,最好将这部分被频繁访问的列数据单独存为一个子集表(冗余储存),这在不考虑磁盘空间开销时显得十分重要;但这增加了重叠列的维护难度,要用触发器立即更新、或存储过程或应用代码批量更新,这也会增加额外的磁盘I/O开销。垂直分割表可以达到最大化利用Cache的目的。
垂直分割可以使得数据行变小(因为列少了,一行数据就变小),一个数据页就能存放更多的数据,在查询时就会减少I/O 次数。其缺点是需要管理冗余列,查询所有数据需要join操作 。
三、临时表优化——临时表常常用于排序或分组,所以Order By与Group By后的字段尽量使用索引
临时表可以根据实际需求使用,但要尽力避免磁盘临时表的生成。
1、常见的会产生内存临时表的情况
1、UNION查询。
2、子查询(所以我们一般用join代替子查询)。
3、join查询中,如果order by 与 group by如果使用的不都是第一张表上的字段,就会产生临时表。
4、order by中使用distinct函数。
2、常见的会产生磁盘临时表的情况
1、数据表中包含BLOB/TEXT列。
2、Group by、distinct、union查询中包含超过512字节的列。
四、其他优化
1、不使用Select *,只查询需要的字段。
2、在只查询一条字段时,limit 1。
3、避免大事务操作,提高并发能力。
4、在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
5、尽量少使用游标。
6、多去关注慢查询,总有我们提前考虑不到的问题,出现了就去解决它!