MySQL查询帮助 - 对同一个表的多个查询

时间:2011-04-20 06:46:24

标签: mysql

我有一个表,我需要执行一个可怕的查询(不是我的数据库设计)。

表格很简单:

`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的概念,语法也没有太大的不同。这个查询是在没有添加用户表的情况下发给我的,所以我认为我的思维方式一直在努力寻找更好的方法。

我认为我这样做是错误/复杂的。因此,对提高绩效的任何帮助表示赞赏。

1 个答案:

答案 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