关于mysql优化之个人见解
2016-09-07 11:32
155 查看
从事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等
以上就是我个人的一些简单的见解,当然有很多说的不是很到位,如果有什么不对的地方,欢迎大家指正!
说起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等
以上就是我个人的一些简单的见解,当然有很多说的不是很到位,如果有什么不对的地方,欢迎大家指正!
相关文章推荐
- 关于通过easyui对mysql的模糊查询以及按时间段查询的个人见解
- 关于mysql配置主从同步,个人的见解与实现方法
- 关于哪种杀毒软件最好的一些个人见解[转载]
- 关于运营商的职业生涯之个人见解……(网络转载)
- 关于MySQL的LIMIT 语法小优化!
- 关于UML的个人见解--转自http://blog.csdn.net/ccat/archive/2010/06/13/5668593.aspx
- 关于哪种杀毒软件最好的一些个人见解[转载]
- 关于UML的个人见解——答周筠和霍炬两位老师
- 关于ADO.Net连接池(Connection Pool)的一些个人见解
- 关于项目管理的一些个人见解
- 关于项目管理的一些个人见解
- 关于ADO.Net连接池(Connection Pool)的一些个人见解
- 关于ADO.Net连接池(Connection Pool)的一些个人见解
- 关于试用深度运营的感受__个人见解
- 关于ADO.Net连接池(Connection Pool)的一些个人见解
- 关于MySQL数据量增加变化不大时,一种分页的优化方案
- 请教关于mysql的优化
- ASP.NET 中 关于Request 和Session 的一点个人见解
- 关于select上下移动实现的一些个人见解
- 关于MySQL的LIMIT 语法小优化!