0

在考虑我正在开发的 Web 应用程序的最佳 mysql 数据库结构时,需要使用标签进行项目分类,我决定选择最常见的方法:在项目之间使用 tag_map 数据库表表和标签表,例如我分别有一个客户表和一个标签表:

Example of Clients table:
id,name
0,jack
1,john
2,anna

Example of Tags table:
id,tag
0,likes_oranges
1,likes_cars
2,likes_vacations

Example of tag_map
id,client_id,tag_id
0,0,0 (jack likes oranges)
1,0,1 (jack likes cars)
2,0,2 (jack likes vacations)
3,1,0 (john likes oranges)
4,1,1 (john likes cars)
5,2,1 (anna likes cars)

考虑到这种分布,假设我们的客户表可以增长到 100 万行以上,我的问题是:查询所有没有“喜欢假期”标签的客户的最佳方法是什么?

我的第一选择是使用:

select name from clients where id not in (select client_id from tag_map where tags.tag = 'likes vacations')

但是当客户端和 tag_map 表超过数千条记录时,此查询非常慢。

我也尝试将 tag_map 左连接到客户端表,但是由于所有客户端都分配了多个标签,因此使用NOT NULL也不起作用,因为我只想计算那些没有特定标签 id 的人(喜欢假期)。

请就此类要求的最佳选择声明提出建议。

提前致谢!

ķ

4

1 回答 1

0

请务必在 tag_map 表中的 client_id 和 tag_id 上添加索引。如果没有索引,您的查询会因大量行而变得非常慢。

用于explain select ...查看查询优化器如何优化查询。

于 2012-08-02T14:25:42.567 回答