对Join的查询的正确索引

时间:2016-03-18 18:43:16

标签: mysql

在以下查询语句中,我有两个问题。首先,这应该是内连接而不是交叉连接,还是没有性能差异。其次,指数应该如何让它变得更快?我是为每个列做一个索引,还是为所有列做多个索引,或者两者都做?

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)

1 个答案:

答案 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.statusauctions.end_time和/或{{ 1}}列。您必须平衡许多不同索引的内存开销和它们添加的搜索优势,并且索引的索引可能会减少。