//表结构CREATE TABLE IF NOT EXISTS `radacct` ( `RadAcctId` bigint(21) NOT NULL AUTO_INCREMENT, `UserName` varchar(64) NOT NULL DEFAULT '', `AcctSessionTime` int(12) DEFAULT NULL, `AcctInputOctets` bigint(12) DEFAULT NULL, `AcctOutputOctets` bigint(12) DEFAULT NULL, ... ...... PRIMARY KEY (`RadAcctId`), KEY `UserName` (`UserName`), KEY `AcctSessionTime` (`AcctSessionTime`), KEY `AcctInputOctets` (`AcctInputOctets`), KEY `AcctOutputOctets` (`AcctOutputOctets`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=456017; $sql = 'SELECT UserName, count(*) AS numOfSession, sum(AcctSessionTime) AS Time, sum(AcctInputOctets) AS Upload, sum(AcctOutputOctets) AS Download, sum(AcctInputOctets+AcctOutputOctets) AS Bandwidth FROM radacct GROUP BY UserName'; mysql> explain SELECT UserName, count(*) AS numOfSession, sum( AcctSessionTime ) AS Time, sum( AcctInputOctets ) AS Upload, sum( AcctOutputOctets ) AS Download, sum( AcctInputOctets + AcctOutputOctets ) AS Bandwidth FROM radacct GROUP BY UserName; +----+-------------+---------+------+---------------+------+---------+------+--------+---------------------------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+---------+------+---------------+------+---------+------+--------+---------------------------------+| 1 | SIMPLE | radacct | ALL | NULL | NULL | NULL | NULL | 456010 | Using temporary; Using filesort |+----+-------------+---------+------+---------------+------+---------+------+--------+---------------------------------+
返信ディスカッション (解決策)
テーブルが異常な場合は、データのコピーをキャッシュしてすべてのクエリを置き換えることを検討できます。
まず、計算を使用する場合、インデックスはすでに無効になっているため、インデックスを追加しても追加しなくても影響はありません。
私のアイデアは、テーブルが異常な場合は、すべてのクエリを置き換えるためにデータのコピーをキャッシュすることを検討できます。
わかりました、Sao Nian、誰も分割しに来ない場合は、すべてあなたに与えられます
ページングなどを追加するとさらに遅くなります。私の考えは、テーブルが異常に大きくなった場合は、キャッシュを検討することができます。作成したすべてのクエリをデータのコピーに置き換えます。