独步古今 发表于 2009-4-1 01:23:39

2个棘手问题请教各位达人

q1:创建存储引擎为myisam的表时,可以显式把数据文件和索引文件存放到不同路径,但表结构文件.frm却默认放在数据库目录下面。由于数据库目录下有几万个文件。平时在数据库目录下想查看文件,ls一下,根本都出不来。

q2:每张myisam存储引擎的表,数据量都有7000万左右。系统周期性扫描这些表(比如每15分钟扫描一次),并进行相关的业务处理。但如果刚好在建索引时,表就被锁定了,就无法扫描该表了。由于数据量大,建索引都需要20分钟左右,那在这20分钟左右,就无法扫描数据表,无法处理业务了。

请问各位达人,上述两个问题,有没有什么好的解决办法?谢谢。

kider 发表于 2009-4-1 14:47:42

q1:创建存储引擎为myisam的表时,可以显式把数据文件和索引文件存放到不同路径,但表结构文件.frm却默认放在数据库目录下面。由于数据库目录下有几万个文件。平时在数据库目录下想查看文件,ls一下,根本都出不来。 ...
独步古今 发表于 2009-4-1 01:23 http://www.mysqlpub.com/images/common/back.gif

“数据库目录下有几万个文件”也就是说你的一个数据库里有很多很多的表哦,这样效率不高,不仅仅OS中打开查找困难,且数据库性能也受影响,如果有可能还是根据应用分模块,创建不同的数据库存放...

还有7000万表记录已经不少了,你是怎么表扫描的?为什么要进行每15分钟的扫描呢...

独步古今 发表于 2009-4-1 23:00:17

q1: 创建多个数据库的话,那一个应用软件却同时对应多个数据库,而且各个数据库间再怎么划分肯定有些数据还是需要共享、交叉的。此时该如何解决呢,用集群?起初我想的也是创建多个数据库,但如果可以把.frm文件,像数据、索引文件那样放到不同目录,而不用创建多个数据库,那是最完美了。数据库目录下有几万个文件,是因为有些表进行了分区,所以文件较多。

q2:是这样的,假如有3张表,每张表都是7000万记录:t1,t2,t3。第一个15分钟扫描到t1的第3000万记录;第二个15分钟时,继续从t1的第3000万零一条(3千万的下一条)开始扫描;第三个15分钟时,扫描t1剩余1000万,同时再扫描t2中的2000万。以此类推,当然还有t3,t4等。这些表是按时间顺序进行创建的。
(扫描时,对每条记录都要进行相关的业务处理的。比较费时,但费时也就罢了,关键刚好正在创建索引时,就无法扫描表了。)

独步古今 发表于 2009-4-1 23:07:36

针对q2:我是考虑下面这些方法的:
1.采用innodb?innodb在创建索引时,是否可以读取表?如果可以读表那就OK了。
2.以空间换性能。保存上面说的t1,t2,t3时,同时保存专门用于扫描用的表,t1_1,t2_2,t3_3。(t1和t1_1数据完全一样)   这些专门用于扫描的表,就不用建索引了。同时,扫描的业务处理好完后,就可以把t1_1,t2_2,t3_3这些专门扫描的表删除掉以释放空间。

这只是偶的个人想法,希望各位达人多多指点,以采取最优方法,thank you...

独步古今 发表于 2009-4-1 23:13:18

对了,kider版主,我的邮箱是:veryokchy@sina.com如果你不方便留你的联系方式的话,可否给我发邮件呢?我得向你好好学习啊,谢谢。。。

yueliangdao0608 发表于 2009-4-9 11:38:01

1. 按照业务逻辑分库。你现在的问题是文件系统的瓶颈了,而不是数据库。
2. 换成INNODB引擎。

kider 发表于 2009-4-9 11:57:29

楼上说的是

扫描也可以用DR做个同步,在同步数据库上做扫描..
页: [1]
查看完整版本: 2个棘手问题请教各位达人