从事PHP也有3年的时间了,期间接触了Mysql,大学时候学的是SQL SERVER,相对而言,虽然少了SQL SERVER 的那种视图界面操作,但是我更喜欢cmd命令行这种黑屏操作,mysql以开源免费轻量著称,操作方便,用起来更是得心顺手,好了,废话不多说了,我们来聊聊Mysql的优化吧。
说起MySQL优化,很多人会首先想到查询优化,我不否认这种想法,但是我想纠正下这种观点,首先MySQL优化指的不仅仅是查询优化,比如MySQL的引擎选择,分库分表,以及索引多少的选择和使用,还有更新等都是优化的一部分,我曾经听一位MySQL的讲师说过一句话:“不去优化就是最大的优化”,当时第一次听这句话的时候颇有点武侠“无招胜有招”的感觉,后来我慢慢理解了,这句话是告诉我们,你不去使用数据库取数据就不用再去做什么优化了,那么不去数据库,去哪取数据呢,这就需要用到诸如Memcached,redis,Solr 等缓存库了。
说起索引优化,并不是索引越多越好,相反,索引越多就会有弊端,大家都知道,加索引就相当于是书签,能提升MySQL的读入速度,但是很多人却不知道,你加了索引在5个以上对于千万级数据量来说是以牺牲写入速度来换取的,所以,换句话说,索引只需要建立适合的,不是越多越好。
再来简单说说查询优化,首先查询一种说法有N种SQL写法,所以,每种写法带来的效率是不一样的,比如在价格表中查询最低价,就有很多查法,1是用MySQL自带的MIN函数,2是用order by 来降序查询第一条数据,当然还有其他诸如此类的写法,我们在查询的时候习惯性的用*来代表字段查询,但是我觉得这样不是很好,在查询的时候需要什么字段会去查什么字段而不是偷懒的使用*来代替,而且你所取的数据中肯定不是所有字段都用到吧。
还有就是在数据类型的选择上,比如INT型,CHAR型,VARCHAR型等常用类型,那么我们选择怎么选择类型呢?比较知名企业腾讯在整型的选择上用的并非是INT而是BigInt型,因为QQ会有特殊的靓号会存储不释放,所以存储空间需要8个字节,但是对于几万条,几十万条数据的中小型企业INT型就够用了,当然我们要防范INT溢出,要是数据超出了,就需要分库分表了,又比如在做用户管理功能的时候,存储男女,这时候建议使用ENum类型,虽然存储的是0和1,但是读出来确是男和女,比你转化的效率要高吧。再来说说char和varchar ,这哥俩最本质的区别就是字节的满与不满,char是定多少字节就是多少字节,而varchar更灵活,会自动设置空间大小,所以在字符串选择上更优先选择VARCHAR类型。当然在查询表数据的时候如果你的数据类型是固定长度,查询速度会更快。
优化不仅仅是我说的这些东西,比如引擎的选择上,MyIsam在不考虑任何比较的情况下,读的速度是最快的,而INNODB支持行锁并且支持事务处理在写入较多的情况下速度会大幅度提升,又比如说在建表的时候就得想好存储结构,字段类型,必要的时候加上not null等
以上就是我个人的一些简单的见解,当然有很多说的不是很到位,如果有什么不对的地方,欢迎大家指正!