由于数据量较大大约有好几千万吧,我采用了分表的方式进行了数据保存,每个表的数据结构相同,假设有(table1,table2,table3)三个分表:
表结构相同如下:
id mediumint(8) unsigned not null auto_increment primary key
title varchar(255)
我现在每插入一条数据都要判断是否存在相同的标题做法如下:
//$db 数据库搜索对像
$exist1=$db->query("select count(*) from table1 where title='我是中国人'");//此方法如果存在返回true,反之false
$exist2=$db->query("select count(*) from table2 where title='我是中国人'
$exist3=$db->query("select count(*) from table3 where title='我是中国人'
if($exist1 || $exist2 || $exist3)
{
//不插入这个标题,因为已经存在
}
else
{
//把这个标题放入table3表当中,因为不存在
}但感觉上面的方法有点慢,不知道有没有一句话可以实现查询所要插入的标题是否存在,速度可以比现在的有所提高,请老师指点。
表结构相同如下:
id mediumint(8) unsigned not null auto_increment primary key
title varchar(255)
我现在每插入一条数据都要判断是否存在相同的标题做法如下:
//$db 数据库搜索对像
$exist1=$db->query("select count(*) from table1 where title='我是中国人'");//此方法如果存在返回true,反之false
$exist2=$db->query("select count(*) from table2 where title='我是中国人'
$exist3=$db->query("select count(*) from table3 where title='我是中国人'
if($exist1 || $exist2 || $exist3)
{
//不插入这个标题,因为已经存在
}
else
{
//把这个标题放入table3表当中,因为不存在
}但感觉上面的方法有点慢,不知道有没有一句话可以实现查询所要插入的标题是否存在,速度可以比现在的有所提高,请老师指点。
加大索引内存 myisam增加key_buffer_size
innodb增加innodb_buffer_pool_size
$exist1=$db->query("select 1 from table1 where title='我是中国人' union all select 1 from table2 where title='我是中国人' union all select 1 from table3 where title='我是中国人'");//此方法如果存在返回true,反之false
if($exist1)
{
//不插入这个标题,因为已经存在
}
else
{
//把这个标题放入table3表当中,因为不存在
}
//把这个标题放入table1表当中,因为不存在
ELSEIF not exists(select 1 from table2 where title='我是中国人') then
//把这个标题放入table2表当中,因为不存在
else
//把这个标题放入table3表当中,因为不存在
end if;我觉得这样才符合逻辑。不能什么都插到TABLE3里吧。
那么请问您如果一个表的数据量达到了一定数据之后(例如千万级以上),不应当分表吗?我看许多大型的cms系统都是这样设计的啊?
首先,有两个选择。一、分区,二、分表(更通俗的说法是 归档)分区:数据在数据库这个层上来说,仍是一个表。对SQL语句和程序逻辑均无影响。
归档:或者说数据仓库,把历史数据,比如销售记录中三年前的数据归档到另一个历史数据库中,因为这些数据很少被查询。所以要根据你的具体需求来确定。
如果你仍是所有记录需要查询, 显然分区表,要优于多个UNION ALL。