我们有一个数据库表,其中包含约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
需要提供更多信息吗?问我。
尝试使用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)
上有多列索引,可能会有所帮助。