我正在处理一组名称和地址文件,并有一组名称地址等的表格。特别是当我在名字中读取姓氏,名字,中间名等都进入一个名为'的简单表名字'我只有大约2000个条目。
CREATE TABLE name (
nameid int unsigned NOT NULL auto_increment PRIMARY KEY,
name varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
然后我创建一个'全名'作为一组'名称'ID
CREATE TABLE fname (
fnameid int unsigned NOT NULL auto_increment PRIMARY KEY,
lastid int unsigned,
firstid int unsigned,
name2id int unsigned,
name3id int unsigned,
name4id int unsigned,
name5id int unsigned,
name6id int unsigned
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我正在使用MyISAM,因为我需要将数据分开而不是集中到ibdata1。
这是数据库A.我的查询是这样的......
select ln.name last, fn.name first, ...
from lived l
inner join person p on p.personid = l.personid
inner join fname f on f.fnameid = p.fnameid
inner join name ln on ln.nameid = f.lastid
left outer join name fn on fn.nameid = f.firstid
...
where ln.name like 'washington';
并且大约需要0.2秒。姓氏加入是重要的一点。
我需要将姓氏与其他任何名字分开,然后我将所有姓氏读入新表“last”,所有其他人仍然会进入'name'。
CREATE TABLE last (
lastid int unsigned NOT NULL auto_increment PRIMARY KEY,
name varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我已将此读入新数据库B并执行新查询,其中唯一的区别是使用'last'作为姓氏(以大写字母突出显示)。
select ln.name last, fn.name first, ...
from lived l
inner join person p on p.personid = l.personid
inner join fname f on f.fnameid = p.fnameid
inner join LAST ln on ln.LASTID = f.lastid
left outer join name fn on fn.nameid = f.firstid
...
where ln.name like 'washington';
现在查询大约需要12秒。
如果我现在在数据库A中创建一个'last'表(按照B)并将'name'中的所有数据复制到其中,从而保留id并使用上面的第二个查询,以便现在的姓氏来自new对于A,查询时间仍为约0.2秒。所有表的创建完全相同,我只更改USE DATABASE A或B
我使用完全相同的数据并验证我使用的每个其他表在A和B中是相同的。
我无法解释为什么数据库B如此缓慢,因为这是我需要迁移到的。