我正在优化更新查询:
UPDATE projects SET rgt = rgt + 2 WHERE rgt >= @superRgt;
该表有很多行(~63000),查询运行缓慢。当我
explain SELECT * FROM projects WHERE rgt >= @superRgt;
我得到了这个结果:
+----+-------------+----------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | projects | ALL | rgt | NULL | NULL | NULL | 69971 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+-------+-------------+
rgt键定义为:
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| projects | 1 | rgt | 1 | rgt | A | 72770 | NULL | NULL | | BTREE | |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
我想知道我是否可以通过选择可以与WHERE rgt >= @superRgt
一起使用的索引类型来优化UPDATE查询?
答案 0 :(得分:1)
UPDATE projects SET rgt = rgt + 2 WHERE rgt >= @superRgt
会影响多少行?
如果它影响很多行,MySQL将忽略定义的索引。这些链接可能是相关的:
答案 1 :(得分:0)
尝试删除所有索引。因为我不确定该索引何时更新。在每个SET期间,或在表格中的所有chages之后。如果答案是 - 在更新每一行之后,那么它真的很慢。
答案 2 :(得分:0)
我认为加快速度的唯一方法是检查你的innodb缓冲区大小。磁盘和ram缓存。
较小的值可能会导致innodb频繁进入磁盘。