需要一些查询帮助。 在数据库中有大约700k的图像,每个图像都有自己的标签。 我希望能够通过带有全文搜索查询的标签搜索图像。 查询完全符合我的要求,但速度非常慢。 有些人可以帮助我加快速度,或创建另一个。 de'image_tag'表中的id-fields和name字段都有索引。
SELECT
image.*
FROM image
INNER JOIN (SELECT image_to_tag.image_id,
GROUP_CONCAT(image_tag.`name`) AS tags
FROM image_to_tag
INNER JOIN image_tag
ON (image_tag.id = image_to_tag.image_tag_id)
GROUP BY image_to_tag.image_id) t ON t.image_id = image.id
WHERE MATCH (t.tags) AGAINST ('+justin* +backgrounds*' IN BOOLEAN MODE)
表:图像
id | filename
1 | image1.jpg
2 | image2.jpg
3 | image3.jpg
表:image_to_tag
image_id | image_tag_id
1 | 1
1 | 2
2 | 3
2 | 4
表:image_tag
id | name
1 | justin bieber
2 | backgrounds
3 | justin timberlake
4 | other backgrounds
如果我搜索“justin background”,我想找到图像1和2。 如果我搜索“贾斯汀·比伯背景”,我想找到图像1。
答案 0 :(得分:0)
请尝试这个,让我知道这可能会更快一点。
select id,filename from image
where id in(
select image_id from image_to_tag a
inner join image_tag b
on b.id = a.image_tag_id and b.name like '%justin%'
)
答案 1 :(得分:0)
您可以通过将查询分为三个部分来提升性能。它将以毫秒为单位给出结果:
$tagids = '';
$res = $mysqli->query("SELECT group_concat(id) as tagids FROM image_tag WHERE MATCH (name) AGAINST ('+justin* +backgrounds*' IN BOOLEAN MODE");
if($row = $res->fetch_object()){
$tagids = $row->tagids;
}
$res->close();
$imageids = '';
$res = $mysqli->query("SELECT group_concat(image_id) as imageids FROM image_to_tag WHERE image_tag_id in($tagids)");
if($row = $res->fetch_object()){
$imageids = $row->imageids;
}
$res->close();
$imgarr = array();
$res = $mysqli->query("SELECT id,filename FROM image WHERE id in($imageids)");
if($row = $res->fetch_object()){
array_push($imgarr,$row);
}
$res->close();
echo json_encode($imgarr);