私は学校の VLE 用にかなり壊れやすい PHP/JavaScript 報酬システムを開発しました。
作業の大部分はtransactions
、次のフィールドを持つテーブルで行われます。
Transaction_ID
, Datetime
, Giver_ID
, Recipient_ID
, Points
, Category_ID
_Reason
私がスタッフの一員として学生に報酬ポイントを与えると、次のようなエントリがデータベースに挿入されます。
INSERT INTO `transactions` (`Transaction_ID`, `Datetime`, `Giver_ID`, `Recipient_ID`, `Points`, `Category_ID`, `Reason`) VALUES
(60332, '2012-02-22', 34985, 137426, 5, 5, 'Excellent volcano homework.');
これは問題なく機能しましたが、システムがどれだけ使用されるかはあまり考えていませんでした。現在、このテーブルには72,000 を超えるトランザクションがあります。
そのため、私のページのいくつかが遅くなり始めています。たとえば、スタッフがポイントを割り当てようとすると、私のシステムはコマンドを実行して、スタッフの合計ポイント割り当てとその他の情報の断片を取得します。これはかなりゆっくりと表示されているように見えます.MySQLステートメント/付随するPHPコードを見ると、これははるかに効率的であると思います.
function getLimitsAndTotals($User_ID) {
$return["SpentTotal"] = 0;
$return["SpentWeekly"] = 0;
$sql = "SELECT *
FROM `transactions`
WHERE `Giver_ID` =$User_ID";
$res = mysql_query($sql);
if (mysql_num_rows($res) > 0) {
while ($row = mysql_fetch_assoc($res)) {
$return["SpentTotal"] += $row["Points"];
$transaction_date = strtotime ($row["Datetime"]);
if ($transaction_date > strtotime( "last sunday" )) {
$return["SpentWeekly"] += $row["Points"];
}
}
}
return $return;
}
そのため、私の質問は 2 つあります。
- この特定のコードを最適化できますか?
- システムをさらに最適化するために、データベース技術 (全文索引付けなど) を使用できますか?
編集:REインデックス作成
インデックス作成については何も知りませんが、transactions
テーブルに実際にインデックスが設定されているように見えますか?
これは正しいタイプのインデックスですか?
テーブル作成のコードは次のとおりです。
CREATE TABLE IF NOT EXISTS `transactions` (
`Transaction_ID` int(9) NOT NULL auto_increment,
`Datetime` date NOT NULL,
`Giver_ID` int(9) NOT NULL,
`Recipient_ID` int(9) NOT NULL,
`Points` int(4) NOT NULL,
`Category_ID` int(3) NOT NULL,
`Reason` text NOT NULL,
PRIMARY KEY (`Transaction_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=74927 ;
前もって感謝します、