mysql select里面select优化

标签 mysql

我遇到了一个问题,我有庞大的数据库,现在我无法进行更改,我需要先处理所有这些数据。问题是下面写的每个查询大约需要 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;

谢谢!

最佳答案

一些直接的建议,删除 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

上面的方法很好用,如果你最终需要更多的字段,但你说你只需要这两个字段,那么你可以试试:

select peerId, max(id) as idd
from checkPeer 
where id > 0
group by peerid

关于mysql select里面select优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12736204/

相关文章:

mysql - sed 错误,而下划线是搜索文本的一部分

mysql - 使用 MySQL 中的子查询减去一周前的数据

mysql - 无法设置与 MySQL 工作台的连接

mysql - SQL 新手 - 使用索引加快速度

php - 在不同的 div 中加载每个 X 结果

php - 论坛帖子等的“编辑”功能

mysql - 是否可以从Excel文件生成ER图

mysql - 更新查询语法错误

java - 如何将从数据库中提取的对象添加到数组列表中?

MySQL - 使用 UNION 从多个表中删除?