在同一表上不存在MySQL SELECT

问题描述 投票:0回答:1

我们有一个数据库表,其中包含约6亿行组织记录。一个组织可能在记录表中有多行,在其中记录了组织的关键状态更改。

我们目前有一个SQL查询在循环中运行,因为它需要花费很长时间才能运行,并且我们需要将信息更新到缓存中。

我正在这里寻求帮助,以寻求可能会提高查询效率的任何建议。我们最关心的是查询每天写入SSD的50 TB以上,而我们接下来要关心的是查询运行需要多长时间。如果我们的问题之一能够得到解决,我将非常高兴。

这是查询:

SELECT DISTINCT organisation_id 
FROM records AS a 
WHERE a.status != 'private' 
AND NOT EXISTS (
    SELECT 1 
    FROM records 
    WHERE status = 'insolvent' AND a.organisation_id = organisation_id);

状态列为ENUM。Organisation_id列为INT还有其他专栏,但我认为它与此SQL查询无关。

这是MySQL配置:

tmp_table_size = 8589934590
max_heap_table_size = 8589934590
temptable_max_ram = 8589934590
innodb_flush_log_at_trx_commit = 1
innodb_stats_on_metadata = OFF
innodb_buffer_pool_size = 268435456
innodb_buffer_pool_chunk_size = 268435456
innodb_buffer_pool_instances = 1
innodb_log_file_size = 50331648
innodb_log_buffer_size = 16777216
innodb_page_size = 16384
innodb_file_per_table = ON
innodb_flush_method = O_DIRECT
innodb_thread_concurrency = 0
innodb_read_io_threads = 4
innodb_write_io_threads = 4

需要提供更多信息吗?问我。

mysql bigdata
1个回答
1
投票

尝试使用LEFT JOIN/NULL模式代替NOT EXISTS

SELECT DISTINCT a.organisation_id
FROM records AS a
LEFT JOIN records AS b ON a.organisation_id = b.organisation_id AND b.status = 'insolvent'
WHERE a.status != private AND b.organisation_id IS NULL

此外,如果(organisation_id, status)上有多列索引,可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.