【问题标题】:MYSQL optimize & questionsMYSQL优化&问题
【发布时间】:2010-10-20 07:18:30
【问题描述】:

我正在尝试优化我的 MySQL 查询,我需要一些帮助。这是我当前的查询:

SELECT *,
       (SELECT name FROM stores WHERE id = products.store_id) AS store_name,
       (SELECT username FROM stores WHERE id = products.store_id) AS store_username,
       (SELECT region_id FROM stores WHERE id = products.store_id) AS region_id,
       (SELECT city_id FROM stores WHERE id = products.store_id) AS city_id,
       (SELECT name FROM categories_sub WHERE id = products.subcategory_id) AS subcategory_name,
       (SELECT name FROM categories WHERE id = category_id) AS category_name
FROM products
WHERE date_start <= DATE(NOW()) AND date_end >= DATE(NOW())

我很确定它可以更快。

我也有一个问题,当我尝试按 region_id 选择所有产品时(通过添加“AND region_id = MYID”之类的内容)它不起作用,我想知道是否有可能让它工作,以及如何工作?

感谢您的宝贵时间!

解决方案

这是我的最后一个问题,如果它可以帮助任何人:

SELECT p.*,
       s.name AS store_name,
       cs.name AS subcategory_name,
       cat.id AS category_id, cat.name AS category_name,
       c.id AS city_id, c.name AS city_name,
       r.id AS region_id, r.name AS region_name
  FROM products p
       JOIN stores s ON (s.id = p.store_id)
       JOIN categories_sub cs ON (cs.id = p.subcategory_id)
       JOIN categories cat ON (cat.id = cs.category_id)
       JOIN cities c ON (c.id = s.city_id)
       JOIN regions r ON (r.id = c.region_id)
  WHERE DATE(NOW()) BETWEEN p.date_start AND p.date_end

谢谢!

【问题讨论】:

    标签: sql mysql optimization subquery


    【解决方案1】:

    你真的需要学会使用JOIN。它是关系查询的基本操作,就像while() 循环是大多数应用程序语言中的基本控制结构一样。

    任何有关 SQL 的书籍或教程都应涵盖JOIN

    SELECT p.*, 
     s.name AS store_name, s.username AS store_username, 
     s.region_id, s.city_id,
     cs.name AS subcategory_name,
     c.name AS category_name
    FROM products p
     JOIN stores s ON (s.id = p.store_id)
     JOIN categories c ON (c.id = p.category_id)
     JOIN categories_sub cs ON (cs.id = p.subcategory_id)
    WHERE DATE(NOW()) BETWEEN p.date_start AND p.date_end
    

    现在您可以在 WHERE 子句中添加更多条件:

      AND s.region_id = ?;
    

    还有一条评论...我试图通过使用BETWEEN 谓词来变得聪明,但这可能会混淆MySQL 相对简单的优化器。 MySQL 可能更容易优化您的原始语法:

    WHERE p.date_start <= DATE(NOW()) AND p.date_end >= DATE(NOW())
    

    【讨论】:

    • Okkkkkk 我想我明白了,我试图阅读关于 JOIN 的内容,但我认为子查询更容易,但 JOIN 和 Vijay 的答案有很大区别吗?
    • Vijay 的回答是隐式连接。他没有专门使用 join 关键字,但您的数据库将 SELECTing 从多个目标转换为连接。使用像这里演示的连接更简单。一旦您了解了有关连接的更多信息,您会发现它们比子查询更方便,子查询非常冗长,并且比连接慢得多。
    • BETWEEN 由 MySQL 的优化器处理得很好。它没有进行许多优化,但是如果可以的话,BETWEEN 应该对索引进行范围扫描,并且认为这是正确的方法。 BETWEEN 应该等同于上面的。
    • @MarkR:很公平。无论如何,使用 EXPLAIN 分析优化计划是值得的。
    【解决方案2】:
    SELECT A.*, B.name AS store_name, B.username as store_username, B.region_id as region_id, B.city_id AS city_id, C.name AS subcategory_name, D.name AS category_name FROM products A, stores B, categories_sub C, categories D
    WHERE B.id = A.store_id AND B.id = A.subcategory_id and C.id = A.category_id AND 
    A.date_start <= DATE(NOW()) AND A.date_end >= DATE(NOW())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      相关资源
      最近更新 更多