服务器为普通PC机,双核,4G,装的mysql4.1,数据库大小已经到了21GB,平均每张表中的记录都超过了一百万条,select语句速度非常快,但是count语句查下来需要4秒多,开始的想法是在分页时先select,将结果返回到页面展示给用户后再自动激活javascript代码调用统计的java代码,在五秒内将统计结果刷新在页面上,各位老大有什么更好的办法请指点一下。
一直搞不懂为什么有人喜欢用旧的东西,稳定吗?mysql5也有稳定版本啊,sco unix好?怎么我就觉得OpenSolaris好呢?tomcat也要用5.5的,struts用1.x的。你们用你们的,我用我的,装上 Ubuntu,OpenSolaris,eclipse3.4,tomcat6,mysql6 alpha。
为了证明新的比旧的要好,加上同事每次导数据都是手动操作,cat出来再cat进去,看着我都紧张。加上Python已经上手了,决定写个批处理自动迁移数据。
先下载mysql针对python的驱动,build,install,完成后就可以继续了。
由于数据量很大,我分给linux的分区总共只有20G,所以只好将mysql6安装到了windows分区中,这样的话每次开机都要挂载该分区才能启动mysql,而且由于不是linux专有分区,所以读写速度比安装linux分区中要慢。
为了不破坏数据,新建的数据库表中id不设为auto_increment,等所有数据成功导入后再alter。
以下是示例:
以上由于javaeye不能在firefox中粘贴,所以就以代码形式弄上去了。
以下数据库连接部分需要注意字符設置
#-*- coding: utf-8 -*-,
#coding = utf-8
from MySQLdb import *
def conn(a,b):
conn_local = Connection('127.0.0.1','mysql','','test')
conn_server = Connection('192.168.1.99','root','123456','indiglib')
cur_server=conn_server.cursor()
cur_local = conn_local.cursor()
for i in range(a,b):
cur_server.execute("select * from i_biblios where id='"+str(i)+"'")
row=cur_server.fetchone()
if row ==None:
continue
for j in (0,3):
if row[j]=='NULL':
row[j]=''
cur_local.execute("insert into i_biblios(id,rectype,datatype,format,mdata,userid) values('"+str(row[0])+"','"+str(row[1])+"','"+str(row[2])+"','"+str(row[3])+"','"+str(row[4])+"','admin')")
print "the record NO. is %d" % (i, )
conn_server.commit()
conn_local.commit()
cur_server.close()
cur_local.close()
conn_server.close()
conn_local.close()
if __name__=='__main__':
conn(9,20)
使用时可直接修改conn(9,20)中的值,也可以像下面代码中那样调用模块:
import datetime
import connect
def getTime():
pre = datetime.datetime.now()
connect.conn(700000,800000)
now = datetime.datetime.now()
print now-pre
if __name__=='__main__':
getTime()
以上只是例子,实际使用时有部分改变。
我为什么要一条一条地查而不是一次全弄出来呢?因为在这个基础上,后面还需要要用到统计输出某些id信息。
弄完后再用count语句,速度快了不少,现在只需要3秒2就可以出来了,而且还是运行在windows挂载分区中,如果给我的机器换成服务器的配置,再给加点空间,速度肯定会更快的。