【问题标题】:Optimal explain plan最佳解释计划
【发布时间】:2021-09-27 13:13:22
【问题描述】:

理论上,其中哪一个会更快地返回结果?我必须处理表中近十亿行,并提出删除不少行的计划。我需要确保提供最快的解决方案。

+----+-------------+------------------+------+---------------+------+---------+------+-----------+---------------------------------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref  | rows      | Extra                           |
+----+-------------+------------------+------+---------------+------+---------+------+-----------+---------------------------------+
|  1 | PRIMARY     | tableA    | ALL  | NULL          | NULL | NULL    | NULL | 505432976 | Using where                     |
|  2 | SUBQUERY    | tableA    | ALL  | NULL          | NULL | NULL    | NULL | 505432976 | Using temporary; Using filesort |
+----+-------------+------------------+------+---------------+------+---------+------+-----------+---------------------------------+
2 rows in set (0.00 sec)

+----+-------------+------------------+--------+---------------------------------------------+---------+---------+-----------+-----------+---------------------------------+
| id | select_type | table            | type   | possible_keys                               | key     | key_len | ref       | rows      | Extra                           |
+----+-------------+------------------+--------+---------------------------------------------+---------+---------+-----------+-----------+---------------------------------+
|  1 | PRIMARY     | <derived2>       | ALL    | NULL                                        | NULL    | NULL    | NULL      | 505432976 | Using where                     |
|  1 | PRIMARY     | a1               | eq_ref | PRIMARY,FK_address_1,idx_address_1  | PRIMARY | 8       | t2.max_id |         1 | Using where                     |
|  2 | DERIVED     | tableA           | ALL    | NULL                                        | NULL    | NULL    | NULL      | 505432976 | Using temporary; Using filesort |
+----+-------------+------------------+--------+---------------------------------------------+---------+---------+-----------+-----------+---------------------------------+
3 rows in set (0.01 sec)

【问题讨论】:

  • 查询计划只是一小部分;如果您想要有意义的建议,请编辑您的问题以显示您的查询本身和所有表格的 show create table yourtablename 输出,并愿意回答有关基数等的问题

标签: mysql sql-execution-plan explain


【解决方案1】:

您的问题可能集中在“子查询”与“派生表”上。

您的问题与删除大部分表格有关。忽略我对EXPLAIN 的讨论并跳到我下面的链接。也就是说,两者都不是“最快的”!

解释解释

使用EXPLAIN 的一种非常粗略的方法是使用多个Rows 列。在第一个查询中,即 (505432976 * 505432976)。这告诉我,查询可能需要数年,甚至数百年才能运行。查询似乎说“对于'primary'中的每一行,扫描所有'subquery'”。

在第二个 ('DERIVED') 查询中,多个“表”,然后是“取决于”是否将结果相乘或相加。我认为会发生“添加” - (505432976 + 505432976)。糟糕,但没有那么可怕。它似乎在说“首先将所有'派生'表A复制到一个临时表中,然后扫描所有该临时表以获得最终结果。”

ALL 表示“表扫描”,可能表示没有有用的索引。或者这可能意味着您正在特意查看每个 500M 行表的所有行。

警告:LIMIT 通常不会计入EXPLAIN 的数字中。但有时LIMIT 并没有缩短执行时间。

每个表都必须有一个PRIMARY KEY。二级索引通常非常有用。 “复合”索引通常优于单列索引。 查看WHERE 子句,了解哪些列应该被索引。 (索引的艺术比这复杂得多,但这会让你开始。)

另见EXPLAIN FORMAT=JSON SELECT ...

向我们展示查询告诉我们您需要删除(或“保留”)的内容!

计划移除不少

复制到您想要保留的行可能会快得多

我讨论了deleting lots of rows 的各种技术。阅读这 5 亿行可能会为您省去很多麻烦!

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2012-11-12
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2014-08-02
    相关资源
    最近更新 更多