我正在运行以下查询,但在 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 行
答案 0 :(得分:2)
把它放在这里,因为它不适合评论。
你可以做两件小事来改善它:
union all
而不是 unionINNER 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)
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
SELECT *
代替SELECT Centris_No, target_date, Rent_Price, Price
DATE
或 DATETIME
或 TIMESTAMP
,而不是 varchar(250)
。and add on
WHERE target_date > '2021-01-01'` 移到派生表中,以便获取更少的数据。LIMIT
的 ORDER BY
会导致随机发送行。LIMIT
的 50000 似乎是一种浪费?Centris_No
真的可以是 NULL
吗?我希望不是。如果不是,则将其提升为 PRIMARY KEY
。INDEX(target_date)
brokers_global2
需要一个以 broker_id
开头的索引。(可能还有更多;修复这些,我会再看一遍。)