众所周知,性能瓶颈大多出现在DB上。下面总结一下MYSQL一的常用优化手段:

一.做好表设计,做好业务切分。

    这是一切优化的前提,一个优秀的数据库结构同样也判定了你的程序结构。

因为程序说到底是产生业务数据,那么什么样的数据结构 会产生什么样的程序结构。DB设计原则还是我们通常讲的范式规则,保持数据的低冗余,在存储上最小。 这本身就会打下一个良好的基础。

当然我们会讲,业务的原子性会造成数据表增加,连表的代价增加。这都是设计一个综合,在设计的时候原则,我们会综合业务上的实际情况去综合。


二.选择合适的数据引擎。

     我们常用 的数据库引擎就两种,innodb,MyISAM .如果再加上memory(只合适小数据,最大长度6653)。

innodb与mysam最大的区别就是事务的支持,自然innodb存储结构要复杂得多,在写数据的时候先写到数据缓冲池中,再发消息到客户端可以commit的时候才去让数据真正生效。innodb自然是行级锁,也就是说在写某行数据的时候,是串行的,别人不能再来占用这行的写的权限了。innodb在并发写入的时候自然有了优势,只要不要大量数据对同一行数据进行并发写入。innodb不会有大的问题。

MyISAM 结构就简单得多了。在这种引擎上读的优化可以做的空间也大一些,而且读的性能经测试可能会高一倍左右。而且mysam的数据库迁移也方便得多,一个文件夹复制过来就得了。innodb就不行,因为他的存储复杂得多,方式也不一样的。

大家可以去看一下,MyISAM 表是三个文件(frm,myd,myi)

1、“.frm”文件
 
与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定
 
义信息等。不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文
 
件。
2、“.MYD”文件
 
   “.MYD”文件是MyISAM 存储引擎专用,存放MyISAM 表的数据。每一个MyISAM
 
表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,
 
和“.frm”文件在一起。
 
3、“.MYI”文件
    “.MYI”文件也是专属于MyISAM 存储引擎的,主要存放MyISAM 表的索引项

inndb的存储结构:

  1.frm文件

 2.“.ibd”文件和ibdata 文件

这在存储结构上区别就很大了。

  总结一下,myisam读更好,innodb并发写更好。那么主从配置的时候,我们可以在读写机上用 innodb,从机读用myisam。

三.优化索引,先把合适的字段做索引

   数据量当比较大的时候,如果没有索引那将是非常糟糕的,因为每次搜索都是全表磁盘扫描 。

   索引不要盲目加索引,必须要与业务结合设计。

  打个比方一个数据保存的的时候,记录了业务相关的数据与日期,在业务查询的时候我们常需要按年,月,日进行统计。

  通常我们会把日期存到一个字段当中 ,做一个索引,这种方式是不灵活的。当我们需要按月查询的时候,几乎是用不到这个字段索引的,

 那么我就需要把这个字段拆分成年月日,三个字段进行存储。然后再按业务的情况 去做一些联合索引,比如 年月做联合索引。

  另外索引的字段尽量体积小,不然索引的效率必然会下降。

  索引必然也带来写数据的负担,因为我们知道在写数据的时候,同样需要写入索引。当数据量上升的时候,索引是b树搜索logN的速度下降,当然这下降速度还是

比较平缓的。在索引更新的时候,其实是需要查询索引的,那么写数据的性能下降会在索引这里浪费一些时间的。


四.数据库配置参数

   key_buffer_size 是影响myisam性能最大影响的,索引缓冲区的大小,这是个好东西,MYI索引项的数据被放到内存里面,当然是快多了。但是这东西也不能配置过高了,

占内存过高了,会影响其它应用了。但这东西只对myisam有用。

innodb_buffer_pool_size   参数用来设置 Innodb 最主要的 Buffer(Innodb_Buffer_Pool)的大小,也就是缓存用户表及索引数据的最主要缓存空间,对 Innodb 整体性能影响也最大。这个与key_buffer_size 类似。

innodb_log_file_size  日志大点的好,太大也不好。

innodb_flush_method = O_DIRECT

   还有一些其它的参数,但是这几个参数是最重要的。影响 最大的。

五.结合nosql做缓存,如redis,memcache

六.全文搜索使用sphinx等。

七、读写分离,分库分表。。。。。

以上都是比较麻烦的,以后有机会再述了。。。。。