我有这个分类网站,我在 MySql 中有大约 7 个表,其中存储了所有数据。 我有一个主表,称为“分类广告”。
在分类表中,有一列名为 classified_id。这不是 PK,也不是任何 key 。它只是一个数字,用于我将表记录连接在一起。
例如:
classifieds table: fordon table:
id => 33 id => 12
classified_id => 10 classified_id => 10
ad_id => 'bmw_m3_92923'
以上内容由 classified_id 列链接在一起。
现在对于 Q,我使用此方法获取所有记录,其中 ad_id 列与数组中的任何值匹配,在本例中称为 $ad_arr:
SELECT mt.*, fordon.*, boende.*, elektronik.*, business.*, hem_inredning.*, hobby.*
FROM classified mt
LEFT JOIN fordon ON fordon.classified_id = mt.classified_id
LEFT JOIN boende ON boende.classified_id = mt.classified_id
LEFT JOIN elektronik ON elektronik.classified_id = mt.classified_id
LEFT JOIN business ON business.classified_id = mt.classified_id
LEFT JOIN hem_inredning ON hem_inredning.classified_id = mt.classified_id
LEFT JOIN hobby ON hobby.classified_id = mt.classified_id
WHERE mt.ad_id IN ('$ad_arr')";
这样好还是实际上会获取不必要的信息?
查看我几天前发布的这个问题。在评论中,HLGEM 评论说这是错误的等等。您怎么看?
Another rookie question; How to implement Count() here?
谢谢
最佳答案
强烈反对marr75。首先,因为如果您在大多数查询中都使用这种糟糕的技术,那么您实际上会为每个查询添加不必要的负载。数据库查询需要编写得尽可能优化,因为以后去尝试并重写数据库中的每个查询是非常痛苦的,因为你使用了一种已知的糟糕技术。在数据库中重构是困难的,在设计中必须考虑性能,使用已知从一开始就提高性能的技术并不是过早的优化,它是好的设计。
接下来是维护问题。如果您依赖于以特定顺序排列的这些列,并且有人更改了数据的结构,那么您就不走运了。另外,如果有人添加了一个您不想向用户显示的列(这很常见),那么您就不走运了。这是一个非常糟糕的技术, select * 几乎不应该在生产系统中使用。如果有人添加了一列,它会在查询中返回,但您需要知道添加了什么以及添加的原因,以便让界面做它需要做的事情,所以使用这种糟糕的技术不会节省维护费用。
关于php - 此查询是否获取不必要的信息?我应该更改查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789021/