微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最佳解释计划

如何解决最佳解释计划

理论上,哪些会更快地返回结果?我不得不处理表中近 10 亿行,并想出一个计划来删除相当多的行。我需要确保提供最快的解决方案。

+----+-------------+------------------+------+---------------+------+---------+------+-----------+---------------------------------+
| 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)

解决方法

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

您的问题与删除表格的很大一部分有关。忽略我对 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 的各种技术。阅读这本书可以为您的 500M 行省去很多麻烦!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?