我为我学校的 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;
}
因此,我的问题是双重的。
- 可以优化此特定代码吗?
- 我可以使用任何数据库技术(全文索引等)来进一步优化我的系统吗?
编辑:重新索引
我对索引一无所知,但看起来我的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 ;
提前致谢,