由于数据量较大大约有好几千万吧,我采用了分表的方式进行了数据保存,每个表的数据结构相同,假设有(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表当中,因为不存在
}但感觉上面的方法有点慢,不知道有没有一句话可以实现查询所要插入的标题是否存在,速度可以比现在的有所提高,请老师指点。

解决方案 »

  1.   

    另外如果在MYSQL中则不建议分表,可以直接使用MYSQL的分区。
      

  2.   

    title上有索引吗
    加大索引内存 myisam增加key_buffer_size
    innodb增加innodb_buffer_pool_size
      

  3.   

    //$db 数据库搜索对像
    $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表当中,因为不存在
    }
      

  4.   

    title上加索引。if not exists(select 1 from table1 where title='我是中国人')  then
       //把这个标题放入table1表当中,因为不存在
    ELSEIF not exists(select 1 from table2 where title='我是中国人') then
       //把这个标题放入table2表当中,因为不存在
    else
       //把这个标题放入table3表当中,因为不存在
    end if;我觉得这样才符合逻辑。不能什么都插到TABLE3里吧。
      

  5.   


    那么请问您如果一个表的数据量达到了一定数据之后(例如千万级以上),不应当分表吗?我看许多大型的cms系统都是这样设计的啊?
      

  6.   


    首先,有两个选择。一、分区,二、分表(更通俗的说法是 归档)分区:数据在数据库这个层上来说,仍是一个表。对SQL语句和程序逻辑均无影响。
    归档:或者说数据仓库,把历史数据,比如销售记录中三年前的数据归档到另一个历史数据库中,因为这些数据很少被查询。所以要根据你的具体需求来确定。
    如果你仍是所有记录需要查询, 显然分区表,要优于多个UNION ALL。