2011-04-20 42 views
0

我有一个表,我需要的(不是我的数据库设计)执行一个可怕的查询。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和语法一直没有太大的不同。这个查询是在没有添加用户表的情况下提供给我的,因此我认为我的思维模式一直困扰着找到更好的方法。

我想我这个做了错误的/复杂的方式。所以对提高性能的任何帮助表示赞赏。

回答

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 
+0

看,我知道我是通过坚持原来的查询设计使它过于复杂。不能相信我错过了这一点,非常感谢加尔茨。 – JClaspill 2011-04-20 07:52:23