1

問題が発生しています。巨大なデータベースがあり、変更を加えることができません。最初にこのすべてのデータを処理する必要があります。問題は、以下に記述されている各クエリに約1〜2分かかることです。誰かが最適化された選択をする方法を知っているなら、私はそれを評価するでしょう。

select distinct x.peerId
,(select max(id) from checkPeer where peerId=x.peerId) as idd 
from checkPeer x where x.id>0 order by x.id desc

以下に定義されたテーブルからこの選択を最適化する方法はありますか?

CREATE TABLE `checkPeer` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`peerId` varchar(100) COLLATE utf8_bin DEFAULT NULL,
`peerDate` datetime DEFAULT NULL,
`peerUrl` bigint(20) DEFAULT '0',
`peerState` bigint(20) DEFAULT '0',
`peerMessage` varchar(500) COLLATE utf8_bin DEFAULT NULL,
`peerResource` varchar(5000) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `peerId` (`peerId`),
KEY `peerUrl` (`peerUrl`)
) ENGINE=MyISAM AUTO_INCREMENT=688791 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

ありがとうございました!

4

2 に答える 2

0

peeridでグループ化し、max(id)を選択してみませんか?

select peerId, max(id) as idd
from checkPeer 
  where id > 0
  group by peerid
  order by id
于 2012-10-04T21:41:19.953 に答える
0

いくつかの即時の提案、削除DISTINCTして以下を試してください:

select x.peerId, x1.id as idd 
from checkPeer x 
left join
(
    select max(id) id, peerid
    from checkPeer
    group by peerid
) x1
    on x.peerid = x1.peerid
where x.id>0 
order by x.id desc

上記はうまく機能します。より多くのフィールドが必要になったが、2つだけが必要であると述べた場合は、次のことを試すことができます。

select peerId, max(id) as idd
from checkPeer 
where id > 0
group by peerid
于 2012-10-04T21:31:17.387 に答える