1

接続されているクライアントのためにデータベースに多くの書き込みを行うサーバーがあります。それへのより多くの接続は、より多くのことを書いています。私の質問は..これを最もエレガントに処理するにはどうすればよいですか? DB が大きくなるにつれて、挿入/更新にかかる時間がどんどん長くなり、サーバーからの応答がますます遅くなるため、クライアントに遅れが生じます。

私が考えたことの 1 つは、DB ヘルパー プログラムを QUEUE データベースに書き込み、割り当てられたときに別のアプリケーションとして書き込むことです。これにより、サーバーはより集中できるようになりますが、これが最適なルートかどうかはわかりません。

どんな助けでも素晴らしいでしょう。

<Debug> -- 10/6/2012 8:57:15 PM -- UPDATE mapdata SET X = @1, Y = @2, Rank = @3, Health = @4, Beacons = @20,Armors = @5, Duals = @6, Missiles = @7, Homings = @8, Radars = @9, HasRankKill = @10, TotalPP = @11, RankPP = @12, KillCount = @13, DeathCount = @14, TimePlayed = @15, EnabledEquipment = @16 WHERE MapID = @17 AND TankID = @18 AND Color = @19;
<Debug> -- 10/6/2012 8:57:15 PM -- Time to execute: 00:00:00.0468003

この実行には 0.5 秒かかります。

次のように MapData にインデックスがあります。

PRIMARY: MapID, TankID, Color
MapID: MapID
TankID: TankID

'MapData', 'CREATE TABLE `mapdata` (\n  `MapID` int(11) NOT NULL,\n  `TankID` int(11) NOT NULL,\n  `Color` tinyint(4) NOT NULL,\n  `X` int(11) DEFAULT \'-1\',\n  `Y` int(11) DEFAULT \'-1\',\n  `Rank` tinyint(4) NOT NULL DEFAULT \'0\',\n  `Health` int(11) NOT NULL DEFAULT \'1200\',\n  `Armors` tinyint(4) NOT NULL DEFAULT \'0\',\n  `Duals` tinyint(4) NOT NULL DEFAULT \'0\',\n  `Missiles` tinyint(4) NOT NULL DEFAULT \'0\',\n  `Homings` tinyint(4) NOT NULL DEFAULT \'0\',\n  `Radars` tinyint(4) NOT NULL DEFAULT \'0\',\n  `Beacons` tinyint(4) NOT NULL DEFAULT \'0\',\n  `HasRankKill` bit(1) NOT NULL DEFAULT b\'0\',\n  `TotalPP` bigint(20) NOT NULL DEFAULT \'0\',\n  `RankPP` bigint(20) NOT NULL DEFAULT \'0\',\n  `KillCount` int(11) NOT NULL DEFAULT \'0\',\n  `DeathCount` int(11) NOT NULL DEFAULT \'0\',\n  `TimePlayed` time NOT NULL DEFAULT \'00:00:00\',\n  `EnabledEquipment` tinyint(4) NOT NULL DEFAULT \'0\',\n  `Prestige` tinyint(4) NOT NULL DEFAULT \'0\',\n  PRIMARY KEY (`MapID`,`TankID`,`Color`),\n  KEY `MapID` (`MapID`),\n  KEY `TankID` (`TankID`),\n  CONSTRAINT `mapdata_ibfk_1` FOREIGN KEY (`MapID`) REFERENCES `maps` (`ID`) ON DELETE CASCADE,\n  CONSTRAINT `mapdata_ibfk_2` FOREIGN KEY (`TankID`) REFERENCES `tank` (`ID`) ON DELETE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=latin1'
4

2 に答える 2

0

サーバーが停止しないようにする一般的な方法は、マルチスレッドを使用することです。これにより、スレッドがデータベースの更新を処理している間、サーバーは着信要求に応答し続けることができます。mysqlがスレッドセーフであるかどうかはわかりません。そのため、データベースの周りにロックを実装する必要があるかもしれません。

于 2012-10-07T00:55:28.437 に答える