首页 > 解决方案 > 优化50W-100W表中的SQL查询

问题描述

我得到这个查询:

SELECT
count( * ) AS AGGREGATE 
FROM
`report_ifind`
INNER JOIN `report_descriptions` ON `report_ifind`.`seq` = 
`report_descriptions`.`report_seq` 
AND `description` IS NOT NULL 
WHERE
EXISTS (
SELECT
1 
FROM
`report_types` 
WHERE
report_ifind.seq = report_types.report_seq 
AND `type_code` NOT IN ( '002', '001001', '001002', '001003', '099001002', 
'009001001', '003001', '003002', '003003', '004002' ) 
) 
AND `isvalid` = 1 
AND `report_ifind`.`publish_time` >= '2017-06-24'

本次查询一共有三个表:</p>

report_ifind
report_descriptions
report_types

这些表的索引:

**report_ifind**:
PRIMARY KEY (`id`),
UNIQUE KEY `idx_seq` (`seq`),
KEY `idx_research_id` (`researcher_id`),
KEY `idx_org_id` (`org_id`),
KEY `idx_publish_time` (`publish_time`) USING BTREE,
KEY `idx_sql_publish_time` (`publish_time`,`seq`) USING BTREE

**report_descriptions**:
PRIMARY KEY (`id`),
KEY `idx_report_seq` (`report_seq`)

**report_types**:
PRIMARY KEY (`id`),
KEY `idx_report_seq` (`report_seq`),
KEY `idx_type_code` (`type_code`)

我知道有些事情很糟糕:

一、“desctiption is not null”慢

2、“WHERE EXIST()”慢

3、“SELECT COUNT(*)”速度慢

问题是:如何改进它?

解释输出: 解释

标签: mysql

解决方案


3、“SELECT COUNT(*)”速度慢

尝试只计算id列 ( COUNT(report_ifind.id)) 而不是计算表中的所有列。


推荐阅读