0

我正在尝试查询我的数据库以获取我的所有产品,当我这样做时,它会使服务器崩溃,我无法获取信息

SELECT categories.category_id, 
       categories.category_name, 
       categories.category_name_fr, 
       subcategories.subcategory_id, 
       subcategories.subcategory_name, 
       subcategories.subcategory_name_fr, 
       suppliers.supplier_id, 
       suppliers.supplier_name, 
       products.product_id, 
       products.product_name, 
       products.product_name_fr, 
       products.product_url 
FROM   categories, 
       subcategories, 
       suppliers, 
       products 
WHERE  products.product_active = 1 
ORDER  BY categories.category_id ASC 

我试着放一个 LIMIT 0, 1 但它仍然崩溃了......

4

1 回答 1

2

首先,您应该明确指定您的连接和连接条件,因为现在您正在获得所有表的笛卡尔积,这可能不是您想要的。

您应该首先在连接表中列出产品表,因为这是您的WHERE子句过滤生效的表。所以像:

SELECT categories.category_id, categories.category_name, 
    categories.category_name_fr, subcategories.subcategory_id,
    subcategories.subcategory_name, subcategories.subcategory_name_fr,
    suppliers.supplier_id, suppliers.supplier_name, products.product_id,
    products.product_name, products.product_name_fr, products.product_url
FROM products
INNER JOIN categories ON products.[some field] = categories.[some field]
INNER JOIN subcategories ON categories.[some field] = subcategories.[some field]
INNER JOIN suppliers ON products.[some field] = suppliers.[some field]
WHERE products.product_active = 1
ORDER BY categories.category_id ASC

其次,您需要确保每个列以及连接条件中使用的任何其他列都有一个products.product_active索引categories.category_id

第三,作为仅供参考,LIMIT条件对此处的查询执行时间没有任何帮助,因为在决定将结果集限制为项目的子集之前,您仍然需要执行连接、过滤和排序。唯一有帮助的地方是通过结果集进行处理(这显然会发生得更快)。

于 2013-03-05T22:59:42.830 回答