mysql における sum の最適化とインデックス作成の問題

WBOY
リリース: 2016-06-23 14:05:51
オリジナル
2334 人が閲覧しました

//表结构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 |+----+-------------+---------+------+---------------+------+---------+------+--------+---------------------------------+
ログイン後にコピー

データ量は約 450,000 です。sum フィールドにインデックスを追加してもクエリ効率は向上しません

最適化する最善の方法は何ですか?



返信ディスカッション (解決策)

まず、計算が使用される場合、インデックスはすでに無効であるため、インデックスを追加するかどうかは影響しません。

テーブルが異常な場合は、データのコピーをキャッシュしてすべてのクエリを置き換えることを検討できます。

まず、計算を使用する場合、インデックスはすでに無効になっているため、インデックスを追加しても追加しなくても影響はありません。

私のアイデアは、テーブルが異常な場合は、すべてのクエリを置き換えるためにデータのコピーをキャッシュすることを検討できます。
わかりました、Sao Nian、誰も分割しに来ない場合は、すべてあなたに与えられます

ページングなどを追加するとさらに遅くなります。私の考えは、テーブルが異常に大きくなった場合は、キャッシュを検討することができます。作成したすべてのクエリをデータのコピーに置き換えます。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート