gpt4 book ai didi

mysql - 如何像这样调整mysql中的自连接表?

转载 作者:行者123 更新时间:2023-11-29 08:31:12 25 4
gpt4 key购买 nike

我有这张表,我正在尝试从中选择并迄今为止。该查询花了 2 分钟才对 400 万条记录运行。我不确定我还能从这个查询中挤出多少东西。

    SELECT c.fk_id, c.from_date, c.fk_pb, MIN(o.from_date) AS to_date  
FROM TABLE_X c
INNER JOIN TABLE_X o ON c.fk_id = o.fk_id AND c.fk_pb = o.fk_pb
WHERE o.from_date > c.from_date
GROUP BY c.fk_id, c.from_date, c.fk_pb

已经有 from_date、fk_pb 和 fk_id 的索引。

架构是这样的。

+-----------------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------------+---------------+------+-----+---------+-------+
| FK_ID | int(11) | YES | MUL | NULL | |
| FK_PB | int(11) | YES | MUL | NULL | |
| FROM_DATE | date | YES | MUL | NULL | |
| TO_DATE | date | YES | | NULL | |
+-----------------------------+---------------+------+-----+---------+-------+

我知道我根本不应该在 MySQL 中使用自连接,但是数据是这样的,我正在尝试找到从该表中进行选择和确定日期的最佳方法。如果我还能做些什么来让这个速度更快,那就太好了。

非常感谢。

已更新

+----+-------------+-------+------+----------------------------------------------------------------------+-------------------------+---------+----------------------------------------+---------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+----------------------------------------------------------------------+-------------------------+---------+----------------------------------------+---------+----------------------------------------------+
| 1 | SIMPLE | c | ALL | IDX_FK_PB,IDX_FK_ID,IDX_FRM_DATE | NULL | NULL | NULL | 4527750 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | o | ref | IDX_FK_PB,IDX_FK_ID,IDX_FRM_DATE | IDX_FK_ID | 5 | db.c.FK_ID | 110 | Using where |
+----+-------------+-------+------+----------------------------------------------------------------------+-------------------------+---------+----------------------------------------+---------+----------------------------------------------+

最佳答案

向所有相关列添加索引可以加快速度:

INDEX(FK_ID, FK_PB,FROM_DATE)

哪个表现更好,因为:

  • MySQL 可以使用所有行的索引c,因此不需要为此返回表(添加不在索引中的列会再次减慢速度)。
  • MySQL 在 index merging 方面表现相当糟糕,因此经常选择不使用它(幸运的是),而当使用它时,它通常不是最佳的。
  • 嗯,覆盖所有搜索的索引(在本例中,join on = 搜索)比 MySQL 选择其中一个索引(限制性最强的索引,SHOW INDEX FROM tablename 可以)更快向您显示要使用的单独列上的基数),并且必须扫描其他列中的值。

关于mysql - 如何像这样调整mysql中的自连接表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16553536/

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