0

这是一个在线照片库。我有两张桌子;“照片搜索”和“照片”。第一个,“photoSearch”,只有几列,包含照片的所有可搜索数据,例如“photoID”、“headline”、“caption”、“people”、“dateCaptured”和“keywords”。它有一个多栏全文索引(标题、标题、人物、关键字)。第二个表“照片”包含所有照片数据;高度、宽度、版权、标题、ID、日期等等。两者都有 500K+ 行,标题和标题字段有时会返回 2000+ 个字符。

这大概是查询现在的样子:(注意事项:我不能将连接与全文搜索一起使用,因此关键字存储在一列中 - 在“非规范化”表中。此外,这种伪代码作为我的应用程序代码在别处 - 但它很接近)

这个特定的查询正在循环通过并在循环内,正在执行另一个 SQL 语句......

 SELECT photoID FROM photoSearch
 WHERE MATCH (headline, caption, people, keywords)
 AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE)
 AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"';"

这是为上述查询中的每一行执行的 SQL 语句:

 SELECT photoID, setID, eventID, locationID, headline, caption, instructions, dateCaptured, dateUploaded, status, uploaderID, thumbH, thumbW, previewH, previewW, + more 
 FROM photos 
 LEFT JOIN events AS e USING (eventID) 
 LEFT JOIN location AS l USING (locationID) 
 WHERE photoID = " & photoID & ";"

测试时,在自己的表“photoSearch”上拥有全文索引而不是大表“photos”,似乎在一定程度上提高了速度。我没有添加“photoSearch”表,它已经存在 - 这不是我的应用程序。如果我尝试加入两个表以丢失第二个查询,我会一起丢失我的索引,从而导致很长时间 - 所以我不能使用全文连接。这似乎是最快的方法。如果不是因为全文和连接问题,我早就将这两个查询结合起来了。

是否可以将这两个查询合并为一个,以使流程更有效地运行,而不是为查询 1 中的每个结果执行查询 #2 1000 次?

4

1 回答 1

0

如果 Join 不起作用,请尝试子查询:

SELECT photoID, setID, eventID, locationID, headline, caption, instructions, dateCaptured, dateUploaded, status, uploaderID, thumbH, thumbW, previewH, previewW, + more 
FROM (
    SELECT photoID 
    FROM photoSearch
    WHERE
        MATCH (headline, caption, people, keywords)
            AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE)
        AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"';"
) as SelectedPhotos
LEFT JOIN photos USING (photoID)
LEFT JOIN events AS e USING (eventID) 
LEFT JOIN location AS l USING (locationID)

或尝试找出连接不起作用的原因,我应该使用:

SELECT photoID, setID, eventID, locationID, headline, caption, instructions, dateCaptured, dateUploaded, status, uploaderID, thumbH, thumbW, previewH, previewW, + more 
FROM photoSearch
LEFT JOIN photos USING (photoID)
LEFT JOIN events AS e USING (eventID) 
LEFT JOIN location AS l USING (locationID)
WHERE
    MATCH (headline, caption, people, keywords)
        AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE)
    AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"';"
于 2012-07-07T07:43:19.267 回答