如何解决最佳解释计划
理论上,哪些会更快地返回结果?我不得不处理表中近 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 举报,一经查实,本站将立刻删除。