大家好!下面的SQL语句执行时间为9s,请大家帮忙看看是否有进一步提高查询速度的地方。[CODE]
CREATE TABLE TempTable_1   
   AS SELECT   
      ITEMSET_ONE.DocID, SUM( ITEMSET_ONE.Freq+  EX_ITEMSET_ONE.Freq) Score  
   FROM  
       ITEMSET_ONE, EX_ITEMSET_ONE, CandidateDoc7
    WHERE 
         ITEMSET_ONE.Word = EX_ITEMSET_ONE.Word  
        AND CandidateDoc7.DocID =  ITEMSET_ONE.DocID  
    group by 
               ITEMSET_ONE.DocID;
[/CODE]
这个SQL语句其实是建立一个临时表,它涉及3个表,DocsFeature, CandidateDocs, ExampleDoc。总的来说,这个SQL语句是实现文本查询的,根据一个样本文档,查询一个文本集合中与之相关的其它文本。样本文本由一组特征词构成,特征词存在表 ExampleDoc 中。文本集合包含许多文本,各个文本的特征存在 DocsFeature 中。表 CandidateDocs 中存有一些 文本编号。只有DocsFeature 中那些与 ExampleDoc  至少共享一个词,并且其文本编号存在于 CandidateDocs 中的   文本 才会被 SELECT 出来。创建 DocsFeature 表的语句是[CODE]
CREATE TABLE `DocsFeature` (
  `DocID` varchar(8) COLLATE latin1_bin NOT NULL,
  `Word` varchar(20) COLLATE latin1_bin NOT NULL,
  `Freq` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `TitleWord` tinyint(1) NOT NULL,
  `CommonWord` tinyint(1) NOT NULL,
  `NrNsNtNz` char(2) COLLATE latin1_bin NOT NULL,
  KEY `idx_DocID` (`DocID`),
  KEY `idx_Word` (`Word`),
  KEY `idx_NrNsNtNz_TitleWord` (`NrNsNtNz`,`TitleWord`),
  KEY `idx_TitleWord` (`TitleWord`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin
[/CODE]
*  表 DocsFeature 的示例如下:[CODE]
....
A111    Computer   9   n (Document A111 contains 'Computer',and it occurres 9 times)
C27      Dolphin      5  n (Document C27 contains 'Dolphin',and it occurres 5 times)D21      Food       2  n (Document D21 contains 'Food',and it occurres 2 times).....
[/CODE]
*  表 CandidateDocs 只有一个 字段 field, 即 DocID。字段DocID上建有索引。* 表 ExampleDoc table 的创建语句如下: [CODE]
CREATE TABLE `ExampleDoc` (
  `Word` varchar(20) DEFAULT NULL,
  `Freq` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `TitleWord` tinyint(1) DEFAULT NULL,
  `CommonWord` tinyint(1) DEFAULT NULL,
  `NrNsNtNz` char(2) DEFAULT NULL,
  KEY `idx_Word` (`Word`),
  KEY `idx_NrNsNtNz` (`NrNsNtNz`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
[/CODE]
在 CandidateDocs 中大约有 3万多条记录; ExampleDoc 中有约90条记录; DocsFeature中有约7百7十万条记录。
这条SQL语句耗时约9秒,请大家看看这是否合理,是否还有改进的余地。谢谢!

解决方案 »

  1.   

    我无法编辑自己的帖子,只好以回复的形式重发一次。
    ==========
    大家好!下面的SQL语句执行时间为9s,请大家帮忙看看是否有进一步提高查询速度的地方。CREATE TABLE TempTable_1   
       AS SELECT   
          ITEMSET_ONE.DocID, SUM( ITEMSET_ONE.Freq+  EX_ITEMSET_ONE.Freq) Score  
       FROM  
           ITEMSET_ONE, EX_ITEMSET_ONE, CandidateDoc7
        WHERE 
             ITEMSET_ONE.Word = EX_ITEMSET_ONE.Word  
            AND CandidateDoc7.DocID =  ITEMSET_ONE.DocID  
        group by 
                   ITEMSET_ONE.DocID;这个SQL语句其实是建立一个临时表,它涉及3个表,DocsFeature, CandidateDocs, ExampleDoc。总的来说,这个SQL语句是实现文本查询的,根据一个样本文档,查询一个文本集合中与之相关的其它文本。样本文本由一组特征词构成,特征词存在表 ExampleDoc 中。文本集合包含许多文本,各个文本的特征存在 DocsFeature 中。表 CandidateDocs 中存有一些 文本编号。只有DocsFeature 中那些与 ExampleDoc  至少共享一个词,并且其文本编号存在于 CandidateDocs 中的   文本 才会被 SELECT 出来。创建 DocsFeature 表的语句是[code]
    CREATE TABLE `DocsFeature` (
      `DocID` varchar(8) COLLATE latin1_bin NOT NULL,
      `Word` varchar(20) COLLATE latin1_bin NOT NULL,
      `Freq` tinyint(3) unsigned NOT NULL DEFAULT '0',
      `TitleWord` tinyint(1) NOT NULL,
      `CommonWord` tinyint(1) NOT NULL,
      `NrNsNtNz` char(2) COLLATE latin1_bin NOT NULL,
      KEY `idx_DocID` (`DocID`),
      KEY `idx_Word` (`Word`),
      KEY `idx_NrNsNtNz_TitleWord` (`NrNsNtNz`,`TitleWord`),
      KEY `idx_TitleWord` (`TitleWord`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin
    [/code]*  表 DocsFeature 的示例如下:[code]
    ....
    A111    Computer   9   n (Document A111 contains 'Computer',and it occurres 9 times)
    C27      Dolphin      5  n (Document C27 contains 'Dolphin',and it occurres 5 times)D21      Food       2  n (Document D21 contains 'Food',and it occurres 2 times).....
    [/code]
    *  表 CandidateDocs 只有一个 字段 field, 即 DocID。字段DocID上建有索引。* 表 ExampleDoc table 的创建语句如下:[code]
    CREATE TABLE `ExampleDoc` (
      `Word` varchar(20) DEFAULT NULL,
      `Freq` tinyint(3) unsigned NOT NULL DEFAULT '0',
      `TitleWord` tinyint(1) DEFAULT NULL,
      `CommonWord` tinyint(1) DEFAULT NULL,
      `NrNsNtNz` char(2) DEFAULT NULL,
      KEY `idx_Word` (`Word`),
      KEY `idx_NrNsNtNz` (`NrNsNtNz`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 
    [/code]
    在 CandidateDocs 中大约有 3万多条记录; ExampleDoc 中有约90条记录; DocsFeature中有约7百7十万条记录。
    这条SQL语句耗时约9秒,请大家看看这是否合理,是否还有改进的余地。谢谢!
      

  2.   

    大家好!下面的SQL语句执行时间为9s,请大家帮忙看看是否有进一步提高查询速度的地方。
    CREATE TABLE TempTable_1   
       AS SELECT   
          ITEMSET_ONE.DocID, SUM( ITEMSET_ONE.Freq+  EX_ITEMSET_ONE.Freq) Score  
       FROM  
           ITEMSET_ONE, EX_ITEMSET_ONE, CandidateDoc7
        WHERE 
             ITEMSET_ONE.Word = EX_ITEMSET_ONE.Word  
            AND CandidateDoc7.DocID =  ITEMSET_ONE.DocID  
        group by 
                   ITEMSET_ONE.DocID;
    这个SQL语句其实是建立一个临时表,它涉及3个表,DocsFeature, CandidateDocs, ExampleDoc。总的来说,这个SQL语句是实现文本查询的,根据一个样本文档,查询一个文本集合中与之相关的其它文本。样本文本由一组特征词构成,特征词存在表 ExampleDoc 中。文本集合包含许多文本,各个文本的特征存在 DocsFeature 中。表 CandidateDocs 中存有一些 文本编号。只有DocsFeature 中那些与 ExampleDoc  至少共享一个词,并且其文本编号存在于 CandidateDocs 中的   文本 才会被 SELECT 出来。创建 DocsFeature 表的语句是
    CREATE TABLE `DocsFeature` (
      `DocID` varchar(8) COLLATE latin1_bin NOT NULL,
      `Word` varchar(20) COLLATE latin1_bin NOT NULL,
      `Freq` tinyint(3) unsigned NOT NULL DEFAULT '0',
      `TitleWord` tinyint(1) NOT NULL,
      `CommonWord` tinyint(1) NOT NULL,
      `NrNsNtNz` char(2) COLLATE latin1_bin NOT NULL,
      KEY `idx_DocID` (`DocID`),
      KEY `idx_Word` (`Word`),
      KEY `idx_NrNsNtNz_TitleWord` (`NrNsNtNz`,`TitleWord`),
      KEY `idx_TitleWord` (`TitleWord`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin*  表 DocsFeature 的示例如下:
    ....
    A111    Computer   9   n (Document A111 contains 'Computer',and it occurres 9 times)
    C27      Dolphin      5  n (Document C27 contains 'Dolphin',and it occurres 5 times)D21      Food       2  n (Document D21 contains 'Food',and it occurres 2 times).....
    *  表 CandidateDocs 只有一个 字段 field, 即 DocID。字段DocID上建有索引。* 表 ExampleDoc table 的创建语句如下:
    CREATE TABLE `ExampleDoc` (
      `Word` varchar(20) DEFAULT NULL,
      `Freq` tinyint(3) unsigned NOT NULL DEFAULT '0',
      `TitleWord` tinyint(1) DEFAULT NULL,
      `CommonWord` tinyint(1) DEFAULT NULL,
      `NrNsNtNz` char(2) DEFAULT NULL,
      KEY `idx_Word` (`Word`),
      KEY `idx_NrNsNtNz` (`NrNsNtNz`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 
    在 CandidateDocs 中大约有 3万多条记录; ExampleDoc 中有约90条记录; DocsFeature中有约7百7十万条记录。
    这条SQL语句耗时约9秒,请大家看看这是否合理,是否还有改进的余地。谢谢!