ホームページ > バックエンド開発 > PHPチュートリアル > PHP での大規模な配列の重複排除について質問したいのですが

PHP での大規模な配列の重複排除について質問したいのですが

WBOY
リリース: 2016-06-13 12:14:24
オリジナル
1058 人が閲覧しました

大規模な PHP 配列の重複排除について質問したいのですが
大規模な PHP 配列の操作について質問したいのですが、数百万のデータを含むテーブルを PHP 配列に重複排除する必要があります。例: id 性別 ID カードには 3 つのフィールドがあります。男性と女性が何人いるかをカウントする必要があります (他に固有のロジックがあり、MySQL では削除できません)
実装方法: id は自動インクリメントされます。 ID ごとに 50,000 個のデータが取得されるたびに、配列
$count = array(
' Male' => array(
'ID カード 1' => 1) で重複排除操作を実行します。 ,
'ID カード 2' => 1 ,
....
),
'女性' => 🎜>問題: 配列が大きくなるにつれて、重複排除の速度が遅くなりますどんどん遅くなっていきます。他に解決策や最適化方法があるかどうかはわかりません。

------ソリューションアイデア----------------------

データに従って実行しますあなたが与えたテスト
はそのような結果を取得できます この結果から始めて、SQL で他に何ができないでしょうか?

drop table if exists play;<br /><br />CREATE TABLE `play` (<br />  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,<br />  `time` int(10) NOT NULL,<br />  `uid` int(10) unsigned NOT NULL,<br />  `game` varchar(255) NOT NULL,<br />  `channel` varchar(255) NOT NULL,<br />  `system` varchar(255) NOT NULL,<br />  `screen` varchar(255) NOT NULL,<br />  `network` varchar(255) NOT NULL,<br />  PRIMARY KEY (`id`),<br />  KEY `datetime` (`time`)<br />) charset=gbk;<br /><br />insert into play values<br />(1,1421812389,10000,'所有游戏-魔兽世界-0服','360-360联盟','WIN7','1024x768','电信'),<br />(2,1421812389,10001,'所有游戏-魔兽世界-1服','网易-网易联盟','XP','1366x768','联通'),<br />(3,1421812389,10000,'所有游戏-魔兽世界-0服','360-360联盟','WIN7','1024x768','电信');<br /><br />drop table if exists play_game;<br /><br />create table play_game ( game varchar(100) ) charset=gbk;<br /><br />insert into play_game values ('所有游戏'),('魔兽世界'),('0服'),('1服');<br /><br />drop table if exists play_channel;<br /><br />create table play_channel ( channel varchar(100) ) charset=gbk;<br /><br />insert into play_channel values ('360'),('360联盟'),('网易'),('网易联盟');<br /><br />select a.id, a.time, a.uid, b.game, c.channel, a.system, a.screen, a.network from play a, play_game b, play_channel c where <br />  find_in_set(b.game, replace(a.game, '-', ','))<br />  and<br />  find_in_set(c.channel, replace(a.channel, '-', ','))<br />
ログイン後にコピー
<br />id time    uid  game   channel system screen  network <br />1  1421812389 10000 所有游戏 360   WIN7  1024x768 电信 <br />3  1421812389 10000 所有游戏 360   WIN7  1024x768 电信 <br />1  1421812389 10000 魔兽世界 360   WIN7  1024x768 电信 <br />3  1421812389 10000 魔兽世界 360   WIN7  1024x768 电信 <br />1  1421812389 10000 0服    360   WIN7  1024x768 电信 <br />3  1421812389 10000 0服    360   WIN7  1024x768 电信 <br />1  1421812389 10000 所有游戏 360联盟 WIN7  1024x768 电信 <br />3  1421812389 10000 所有游戏 360联盟 WIN7  1024x768 电信 <br />1  1421812389 10000 魔兽世界 360联盟 WIN7  1024x768 电信 <br />3  1421812389 10000 魔兽世界 360联盟 WIN7  1024x768 电信 <br />1  1421812389 10000 0服    360联盟 WIN7  1024x768 电信 <br />3  1421812389 10000 0服    360联盟 WIN7  1024x768 电信 <br />2  1421812389 10001 所有游戏 网易   XP   1366x768 联通 <br />2  1421812389 10001 魔兽世界 网易   XP   1366x768 联通 <br />2  1421812389 10001 1服    网易   XP   1366x768 联通 <br />2  1421812389 10001 所有游戏 网易联盟 XP   1366x768 联通 <br />2  1421812389 10001 魔兽世界 网易联盟 XP   1366x768 联通 <br />2  1421812389 10001 1服    网易联盟 XP   1366x768 联通 
ログイン後にコピー
すべてのゲーム - World of Warcraft-0 サーバー

すべてのゲーム、World of Warcraft、サーバー 0
に永続的に変更する場合は、それを実行する必要はありません。クエリ置換機能 (もちろん、これにはプログラムの変更が含まれる場合があります) を使用すると、効率は自然に向上します最終的なクエリをビューとして定義すると、効率が大幅に向上します (ビュー内のレコードのソースの場合)データが変更されていない場合、キャッシュされた結果はクエリ アクションなしで直接返されます) -----解決策のアイデア-------------- -- ------

すべての games-wow-1 サーバーを 1 つのフィールドに保存するにはどうすればよいですか~
いくつかのフィールドを追加し、分割して保存してから、上に配置することをお勧めします。 mysql 重い

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