2014-09-30 34 views
4

我不知道爲什麼這個查詢花費4分鐘完成:逆足實在是太差了

SELECT 
    su.sid,u.uid,u.display_name,u.locale 
FROM user u 
LEFT JOIN subscription_user su ON su.uid = u.uid 
ORDER BY u.display_name DESC 
LIMIT 0,25; 

嗯,我知道這是由於順序,刪除它,它的速度非常快。如果我更改爲使用INNER JOIN,但速度很快,但問題並非所有用戶都可能位於subscription_user表中。

CREATE TABLE `user` (
    `uid` int(11) NOT NULL AUTO_INCREMENT, 
    `password` varchar(100) DEFAULT NULL, 
    `user_type` varchar(10) NOT NULL DEFAULT 'user', 
    `display_name` varchar(50) NOT NULL, 
    `email` varchar(100) NOT NULL, 
    `locale` varchar(8) DEFAULT 'en', 
    `last_login` datetime DEFAULT NULL, 
    `auth_type` varchar(10) DEFAULT NULL, 
    `auth_data` varchar(500) DEFAULT NULL, 
    `inactive` tinyint(4) NOT NULL DEFAULT '0', 
    `receive_email` tinyint(4) NOT NULL DEFAULT '1', 
    `stateid` int(10) DEFAULT NULL, 
    `owner_group_id` int(11) DEFAULT NULL, 
    `signature` varchar(500) DEFAULT NULL, 
    `raw_signature` varchar(500) DEFAULT NULL, 
    `round_robin` smallint(5) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`uid`), 
    UNIQUE KEY `email` (`email`), 
    KEY `stateid` (`stateid`) USING BTREE, 
    KEY `user_type` (`user_type`) USING BTREE, 
    KEY `name` (`display_name`) 
) ENGINE=InnoDB AUTO_INCREMENT=28343 DEFAULT CHARSET=latin1; 

CREATE TABLE `subscription_user` (
    `sid` varchar(50) NOT NULL, 
    `uid` int(11) NOT NULL, 
    `deleted` tinyint(4) NOT NULL DEFAULT '0', 
    `forum_user` varchar(50) NOT NULL, 
    PRIMARY KEY (`sid`,`uid`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

我想這個問題的獨立指標是缺少鍵「UID」在表'subscription_user' – maszter 2014-09-30 23:10:19

+0

它是'subscription_user'的主鍵的一部分 – 2014-09-30 23:13:52

+0

所以?您的加入已啓用su.uid = u.uid – maszter 2014-09-30 23:14:45

回答

3

當您有SQL查詢時,如果索引中的第一列是查詢的一部分,索引只能真正幫助您。

您的查詢加入su.uid = u.uid,優化程序將無法使用它來引用訂閱主鍵索引中的第一列。

您應該反轉列的順序在主鍵,或者,你應該添加一個外鍵索引,或在uid