請教一個關於PHP大數組去重的問題
請教一個問題,關於PHP大數組操作,一張表有幾百萬的資料要拿到PHP數組中做去重操作:
例如:id 性別 身份證三個欄位,需要統計男女各有多少人(有其它特定邏輯,不能在MySQL中去重)
實現方法:id是自增的,每次按id取5w條資料,拿到一個數組中做去重操作
$count = array(
'男' => array(
'身份證1' => 1,
'身份證2' => 1,
....
),
'女' => ...
);
最後看男女下共有多少個身份證即為去重後的資料
問題:隨著數組越來越大,去重速度也越來越慢,不知道有沒有其它解決方案或者最佳化方法,來請教一下,thx!
------解決思路----------------------
我們按你給出的資料做一個測試
drop table if exists play;
CREATE TABLE `play` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`time` int(10) NOT NULL,
`uid` int(10) unsigned NOT NULL,
`game` varchar(255) NOT NULL,
`channel` varchar(255) NOT NULL,
`system` varchar(255) NOT NULL,
`screen` varchar(255) NOT NULL,
`network` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `datetime` (`time`)
) charset=gbk;
insert into play values
(1,1421812389,10000,'所有遊戲-魔獸世界-0服','360-360聯盟','WIN7','1024x768','電信'),
(2,1421812389,10001,'所有遊戲-魔獸世界-1服','網易-網易聯盟','XP','1366x768','聯通'),
(3,1421812389,10000,'所有遊戲-魔獸世界-0服','360-360聯盟','WIN7','1024x768','電信');
drop table if exists play_game;
create table play_game ( game varchar(100) ) charset=gbk;
insert into play_game values ('所有遊戲'),('魔獸世界'),('0服'),('1服');
drop table if exists play_channel;
create table play_channel ( channel varchar(100) ) charset=gbk;
insert into play_channel values ('360'),('360聯盟'),('網易'),('網易聯盟');
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
find_in_set(b.game, replace(a.game, '-', ','))
and
find_in_set(c.channel, replace(a.channel, '-', ','))
可得到這樣的結果
id time uid game channel system screen network
1 1421812389 10000 所有遊戲 360 WIN7 1024x768 電信
3 1421812389 10000 所有遊戲 360 WIN7 1024x768 電信
1 1421812389 10000 魔獸世界 360 WIN7 1024x768 電信
3 1421812389 10000 魔獸世界 360 WIN7 1024x768 電信
1 1421812389 10000 0服 360 WIN7 1024x768 電信
3 1421812389 10000 0服 360 WIN7 1024x768 電信
1 1421812389 10000 所有遊戲 360聯盟 WIN7 1024x768 電信
3 1421812389 10000 所有遊戲 360聯盟 WIN7 1024x768 電信
1 1421812389 10000 魔獸世界 360聯盟 WIN7 1024x768 電信
3 1421812389 10000 魔獸世界 360聯盟 WIN7 1024x768 電信
1 1421812389 10000 0服 360聯盟 WIN7 1024x768 電信
3 1421812389 10000 0服 360聯盟 WIN7 1024x768 電信
2 1421812389 10001 所有遊戲 網易 XP 1366x768 聯通
2 1421812389 10001 魔獸世界 網易 XP 1366x768 聯通
2 1421812389 10001 1服 網易 XP 1366x768 聯通
2 1421812389 10001 所有遊戲 網易聯盟 XP 1366x768 聯通
2 1421812389 10001 魔獸世界 網易聯盟 XP 1366x768 聯通
2 1421812389 10001 1服 網易聯盟 XP 1366x768 聯通
再從這個結果出發,還有什麼是不可用 SQL 做到的呢?
如果你永久性的將
所有遊戲-魔獸世界-0服 改為
所有遊戲,魔獸世界,0服 那就不需要在查詢時執行 replace 函數了(當然這可能會涉及程式的改動),效率自然會有所提高
如果你再將最後的查詢定義成視圖的話,效率就又會提高不少(視圖中如果一條記錄的來源資料沒有被改變,則不做查詢動作而直接返回緩衝的結果)
------解決思路----------------------
怎麼能把 所有遊戲-wow-1服 存在一個欄位裡呢~
我是建議添加幾個欄位,將它拆開儲存,然後在mysql上排重