只是一个关于MySQL的问题,为了加快查询速度。
我有 4 个表:
- PROD_sell (744 rows):
PROD_SELL_id | USER_id | PROD_sell_crediti | PROD_SELL_datepay |
- PROD_newsletter (7300 rows)
USER_id | NEWSL_ref_area | NEWSL_ref_subprod | USER_realcf_area | USER_realcf_page_num |
- PROD_archivio (197 rows)
PROD_ARCH_id | PROD_ARCH_hidden | PROD_CAT_id |
- PROD_cat (3 rows)
PROD_CAT_id | PROD_CAT_title |
这是我的查询(通过 php):
SELECT COUNT(DISTINCT s.PROD_SELL_id) AS count,
c.PROD_CAT_title
FROM PROD_sell AS s, PROD_newsletter AS n, PROD_archivio AS a, PROD_cat AS c
WHERE
s.USER_id = n.USER_id
AND
((n.NEWSL_ref_area = 2 AND n.NEWSL_ref_subprod = a.PROD_ARCH_id)
OR
(n.USER_realcf_area = 'archivio' AND n.USER_realcf_page_num = a.PROD_ARCH_id))
AND a.PROD_ARCH_hidden = '0'
AND a.PROD_CAT_id = c.PROD_CAT_id
AND s.PROD_sell_crediti = '0' AND s.PROD_SELL_datepay >= '$data_inizio_where' AND s.PROD_SELL_datepay <= '$data_fine_where'
GROUP BY a.PROD_CAT_id ASC
ORDER BY count DESC
结果是(例如):
CAT 1: 30 sales
CAT 2: 23 sales
CAT 3: 31 sales
and so on...
我知道它看起来很糟糕,但它确实有效,但我需要一种更快的方法来进行相同的查询,因为它会占用大量资源并且网站会宕机。
如您所料,最糟糕的部分是:
AND
((n.NEWSL_ref_area = 2 AND n.NEWSL_ref_subprod = a.PROD_ARCH_id)
OR
(n.USER_realcf_area = 'archivio' AND n.USER_realcf_page_num = a.PROD_ARCH_id))
有没有办法让它更快?你将如何编写整个查询? 我不太擅长 SQL 优化:-)
谢谢
最佳答案
OR
条件不能使用索引,因此它会减慢查询速度。解决方法是将您的查询拆分为两个查询,除了它们各自具有与或
。然后使用 UNION
组合它们。
当然,请确保您在所有相关列上都有索引。
关于具有 4 个表的 MySQL QUERY;有没有办法让它更快并使用更少的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29299339/