Mysql sql如何快速查询大型自联接表

Mysql sql如何快速查询大型自联接表,mysql,sql,performance,query-optimization,self-join,Mysql,Sql,Performance,Query Optimization,Self Join,MYSQL 5.1.52-社区 我有一张250万行的大桌子: 我编写此查询是为了分析数据: 从规划需求中选择不同的a.id\u dem a.id\U dem=b.id\U dem上的内部连接规划需求b 并且b.idrh不是空的 和b.idrh'férié' 和b.idrh‘Pferié’ 内部连接规划需求a.id上的c\U dem=c.id\U dem c.idrh为空 执行需要100多秒 如何重写此请求以加快速度?(使用agregates?我应该创建临时表吗) thx删除一个连接,它是冗余

MYSQL 5.1.52-社区 我有一张250万行的大桌子:

我编写此查询是为了分析数据:

从规划需求中选择不同的a.id\u dem
a.id\U dem=b.id\U dem上的内部连接规划需求b
并且b.idrh不是空的
和b.idrh'férié'
和b.idrh‘Pferié’
内部连接规划需求a.id上的c\U dem=c.id\U dem
c.idrh为空
执行需要100多秒

如何重写此请求以加快速度?(使用agregates?我应该创建临时表吗)


thx

删除一个连接,它是冗余的。
查询使用这两个连接条件:a.id\u dem=b.id\u dema.id\u dem=c.id\u dem
所以这也必须是正确的:b.id\u dem=c.id\u dem

SELECT DISTINCT b.id_dem 
FROM planning_demandes b 
JOIN planning_demandes c ON B.id_dem = c.id_dem 
WHERE
        b.idrh IS NOT NULL 
        AND b.idrh <> 'férié' 
        AND b.idrh <> 'Pferié' 
        AND c.idrh IS NULL
选择不同的b.id\u dem
从计划到需求b
在B.id\u dem=c.id\u dem上加入规划需求
哪里
b、 idrh不为空
和b.idrh'férié'
和b.idrh‘Pferié’
c.idrh为空

能否尝试将一些连接条件移动到where子句,如。。。其中,b.idrh不为NULL,b.idrh'férié'和b.idrh'Pferié'和c.idrh为NULL,那么id_dem是什么?输出应该是什么样子?表上有哪些索引,EXPLAIN显示了什么?如果希望我们帮助优化查询,需要向我们显示表和索引定义,以及每个表的行数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化