2011-04-20 43 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