GROUP BY 使查询速度极慢

时间:2021-07-09 14:15:29

标签: mysql

我正在运行以下查询,但在 10 分钟后未能显示结果。

SELECT
    t1.broker_name,
    t1.agency_name,
    t2.type,
    cmb.Centris_No,
    cmb.Price AS sell_price,
    cmb.Rent_Price AS rent_price
FROM
    brokers_global2 t1
        INNER JOIN
    brokers_to_listings t2 ON t1.broker_id = t2.broker_id
        INNER JOIN
    (SELECT * FROM all_mls_1_i UNION 
    SELECT * FROM all_mls_2_i UNION 
    SELECT * FROM all_mls_3_i UNION 
    ) cmb 
    ON 
    t2.mls_id = cmb.Centris_No
WHERE
    t1.agency_name LIKE '%String%'
        AND cmb.target_date > 20210101
        GROUP BY cmb.Centris_No
LIMIT 0 , 50000

查询工作正常,但是当我添加 GROUP BY cmb.Centris_No 时,它会停止..

根据另一个 SO 解决方案:我在 Centris_No 列上添加了一个索引,我还将 target_date 列修改为 INT 而不是 varchar 并在其上添加了另一个索引。

但结果是一样的。

还有什么我可以尝试的吗?

这是 all_mls_ tbls 的创建语句

CREATE TABLE `all_mls_1` (
  `Centris_No` varchar(25) DEFAULT NULL,
  `ST` varchar(250) DEFAULT NULL,
  `Mun_Bor` varchar(250) DEFAULT NULL,
  `Address` varchar(250) DEFAULT NULL,
  `Price` varchar(250) DEFAULT NULL,
  `Price_raw` varchar(250) DEFAULT NULL,
  `Rent_Price` varchar(250) DEFAULT NULL,
  `Rent_Price_raw` varchar(250) DEFAULT NULL,
  `CP` varchar(250) DEFAULT NULL,
  `BT` varchar(250) DEFAULT NULL,
  `PT` varchar(250) DEFAULT NULL,
  `Lot_Area_Imperial` varchar(250) DEFAULT NULL,
  `Lot_Area_metric` varchar(250) DEFAULT NULL,
  `region` varchar(250) DEFAULT NULL,
  `latitude` varchar(45) DEFAULT NULL,
  `longitude` varchar(45) DEFAULT NULL,
  `city` varchar(250) DEFAULT NULL,
  `district` varchar(250) DEFAULT NULL,
  `target_date` varchar(250) DEFAULT NULL,
  `date_added` datetime DEFAULT NULL,
  UNIQUE KEY `MLS_INDEX` (`Centris_No`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

all_mls_# 表总共有大约 100k 行

2 个答案:

答案 0 :(得分:2)

把它放在这里,因为它不适合评论。

你可以做两件小事来改善它:

  1. 使用 union all 而不是 union
  2. 在您的子查询中只选择您需要的列:
INNER JOIN
    (SELECT Centris_No,Price,Rent_Price,target_date FROM all_mls_1_i UNION ALL
    SELECT Centris_No,Price,Rent_Price,target_date FROM all_mls_2_i UNION ALL
    SELECT Centris_No,Price,Rent_Price,target_date FROM all_mls_3_i 
    ) cmb 
  1. 还要查看您的执行计划,以确定我们的瓶颈所在

答案 1 :(得分:1)

SELECT  t1.broker_name, t1.agency_name, t2.type, cmb.Centris_No,
        cmb.Price AS sell_price, cmb.Rent_Price AS rent_price
    FROM  brokers_global2 t1
    INNER JOIN  brokers_to_listings t2  ON t1.broker_id = t2.broker_id
    INNER JOIN  
    (
        SELECT  *
            FROM  all_mls_1_i
            UNION 
         SELECT  *
            FROM  all_mls_2_i
            UNION 
         SELECT  *
            FROM  all_mls_3_i
            UNION  
    ) cmb  ON t2.mls_id = cmb.Centris_No
    WHERE  t1.agency_name LIKE '%String%'
      AND  cmb.target_date > 20210101
    GROUP BY  cmb.Centris_No
    LIMIT  0 , 50000
  • 有 1 张桌子,没有多少 UNION 在一起。
  • SELECT *代替SELECT Centris_No, target_date, Rent_Price, Price
  • 对所有与日期相关的列使用 DATEDATETIMETIMESTAMP而不是 varchar(250)
  • and add onWHERE target_date > '2021-01-01'` 移到派生表中,以便获取更少的数据。
  • 没有 LIMITORDER BY 会导致随机发送行。
  • LIMIT 的 50000 似乎是一种浪费?
  • Centris_No 真的可以是 NULL 吗?我希望不是。如果不是,则将其提升为 PRIMARY KEY
  • 添加INDEX(target_date)
  • brokers_global2 需要一个以 broker_id 开头的索引。

(可能还有更多;修复这些,我会再看一遍。)

相关问题