具有 4 个表的 MySQL QUERY;有没有办法让它更快并使用更少的资源?

标签 mysql optimization

只是一个关于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/

相关文章:

mysql - 如何使用 D2RQ 合并多个 MySQL 数据库?

c++ - 给优化器更大的 "License"

r - 最快的 R 实现

php - 值 1 存储在数据库中而不是文本框值/PHP-MySql

mysql - 如何使用 MySQL Workbench 设置 "secure_file_privilege"?

php - 来自 Mysql 结果的字符串

mysql - #1064 - 在声明附近创建触发器时出现 MySQL 错误

java - 计算非常大的 JAVA 的 Eulers Totient 函数

python - 是否可以修改 `__init__` 内的方法?

.net - 使用Linq to SQL设置SQL查询时间的好方法