关于MySql的性能提升文章多如乱麻,每个人有不同的见解,但技术往往是殊途同归的,下面记录我自己的一点心得。
最近两个月每天都和数据库打交道,包括LevelDB,Redis,都有过了解,但每天都在使用的还是MySql,实话实说,在之前对MySql还只是处于知道怎么用,但是并不熟悉。
两个月下来,原本需要借助图形界面完成的一些操作,现在命令行完成也不费吹灰之力,基础的增删改查,性能的调优,都有了进一步的认识。
最大的进步是解决问题的思路以及宽度,感觉整个人的思维贯通了,当然,这里离不开帮助我的leader,总是不厌其烦的耐心的帮助我,这里感谢鑫哥,么么哒。
回归正传,MySql的性能影响有两部分
第一部分
计算机硬件,包括CPU,MEM,磁盘IO,其中占主要资源的是磁盘IO。
我在实际使用中,很明显的感到固态硬盘,机械硬盘,云服务器之间的区别。
他们之间的性能比类似于:1固态 = 2云服务器 = 20机械
硬件方面没什么好说的,无非是花钱。
第二部分
sql语句,开关sql连接,检测sql语法,索引,主键等等。
上述是最能够影响的性能的条件,根据数据量的大小,数据的操作,占比关系也在不断变化。
先说检测sql语法这一项,mysql的一条语句执行,会有一系列的底层操作,其中有一项操作是检测语法正确性。
设想一下,如果同一种操作,只让MySql检测一次,那效率岂不是大大提高了。
没错,MySql本身支持这种操作,具体实现有插入语句
INSERT INTO TABLE VALUES (*,*,*),(*,*,*)...
不过,此类操作有字节限制,经过测试,大概有百万字节的瓶颈,如果报错,可以分批插入数据。
修改操作
UPDATE re_3c0_3cg, sd_3c0_3cg
SET re_3c0_3cg.outtime = sd_3c0_3cg.time
WHERE re_3c0_3cg.txid=sd_3c0_3cg.txid and re_3c0_3cg.n=sd_3c0_3cg.vout
同样的目的,实现方法有万千种,上述的修改操作,性能提高几个数量级,1000w数据量大概是3分钟与三天(甚至更多)的区别。
开关sql的连接,这是老生常谈的问题了,如果项目是频繁的操作数据库,尽量不要关闭sql的DB连接,开放一个端口的代价,解放其他系统资源,自己考虑合不合算。
同样的,每一次实现一条语句,底层就是一次sql的通信,尽量减少通信次数。
经过测试,MySql的事务好像可以减少通信次数,这样一来,事务会比一系列的复杂操作性能高一些,不过有限。
主键与索引相同点是,都是为了提高查询速度。
主键与索引不同点是,主键会将主键列进行排序,索引会为每一个表的索引创建一个新表,用来存放索引的标签。
主键与索引都可以组合索引,但是主键需要主键列数据相加唯一,而索引可以不唯一。
建立了索引或主键的表在查询上面的速度是相当迅速的,相对而言带来的弊端是存储空间的增大,最要命的是插入性能下降的非常厉害,主键/索引适应的场景是高读低写。
考虑到大部分数据是需要先插入,再读取,再不停的更新的步骤,给大家一个建议,可以先插入到某一个阶段后,整体索引,这样提升的性能也是很高的。
最后一个是MySql的语句,讲真的,MySql的性能百分之99和语句有关系
作为一个还不精通MySql的小白,唯一能给出的建议是,当你需要操作大量数据时,首先去上网查查你想要操作的命令。
多加对比,经过测试后,确定你需要的语句。
并且代码写完后也不是一成不变的,感觉哪个地方效率低下就上网查一下,实在查不到就问一下身边有经验的老师傅。
三人行必有我师,不耻下问是你我成长必经之路。
好了,废话连篇,本次心得分享完毕打完收工。