Mysql innodb: выбор типа индекса для выбора «больше чем> =» - PullRequest
0 голосов
/ 10 января 2011

Я оптимизирую запрос на обновление:

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

Мне интересно, смогу ли я оптимизировать запрос UPDATE, выбрав тип индекса, который можно использовать с WHERE rgt >= @superRgt?

Ответы [ 3 ]

1 голос
/ 09 февраля 2011

На сколько строк влияет UPDATE projects SET rgt = rgt + 2 WHERE rgt >= @superRgt?

Если это влияет на большое количество строк, MySQL игнорирует определенный индекс.Эти ссылки могут быть связаны:

MySQL не использует индекс

Не работает индекс даты и времени MySQL

0 голосов
/ 09 февраля 2011

Я думаю, что единственный способ ускорить это - проверить размеры буфера innodb.Кэширование диска и оперативной памяти.

Небольшое значение может привести к частому переходу innodb на диск.

0 голосов
/ 10 января 2011

Попробуйте удалить все индексы на всех. Потому что я не совсем уверен, когда этот индекс будет обновляться. Во время каждого SET или после всех изменений в таблице. И если ответ - после обновления каждой строки, то это действительно медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...