MySQL处理记录数的极限是多少

2011-04-07 09:51:37 +08:00
 dongsheng
最近处理一个大学的课程管理系统数据库,他们的一个日志表达到2000万行记录的水平,已经有了严重的性能问题,mysql有很多死掉的查询,请问MySQL何时会在记录数上出现瓶颈,有什么合适的解决办法吗?(这里不可能使用NoSQL)
23231 次点击
所在节点    MySQL
56 条回复
TheOnly92
2011-04-07 12:25:39 +08:00
这个难道不能存入缓存吗?看到很多查询锁死,不表示该查询的问题,而是之前的查询还没完,接下来的查询都不能顺利进行。所以还得找出最根本的问题。
dongsheng
2011-04-07 12:28:43 +08:00
@Livid

现在这个表是myisam的,换成innodb会不会有后遗症?
我严重怀疑mysql不争气,同样的系统,有人用postgresql做存储,大致一个级别的网站,没有出现log表锁死的问题,不过它的服务器要稍好些。
liwei
2011-04-07 12:30:03 +08:00
@dongsheng 是MyISAM的引擎吧,我觉得是频繁的写操作导致大量读操作被锁住,MyISAM的表级锁粒度太大。可以试着分表,把旧的数据独立出来给读取用,新数据写入一个其他的表,然后定期批量写入。或者采用 InnoDB,它用行级锁,锁效率要好的多
dongsheng
2011-04-07 12:34:15 +08:00
@TheOnly92

其实最根本的原因是我不是mysql专家 :-) 实在是缺乏优化的经验。

据我所知mysql有内置的query cache吧,系统里有不少复杂查询,第一次很慢,之后会从缓存取,而不是再跑一遍查询。把SELECT COUNT(*) FROM log;缓存起来不太现实,这个表每分钟都能增长几千几万条记录,其他的查询也是在时时变化的。
Livid
2011-04-07 12:34:38 +08:00
@dongsheng 你的这张表有多个 bigint 的索引,按照目前的数据规模,所有的这些索引加起来可能就占用了数 G 的内存。服务器一共有多少内存?现在是否已经开始吃交换分区?这些都是需要看的。
dongsheng
2011-04-07 12:36:51 +08:00
@liwei 这个也考虑过了,两个月前把所有新的log写入log_temp表,然后让cron把log_temp里的东西转移到log表里,这样算是解决了insert锁死的问题,没想到现在连读都能锁死了
AntiGameZ
2011-04-07 12:38:05 +08:00
请问一下,moodle有没有什么特殊含义,是系统在moodle上改的,还是随便取的?
dongsheng
2011-04-07 12:39:49 +08:00
@Livid 这个竟然有这么大的区别?我现在没法进produciton server,那边的管理员在另一个半球睡觉,等他们上线让他们查查mysql吃掉的内存。
Livid
2011-04-07 12:41:06 +08:00
bigint 是 8 个字节,int 是 4 个字节。
TheOnly92
2011-04-07 12:41:09 +08:00
当时就应该考虑换成 innodb 了吧,如果只是要搞定 COUNT(*) 的问题,可以建立另一个列表在每次 insert 时记录下来,然后之后需要的时候从这个列表读取而不是 COUNT(*) 就行了吧。

但是 myisam 问题确实很大啊。。。
dongsheng
2011-04-07 12:42:13 +08:00
@AntiGameZ moodle是个开源的课程管理系统,这个表是moodle系统里的表
liwei
2011-04-07 12:43:32 +08:00
@dongsheng 如果这个表只有读取线程的话是不会锁的,读锁又不是互斥的
@AntiGameZ 你遇到 moodle 的开发者了,哈哈
dongsheng
2011-04-07 12:44:57 +08:00
@TheOnly92 这个系统有很久的历史了,大概05年开始的,那时候innodb还籍籍无名呢 :-)
dongsheng
2011-04-07 12:47:10 +08:00
@liwei 是我用词不对,读的query就是死在那里永远的waiting。。。
muxi
2011-04-07 12:54:07 +08:00
囧,看了表的定义,全都是bigint,连time都是bigint,浪费的不止一点点内存啊
具体你要看服务器本身的负责,io延迟等参数,内存使用量
dongsheng
2011-04-07 12:58:09 +08:00
@muxi mysql处理bigint(10)和int(10)分配的是不同的内存?
Livid
2011-04-07 13:00:31 +08:00
@dongsheng bigint 比 int 要消耗双倍的存储,无论是磁盘上还是内存里。
muxi
2011-04-07 13:06:27 +08:00
@dongsheng bigint 和int 都是定长的类型啊,10 只是表示显示宽度,并不能影响存储的大小
Platinum
2011-04-07 13:44:50 +08:00
05 年我面试一人,临走前最后一个问题是你用 slowlog 么,那哥们说 恩,我从来都是设成1

先 slowlog,再抓出语句 explain

又及,你的 key_buffer 用了多少

网上优化的文章一大堆,碰到问题先考虑自己会不会用 MySQL,然后再去考虑 MySQL 的极限是多少

推荐所有想用 MySQL 的人都买本《高性能 MySQL》 http://book.douban.com/subject/4241826/
dongsheng
2011-04-07 14:01:25 +08:00
@Platinum 只是用这么标题引出优化问题而已,何必又是面试某某又是批评别人不会用mysql?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/11090

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX