2011-07-17 6 views
0

現在MySQLを使用しています。テーブル全体の更新

空間インデックス(InnoDBはありません)を持つテーブルがあり、x秒ごとにテーブル全体を更新します(ある場所から別の場所にオブジェクトを移動する)。

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

を、それは、行数が増加すると非常に痛い取得します。

現在、私たちはやって。テーブル全体の更新を行うより良い方法はありますか?他のDB(PostGIS、NoSQL)に切り替えるべきでしょうか?

これについてのご意見はありますか?

+0

なぜオブジェクトを移動していますか?これは何を伴うのでしょうか?何らかの理由でジューシーなビットがすべて削除された注釈付きバージョンではなく、実際の例を挙げられますか? –

+0

私は同意します...移動は間違っているように見え、代わりに、どこかでステータスを更新します。実際のヘルプを得るための実際の努力を示しています。 – Randy

+0

私は、人々がバーチャルバルーンを起動し、それをリアルマップ上で追跡できるiphoneゲームFloonrを持っています。緯度、経度に応じてすべての更新時に風の変化をシミュレートしています – RolandasR

答えて

0

一度に多くの行を更新するための最良の方法は次のとおりです。

  • は(TEMP表
  • UPDATEテーブルが使用してTEMPTABLE JOINの大きなINSERTと(主キー、新しい値)でそれを埋めるCREATE主キー)の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)

+0

面白いですね、それを試してみます – RolandasR

+0

ええ、それは空間インデックスで動作しないような更新のようです。インデックス付きの列を含めると、常にエラーが表示されます。 '#126 - テーブル' tablename.MYI 'のキーファイルが正しくありません。それを修復しようとすると修復することは役に立たない。空間インデックスを削除すると、すべてが動作するようです。 – RolandasR

+0

私はいくつかのテストを行いました。それはうまくいくようです... – peufeu

関連する問題