我正在处理一个需要连接 4 个大表的查询。
表格:
Table_1 (ID, active, price1, price2, name, category1, category2) 这是包含所有产品的主表,32561 行
table_2 (ID, table_1_ID, room, stock) 这是包含table_1中产品库存的表,这个表可以有多个table_1.ID,190400行
table_3(ID,table_1_ID,图片) 此表包含有关产品的更多信息,如图片,有些产品没有,6546 行
table_4(table_1_ID, View ,类型) 此表包含产品的 View (每月 View )
我想要什么:
我正在尝试进行查询以显示 20 个查看次数最多的产品。
条件:
- 它只能显示 table_1.category1 (A,B,C,D,E) 中的产品
- 它只能显示 active='T' 的产品
- 只能显示LJ0001和MS0001房间的产品
- 它只能显示至少有 1 个库存的产品
代码:
SELECT DISTINCT(Table_1.ID), Table_1.price1, Table_1.price2
, Table_1.name, Table_1.category2, Table_3.images
FROM Table_1
LEFT JOIN Table_2 ON Table_1.ID=Table_2.table_1_ID
LEFT JOIN table_3 ON table_1.ID=table_3.table_1_ID
LEFT JOIN table_4 ON table_1.ID=table_4.table_1_ID
WHERE Table_1.active='T'
AND (Table_1.category1 LIKE 'A%'
OR Table_1.category1 LIKE 'B%'
OR Table_1.category1 LIKE 'C%'
OR Table_1.category1 LIKE 'D%'
OR Table_1.category1 LIKE 'E%'
)
AND table_2.room IN ('LJ0001','MS0001')
AND table_2.stock!=0
ORDER BY table_4.view DESC, Table_1.name
LIMIT 10 OFFSET 0
注意:
上面的代码有效。但这需要一段时间。我正在寻找可以加快速度的任何修复程序。
任何帮助都会很好! 提前致谢。
解释扩展
最佳答案
使用下面更新的查询:
EXPLAIN EXTENDED
SELECT Table_1.ID, Table_1.price1, Table_1.price2
, Table_1.name, Table_1.category2, Table_3.images
FROM Table_1
LEFT JOIN Table_2 ON Table_1.ID=Table_2.table_1_ID
LEFT JOIN table_3 ON table_1.ID=table_3.table_1_ID
LEFT JOIN table_4 ON table_1.ID=table_4.table_1_ID
WHERE Table_1.active='T'
AND (Table_1.category1 = 'A'
OR Table_1.category1 = 'B'
OR Table_1.category1 = 'C'
OR Table_1.category1 = 'D'
OR Table_1.category1 = 'E'
)
AND table_2.room IN ('LJ0001','MS0001')
AND table_2.stock != 0
ORDER BY table_4.view DESC, Table_1.name
LIMIT 10 OFFSET 0
我删除了 DISTINCT
,因为我假设 table_1.ID
是主键。如果是这样,则无需将 DISTINCT
与主键一起使用,因为它已经是不同的。我还将 LIKE
运算符更改为 =
因为它工作得更快。
然后您需要确保所有连接字段(例如table_1_ID
)都已被索引。
你可能会注意到查询顶部的 EXPLAIN EXTENDED
- 使用这个子句你将从数据库中得到类似这样的东西:
id: 1
select_type: PRIMARY
table: t1
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 4
filtered: 100.00
Extra: Using index
您将获得每个表的描述。将列出查询中使用的所有外键,包括外键是否有索引等详细信息。您将找到更多信息 here .
关于php - MySQL,我怎样才能使这个查询更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40290181/