Обновления всей таблицы

В настоящее время мы используем MySQL.

У нас есть таблица с пространственным индексом (поэтому нет InnoDB), и мы выполняем обновление всей таблицы каждые x секунд (перемещение объекта из одного места в другое).

В настоящее время мы делаем:

UPDATE LOW_PRIORITY IGNORE `table`
SET `column1` = CASE `column2`
              WHEN 1 THEN ...
              WHEN 2 THEN ...
              WHEN 3 THEN ...
              ...
              ELSE `column1`
              END;

но это становится чрезвычайно болезненным, поскольку число рядов увеличивается. Есть ли лучший способ сделать обновления всей таблицы? Может нам стоит перейти на другую БД (PostGIS, NoSQL)?

Есть мысли по этому поводу?

1 ответ

Решение

Лучший способ ОБНОВИТЬ несколько строк одновременно:

  • СОЗДАТЬ ТАБЛИЦУ
  • Заполните его (первичный ключ, новые значения) с большой вставкой
  • ОБНОВЛЕНИЕ таблицы ОБЪЕДИНЕНИЕ ВРЕМЕННОЕ ИСПОЛЬЗОВАНИЕ (первичный ключ) SET table.oldvalue=temptable.newvalue

Обновить:

create table test ( id integer primary key, p point not null );
insert into test (id,p) select id, POINT( id%100, floor(id/100) ) from serie limit 10000;
alter table test add spatial index spi (p);
select id, AsText(p) from test;

+----+-------------+
| id | AsText(p)   |
+----+-------------+
|  1 | POINT(1 0)  |
|  2 | POINT(2 0)  |
|  3 | POINT(3 0)  |
...

|  98 | POINT(98 0) |
|  99 | POINT(99 0) |
| 100 | POINT(0 1)  |
| 101 | POINT(1 1)  |
...

|  9999 | POINT(99 99) |
| 10000 | POINT(0 100) |
+-------+--------------+


EXPLAIN SELECT id,AsText(p) from test where Contains( GeomFromText('POLYGON((0 0,0 10,10 10,10 0,0 0))'), p );
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | test  | range | spi           | spi  | 34      | NULL |  112 | Using where |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+

create temporary table test2 ( id integer primary key, p point not null );
insert into test2 (id,p) select id, POINT( 1+(id%100), 1+floor(id/100) ) from serie limit 10000;
update test, test2 set test.p=test2.p where test.id=test2.id;

EXPLAIN SELECT id,AsText(p) from test where Contains( GeomFromText('POLYGON((0 0,0 10,10 10,10 0,0 0))'), p );
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | test  | range | spi           | spi  | 34      | NULL |  102 | Using where |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+

Здесь нет проблем (MySQL 5.1.41)

Другие вопросы по тегам