第一次操刀数据库分表的教训与经验--白干一场
做完了分表之后,数据库里面的表从8张变成了8000张,我以为谷歌的抓取速度会降低为原来的一半,于是每天看一次谷歌抓取速度,结果实在是太失望了
结果发现,分完表之后谷歌抓取等待的时间迅速上升了,对mysql不是很了解,查了一下mysql的一些配置信息,我的数据库默认是innodb,
结果发现innodb默认是把所有的表放在一个文件里面,无论这个数据库里面有多少张表,也想起来sqlserver默认也是吧所有的表放在一个文件里面,
sqlserver分表的时候自己可以新添加文件组,查了下mysql的配置,mysql 有这么个配置Innodb_file_per_table,不过设置完后必须从新导入一次数据,以后安装mysql得先看看Innodb_file_per_table的配置,以免自增麻烦。
我以为这样就好了,但是看谷歌抓取时候监控宝的监控记录,发现cpu还是和以前一样高
cpu高是因为什么呢?
是因为我分表造成的?
1:查看mysql 在win下的设置,说一台服务器上的文件句柄数最大为2048个,是不是我分的太多表造成(8000张。。)?-----经验欠缺,先这么着吧
2:会不会是因为我读取问题列表时候,吧问题的全部内容读取出来了,造成并发高时候,io忙,cpu很忙碌?-------这个有办法加个简介字段
3:会不会是因为我读取出来内容用正则表达式过滤html,传说正则表达式是高并发下的cpu杀手?--------------这个有办法加个简介字段、过滤html
给1000张表加字段的问题用博客园园友的分表工具,很轻松就搞定了,
原来是select * 换成 select 部分字段 PetaPoco 很容易就搞定了
以前是这么写的
Page<question> result = learnDAL.learnDB.GetInstance().Page<question>(page, itemsPerPage, @"select * from question_home order by addtime desc ", "");
现在这么写
Page<question> result = learnDAL.learnDB.GetInstance().Page<question>(page, itemsPerPage, PetaPoco.Sql.Builder.Select(@" title, titlecode, Brief as content, userid, siteid, tagids, havegoodanswer, addtime, tags").From("question_home").OrderBy("addtime desc ")
发现PetaPoco这种开源的小工具果然是小巧玲珑好掌握
做完之后上线做个压力测试对比下
【周五做的50并发和cpu观测】---ps:这个在线并发测试工具,只能免费使用几次,哎。。。。。。。
周六修改完之后
100个并发和cpu【ps:最后几个免费金币】
发现读取列表时候不读取大字段,和不做正则表达式过滤,cpu立马平稳了,
这次分表完全是白干了一场,还不知道一个mysql库里面放8000张表在win2003下是不是合理,是不是很糟糕,
求路过的大神指点一下 mysql和sqlserver,在一个数据库库里面放多少张表是合理的?