众所周知,性能瓶颈大多出现在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等。
七、读写分离,分库分表。。。。。
以上都是比较麻烦的,以后有机会再述了。。。。。