无法为3表内部联接(MySQL)-“客户也购买了”功能找到高效的SQL

无法为3表内部联接(MySQL)-“客户也购买了”功能找到高效的SQL,mysql,Mysql,我试图将购买“x”功能的典型客户也购买了“y”功能添加到我的网站中。以下是表格结构: Table: qb_invoice +--------------------------------+------------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default

我试图将购买“x”功能的典型客户也购买了“y”功能添加到我的网站中。以下是表格结构:

Table: qb_invoice
+--------------------------------+------------------+------+-----+-------------------+----------------+
| Field                          | Type             | Null | Key | Default           | Extra          |
+--------------------------------+------------------+------+-----+-------------------+----------------+
| qbsql_id                       | int(10) unsigned | NO   | PRI | NULL              | auto_increment |
| TxnID                          | varchar(40)      | YES  | MUL | NULL              |                |
| Customer_ListID                | varchar(40)      | YES  | MUL | NULL              |                |
| Customer_FullName              | varchar(255)     | YES  |     | NULL              |                |
+--------------------------------+------------------+------+-----+-------------------+----------------+

Table: qb_invoice_invoiceline
+-------------------------+------------------+------+-----+-------------------+----------------+
| Field                   | Type             | Null | Key | Default           | Extra          |
+-------------------------+------------------+------+-----+-------------------+----------------+
| qbsql_id                | int(10) unsigned | NO   | PRI | NULL              | auto_increment |
| Invoice_TxnID           | varchar(40)      | YES  | MUL | NULL              |                |
| Item_ListID             | varchar(40)      | YES  | MUL | NULL              |                |
| Item_FullName           | varchar(255)     | YES  |     | NULL              |                |
+-------------------------+------------------+------+-----+-------------------+----------------+

Table: qb_customer
+-------------------------------------+------------------+------+-----+-------------------+----------------+
| Field                               | Type             | Null | Key | Default           | Extra          |
+-------------------------------------+------------------+------+-----+-------------------+----------------+
| qbsql_id                            | int(10) unsigned | NO   | PRI | NULL              | auto_increment |
| ListID                              | varchar(40)      | YES  | MUL | NULL              |                |
| Name                                | varchar(41)      | YES  | MUL | NULL              |                |
+-------------------------------------+------------------+------+-----+-------------------+----------------+
给定一个Item_ListID,我希望使用一个快速、高效的查询返回Item_ListID的列表,以及订购列表中每个项目的客户数,其中所有客户都有最初提供的Item_ListID

现在,我有以下SQL可以工作,但速度非常慢:

SELECT qb_invoice_invoiceline.Item_FullName, count(*) as 'nummy'
FROM qb_invoice_invoiceline
WHERE qb_invoice_invoiceline.Invoice_TxnID = 
ANY (SELECT qb_invoice.TxnID
FROM qb_invoice 
INNER JOIN qb_customer ON qb_invoice.Customer_ListID = qb_customer.ListID
INNER JOIN qb_invoice_invoiceline ON qb_invoice.TxnID = qb_invoice_invoiceline.Invoice_TxnID
WHERE qb_invoice_invoiceline.Item_ListID = '1360000-57')
GROUP BY qb_invoice_invoiceline.Item_ListID
ORDER BY nummy DESC
我感谢你的帮助

以下是“解释”输出:

+----+--------------------+------------------------+-------+---------------------------+-------------+---------+-----------------------------------------+-------+----------------------------------------------+
| id | select_type        | table                  | type  | possible_keys             | key         | key_len | ref                                     | rows  | Extra                                        |
+----+--------------------+------------------------+-------+---------------------------+-------------+---------+-----------------------------------------+-------+----------------------------------------------+
|  1 | PRIMARY            | qb_invoice_invoiceline | index | NULL                      | Item_ListID | 123     | NULL                                    | 19690 | Using where; Using temporary; Using filesort |
|  2 | DEPENDENT SUBQUERY | qb_invoice_invoiceline | ref   | Invoice_TxnID,Item_ListID | Item_ListID | 123     | const                                   |     8 | Using where                                  |
|  2 | DEPENDENT SUBQUERY | qb_invoice             | ref   | Customer_ListID,TxnID     | TxnID       | 123     | func                                    |   206 | Using where                                  |
|  2 | DEPENDENT SUBQUERY | qb_customer            | ref   | ListID                    | ListID      | 123     | devdb.qb_invoice.Customer_ListID |    18 | Using where; Using index                     |
+----+--------------------+------------------------+-------+---------------------------+-------------+---------+-----------------------------------------+-------+----------------------------------------------+

如果要加入的varchar字段上没有可用的索引,则查询可能会很慢。你能详细说明这些表上的索引吗


我认为查询将受益于qb_invoice.TxnID和qb_customer.ListID上的索引,以及qb_invoice_invoiceline.Item_ListID上的索引。

如果您加入的varchar字段上没有可用的索引,那么查询可能会很慢。你能详细说明这些表上的索引吗


我认为查询将受益于qb_invoice.TxnID和qb_customer.ListID上的索引,以及qb_invoice_invoiceline.Item_ListID上的索引。

您可以使用“explain[query]”来分析数据库在MySQL上如何执行查询。此外,将“解释”的结果添加到问题中也很有帮助。查询中的计数使其运行缓慢。如果对查询中的联接进行计数*,则会对每个可能联接中多个表中的所有列进行计数。感谢您的评论。我尝试将COUNT函数更改为使用特定列,但它似乎对速度没有影响。我添加了“解释”输出,请参见上文。您可以使用“解释[query]”分析数据库在MySQL上如何执行查询。此外,将“解释”的结果添加到问题中也很有帮助。查询中的计数使其运行缓慢。如果对查询中的联接进行计数*,则会对每个可能联接中多个表中的所有列进行计数。感谢您的评论。我尝试将计数函数更改为使用特定列,但它似乎对速度没有影响。我添加了“解释”输出,请参见上文。您建议的所有字段都已经是索引。。。还有其他想法吗?你建议的所有字段都已经是索引了。。。还有其他想法吗?