2010-11-23 53 views
2

我有一個很難得到此查詢效果會更好:很難優化查詢

我有以下2個表:

DROP TABLE IF EXISTS `casino`.`mutualfriends`; 
CREATE TABLE `casino`.`mutualfriends` (
    `CustUID` varchar(64) CHARACTER SET ascii NOT NULL, 
    `CustUID2` varchar(64) CHARACTER SET ascii NOT NULL, 
    `FType` tinyint(4) NOT NULL, 
    PRIMARY KEY (`CustUID`,`CustUID2`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 


DROP TABLE IF EXISTS `casino`.`customers`; 
CREATE TABLE `casino`.`customers` (
    `CustFullName` varchar(45) NOT NULL, 
    `CustEmail` varchar(128) NOT NULL, 
    `CustUID` varchar(64) CHARACTER SET ascii NOT NULL, 
    `CustMoney` bigint(20) NOT NULL DEFAULT '0', 
    `SmallPicURL` varchar(120) CHARACTER SET ascii DEFAULT '', 
    `LargePicURL` varchar(120) CHARACTER SET ascii DEFAULT '', 
    PRIMARY KEY (`CustUID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CUSTOMERS表具有1M行,共同的朋友有500K行。

我很難優化此查詢;似乎有一個表掃描使用它。我想盡量減少掃描:

SELECT c.CustUID AS Cuid, c.CustFullName, c.CustMoney, c.SmallPicURL 
FROM `customers` c 
WHERE c.`CustUID` = '1:1542073175' 
UNION 
SELECT m.`CustUID2` AS Cuid, c.CustFullName, c.CustMoney, c.SmallPicURL 
FROM `mutualfriends` m, `customers` c 
WHERE m.`CustUID` = '1:1542073175' 
AND c.`CustUID` = m.`CustUID2` 
UNION 
SELECT m.`CustUID` AS Cuid, c.CustFullName, c.CustMoney, c.SmallPicURL 
FROM `mutualfriends` m, customers c 
WHERE m.`CustUID2` = '1:1542073175' 
AND c.CustUID = m.`CustUID` 
+0

你究竟想要做什麼?您是否想要獲得所有客戶及其共同朋友的列表?從代碼中不太清楚。 – Ramy 2010-11-23 05:54:02

+0

好吧,我正在做的是得到一個客戶列表,他與客戶是共同的朋友,他的ID是:'1:1542073175'。查詢結果是正確的,但其性能很差,我正在尋找一種方式來獲得與上述查詢相同的結果,但具有更好的性能 – mysqldude 2010-11-23 05:57:17

回答

2

我認爲你需要在MutualFriends.CustUID2索引(一式兩份指標,而不是唯一索引,而不是作爲的一部分主鍵)。主鍵可能會爲查詢客戶('1:1542073175')首先列出的查詢提供可用索引。

檢查查詢計劃的說明。

我認爲你是對的,有一個順序掃描第三部分的聯盟,可能是第二個也是。

0

嘗試此查詢

SELECT c.CustUID AS Cuid, c.CustFullName, c.CustMoney, c.SmallPicURL 
FROM `customers` c INNER JOIN `mutualfriends` m 
IN c.CustUID = m.`CustUID` 
WHERE m.`CustUID2` = '1:1542073175' 
+0

感謝您的答案,它不會給出與我的查詢相同的結果,缺少一些行,任何想法? – mysqldude 2010-11-23 06:04:00

+1

查詢無法正確選擇。如果客戶沒有任何共同的朋友,則沒有選擇任何東西;如果顧客與自己不是共同的朋友,那麼就沒有選擇;它不會選擇客戶是其他人的主要朋友的行;等等 – 2010-11-23 06:15:16

0

與此查詢試試看:

select * 
from customers 
where CustUID in (
    select CustUID 
    from mutual_friends 
    where CustUID2 = '1:1542073175' 
    union all 
    select CustUID2 
    from mutual_friends 
    where CustUID = '1:1542073175' 
    union all 
    select '1:1542073175' 
) 

是,任何更快嗎?