大富翁离线数据库的格式转换与优化(access to mysql).(100分)

  • 主题发起人 主题发起人 lecon
  • 开始时间 开始时间
L

lecon

Unregistered / Unconfirmed
GUEST, unregistred user!
相信很多大富翁都装了MySQL吧?反正我就是其中一个。
MySQL性能不错且支持全文搜索,用来做大富翁离线数据库真是太棒了!可是目前好像尚未有MySQL版本的离线数据库
Down.只好自己DIY一个。我的离线数据库是基于CAKK的全套完整数据库(ACCESS版本,不包含第九集数据),在
http://202.96.70.228/cakk/delphi/delphi.htm有DOWN.
在转换之前先进行一些优化,我有D版的ACCESS2000,打开原数据库的时候就提示要转换格式,转换就转换吧.我在电
脑前面坐了差不多十分钟才搞定.现在给数据库缩缩水.很早之前yysun就提出来要给离线数据库缩水
(http://www.delphibbs.com/delphibbs/dispq.asp?lid=482594),方法不少.不过我用了一个比较宽松的缩水方案
:
DELETE *
FROM letters
WHERE (((letters.Content)="?" Or (lettsers.Content)="关注此题" Or (letters.Content)=">>" Or
(letters.Content)="" Or (letters.Content) Like "%接受答案了%"));
差不多可以缩掉三万条记录!不过rooms表中的LetterNum还没有同步,所以还得改.
于是又在Access2000中做了一个查询:
SELECT letters.RoomID, Count(*) AS numbers
FROM letters
GROUP BY letters.RoomID;
这个查询可以把每个讨论区中的问题数统计出来,除了"Linux图形/图象讨论区"(我也不知道为什么它不统计?这个就自
己改吧.)把这个查询保存为counts吧,后面还有用.
将Rooms表重命名为Rooms1,然后又建个查询
SELECT Rooms1.ID AS ID, Rooms1.ROOM AS ROOM, counts.numbers AS LetterNum, Rooms1.NewLetter AS
NewLetter, Rooms1.Master AS Master, Rooms1.Master2 AS Master2, Rooms1.Group AS [GROUP] INTO Rooms
FROM counts, Rooms1
WHERE (((counts.RoomID)=[Rooms1].[ID]));
运行这个查询后就会新生成另外一个Rooms表.
因为大部分的离线浏览器是不用letters表中的HTML_DateTime,NeedEMail,IPAddr,msrepl_synctran_ts字段的,所
以我把它们给删了.希望离线浏览器开发者们用字段名而不是字段索引来访问数据库.
缩完水,就要开始倒数据到MySQL中了。我试过一些专用的工具access2mysql和MyAccess都不能正确的导出数据到
MySQL,所以还得手工.
先在mysql中建一个名为delphibbs的数据库:
mysql> create database delphibbs;
然后在delphibbs中建三个表:
letters表:
CREATE TABLE `delphibbs`.`letters` (
`ID` int(11) NOT NULL default '0',
`RegDateTime` datetime NOT NULL default '0000-00-00 00:00:00',
`DateTime` datetime NOT NULL default '0000-00-00 00:00:00',
`UserFrom` varchar(20) NOT NULL default '',
`Subject` varchar(200) NOT NULL default '',
`RoomID` tinyint(4) NOT NULL default '0',
`Content` text NOT NULL,
`Expert` text NOT NULL,
`Points` int(11) NOT NULL default '0',
`Parent` int(11) NOT NULL default '0',
`Status` tinyint(4) NOT NULL default '0',
`GetTimes` int(11) NOT NULL default '0',
`ReplyTimes` int(11) NOT NULL default '0',
PRIMARY KEY (`ID`) TYPE=MyISAM;

rooms表:
CREATE TABLE `delphibbs`.`rooms` (
`ID` int(11) NOT NULL default '0',
`ROOM` varchar(50) NOT NULL default '',
`LetterNum` int(11) default NULL,
`NewLetter` int(11) default NULL,
`Master` varchar(20) default NULL,
`Master2` varchar(20) default NULL,
`GROUP` varchar(50) default NULL,
PRIMARY KEY (`ID`)
) TYPE=MyISAM;

users表:
CREATE TABLE `delphibbs`.`users` (
`ID` int(11) NOT NULL default '0',
`UserName` varchar(20) NOT NULL default '',
`Passwd` varchar(10) NOT NULL default '',
`EMail` varchar(100) default NULL,
`Profile` text,
`Points` int(11) default NULL,
`RegDate` datetime default NULL,
`State` int(11) default NULL,
`IPAddr` varchar(15) default NULL,
`DateTime` datetime default NULL,
`GetTimes` int(11) default NULL,
`locked` tinyint(4) NOT NULL default '0',
`Expoints` int(11) default NULL,
`Earnings` int(11) default NULL,
PRIMARY KEY (`ID`)
) TYPE=MyISAM;

Access和MySQL都有数据导入导出的功能,但是都不支持XML格式,看来这方面它们已经落后了。看来我只有采用了
csv格式作为中间格式了。这是一种文本文件,它的字段值用逗号分隔,字符串用双引号,每行是一条记录。很多软件
包括Excel,Word,MySQL在内都支持这种格式的数据。
现在开始转换letters表,在Access中用右键点击letters表,出现快捷菜单,选择“导出”,出现一个对话框用于指
定导出文件的文件名和格式,我选择的是文本文件,文件名为F:/letters.txt,单击保存按钮,又出现一个导出文本
向导。按“下一步”,选择制表符作为字段分隔符,为什么不选择逗号呢?因为我试过不行!expert字段中有许多逗
号会影响倒入到MySQL中的结果。然后又按“下一步”。然后静坐10分钟..呼..呼....嘿!别睡啦,还有很多事情要
做呢。

激动人心的时刻到了---
让我们加载数据到delphibbs数据库的letters表中,在mysql控制台中打入以下指令:
mysql> LOAD DATA INFILE "F:/letters.txt" INTO TABLE letters FIELDS TERMINATED BY '/t' ENCLOSED BY
'"';
Query OK, 371785 rows affected (1 min 38.87 sec)
Records: 371785 Deleted: 0 Skipped: 0 Warnings: 343279
加了371785条记录到letters表中,只用了1分38.87秒,看来MySQL的胃口还是蛮大的,一口气就吞了95M.
接下来做索引:
将ID作为主键,并对RegDateTime,DateTime,RoomID,Parent字段作索引.
索引可以大大加快离线数据库的速度,一定要做。我这个方案只是个例子,还有更好的组合。

对标题和内容做全文检索:
mysql> create fulltext index title_content on letters(subject,content);
Query OK, 371785 rows affected (1 hour 30 min 24.52 sec)
Records: 371785 Duplicates: 0 Warnings: 0
作这个可需要耐心啊,一共用了1小时30分24.52秒!!不过这是值得的。

测试一下全文检索的效果,找找yysun在哪里?
mysql> SELECT * FROM `letters` where match(subject,content) against('yysun') LIMIT 0, 30
-----------------------------------------------
-----------------------------------------------
..........................
..........................
(中间略)
..........................
..........................
-----------------------------------------------
30 rows in set (0.01 sec)
哇噻0.01秒!!不可思议!
但是,我找不到"歪歪孙",看来MySQL的全文检索对中文支持不好.:-(
其它两个表的导入基本上没有问题,留给大家做做练习吧。

至此MySQL版的大富翁离线数据库制作全部完成,所有的数据库文件只有118.7 MB,苗条了不少,不做全文检索时只有90
多兆。
唉,累死我了。喔,忘了说一件事情,最近我也在做一个大富翁离线浏览器,其实有很多离线浏览器已经做得很好了
,我现在用的是左轻侯写的。
我做的这个离线浏览器只是在创意方面比较新,所有的界面都在网页中,所有看起来与大富翁网站有几分似,同时还
实现了分页显示,速度还过得去吧,其它的功能,比如查找,贴子的更新与导入都没有做,现在只有个原型,还有很
多地方需要琢磨一下。不过近期应该都可以做好,不知道大家想不想看看,不想看的话我就留着自己用好了。:=)
 
其实何苦呢?
导入到SQL server不是更简单吗?
 
就是啊,Access和SQL Server由于是本家的东西,有不少地方很相近的,它们之间的转换更容易呀
 
DFW查询慢,主要是结构有问题。而不是依靠什么类型的数据库来提高速度。
很多人只是拿他来练手。真要象你说的那样,那倒不如用楼上兄弟的方法还更快呢。
 
非常感谢 lecon 给了和我们分享宝贵的经验,给了这么详细的过程介绍。
 
>>看来MySQL的全文检索对中文支持不好
就凭这点我可以说他不适合作离线数据库
 
感谢lecon
你的离线阅读器能发一个我看看吗:day16@21cn.com
 
我都是用CHM的,还没发现哪个有比CHM更快的,,,,
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部