Обновления всей таблицы
В настоящее время мы используем 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)