Mysql innodb:为'大于> ='选择索引类型

时间:2011-01-10 17:12:29

标签: mysql optimization indexing innodb

我正在优化更新查询:

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查询?

3 个答案:

答案 0 :(得分:1)

UPDATE projects SET rgt = rgt + 2 WHERE rgt >= @superRgt会影响多少行?

如果它影响很多行,MySQL将忽略定义的索引。这些链接可能是相关的:

MySQL is not using an index

MySQL datetime index is not working

答案 1 :(得分:0)

尝试删除所有索引。因为我不确定该索引何时更新。在每个SET期间,或在表格中的所有chages之后。如果答案是 - 在更新每一行之后,那么它真的很慢。

答案 2 :(得分:0)

我认为加快速度的唯一方法是检查你的innodb缓冲区大小。磁盘和ram缓存。

较小的值可能会导致innodb频繁进入磁盘。