我有一个表,我需要执行一个可怕的查询(不是我的数据库设计)。
表格很简单:
`id` bigint(255) NOT NULL AUTO_INCREMENT,
`poster` varchar(30) NOT NULL,
`chattext` varchar(255) NOT NULL,
`timeposted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`type` int(3) NOT NULL DEFAULT '0',
`towho` varchar(30) DEFAULT NULL
我当前的查询做了我想要的,但服务器的成本很高。我只使用少数用户在最大CPU附近运行。可悲的是,他们每隔5秒就会拉一次。
当前查询:
SELECT c.poster, c.chattext, c.type, c.towho, c.timeposted, u.utype, u.locz
FROM chat c
LEFT JOIN users u ON c.poster=u.name
WHERE c.type!=4
UNION (
SELECT c.poster, c.chattext, c.type, c.towho, c.timeposted, u.utype, u.locz
FROM chat c
LEFT JOIN users u ON c.poster=u.name
WHERE c.type=4 AND c.towho='USERNAME')
UNION (
SELECT c.poster, c.chattext, c.type, c.towho, c.timeposted, u.utype, u.locz
FROM chat c
LEFT JOIN users u ON c.poster=u.name
WHERE c.type=4 AND c.poster='USERNAME')
ORDER BY timeposted DESC LIMIT 0, 25"
所有在线用户每5秒执行此操作。正如你所看到的,它很快变成了资源匮乏。
我已经习惯了MSSQL,所以我应该能够掌握MySql的概念,语法也没有太大的不同。这个查询是在没有添加用户表的情况下发给我的,所以我认为我的思维方式一直在努力寻找更好的方法。
我认为我这样做是错误/复杂的。因此,对提高绩效的任何帮助表示赞赏。
答案 0 :(得分:3)
我认为这个更简单的查询与您的相同。不是吗?
SELECT c.poster, c.chattext, c.type, c.towho, c.timeposted, u.utype, u.locz
FROM chat c
LEFT JOIN users u ON c.poster=u.name
WHERE c.type!=4
OR
(c.type=4 AND c.towho='USERNAME')
OR
(c.type=4 AND c.poster='USERNAME')
ORDER BY timeposted DESC LIMIT 0, 25