gpt4 book ai didi

mysql - 编写更多更好的 SQL

转载 作者:行者123 更新时间:2023-11-29 03:22:23 24 4
gpt4 key购买 nike

我这里有一个非常慢的查询。部分问题可能是子查询中的表 A 与其他表相比具有相当大的大小。

表结构

*-------------------*------------------*-------------------*
| ID_TABLE | DATA_TABLE | DATA_TABLE_EXT |
*-------------------*------------------*-------------------*
| id n<|>1 id 1<|>n owner_id |
| foreign_id | owner_id | information |
| foreign_id_source | date_field | ... |
| ... | ... | |
*-------------------*------------------*-------------------*

查询

SELECT ID_TABLE.foreign_id_source, count(ID_TABLE.id) as count 
FROM DATA_TABLE
LEFT JOIN ID_TABLE ON DATA_TABLE.id = ID_TABLE.id
WHERE DATA_TABLE.owner_id = 'some_id'
AND DATA_TABLE.date_field > 'some_date'
AND DATA_TABLE.id IN (
SELECT DATA_TABLE_EXT.owner_id FROM DATA_TABLE_EXT
JOIN DATA_TABLE ON DATA_TABLE_EXT.owner_id = DATA_TABLE.id
WHERE DATA_TABLE.owner_id = 'some_id'
GROUP BY DATA_TABLE.id
HAVING SUM(ABS(DATA_TABLE_EXT.information)) <> 0
)
GROUP BY ID_TABLE.foreign_id_source
ORDER BY count ASC

要求的结果

*-------------------*-------------*
| foreign_id_source | count |
*-------------------*-------------*
| source1 | 45 |
| source2 | 10 |
| ... | |
*-------------------*-------------*

DATA_TABLE中的每个id在ID_TABLE中可能有多条记录。DATA_TABLE 中的许多记录可能具有相同的 owner_id。

我正在查找 data_table 中具有 foreign_id_source 的记录数,按该 foreign_id_source 分组,其中记录在“some_date”之后并且它的 DATA_TABLE_EXT 记录在信息字段中的值并非全部为 0。

如果不创建索引或其他数据库操作,有没有办法在性能方面改进此查询?

也欢迎任何其他建议。

最佳答案

重点是:SUM(ABS(DATA_TABLE_EXT.information)) <> 0仅当至少一个时为真 DATA_TABLE_EXT.information是非零的。所以我们不必 sum()他们,我们只需要检查是否存在非零值。

[ 我不知道 mysql 是否足够智能来处理 exists() , 但理论上它更便宜,而且可以更快]


SELECT it.foreign_id_source, count(it.id) as count 
FROM DATA_TABLE dt
LEFT JOIN ID_TABLE it ON dt.id = it.id
WHERE dt.owner_id = 'some_id'
AND dt.date_field > 'some_date'
AND EXISTS (
SELECT *
FROM DATA_TABLE_EXT x
JOIN DATA_TABLE dt2 ON x.owner_id = dt2.id
WHERE x.id =dt.id
AND dt2.owner_id = 'some_id'
AND x.information <> 0
)
GROUP BY it.foreign_id_source
ORDER BY count ASC
;

关于mysql - 编写更多更好的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41992487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com