在以下查询语句中,我有两个问题。首先,这应该是内连接而不是交叉连接,还是没有性能差异。其次,指数应该如何让它变得更快?我是为每个列做一个索引,还是为所有列做多个索引,或者两者都做?
SELECT *,
a.id AS auction_id,
ab.id AS autobid_id
FROM auctions a
CROSS JOIN autobids ab
on ab.auction_id = a.id
AND ab.bids > 0
AND ab.user_id != a.user_bid_id
WHERE a.status = 'active'
AND a.end_time BETWEEN $now AND $future
AND ab.start_price <= (a.bid_count /100)
答案 0 :(得分:0)
如果您有ON
条款,则不应使用CROSS JOIN
,这只应在您执行完整的跨产品时使用,且表之间没有任何相关条件;当有相关条件时,你应该使用内部或外部连接。此外,ON
子句应仅包含与两个表相关的条件(外连接除外,其中子表上的条件也属于ON
子句)。 MySQL实际上将CROSS JOIN
视为等同于INNER JOIN
,因此它允许您编写的内容没有错误,但标准SQL不会。在风格上,当你写CROSS JOIN
时,它应该声明你没有任何条件地加入,所以有一个ON
条款令人困惑。
至于您需要哪些索引,它实际上取决于数据的性质。但一般规则是每个表只能使用一个索引来优化连接,因此您需要复合索引才能使用它来过滤多个列。因此,对于您的查询,您可能至少需要复合索引,例如(auctions.user_bid_id, auctions.id)
和(autobids.auction_id, autobids.user_id)
,还可能需要添加auctions.status
,auctions.end_time
和/或{{ 1}}列。您必须平衡许多不同索引的内存开销和它们添加的搜索优势,并且索引的索引可能会减少。