我有一個大的MySQL查詢,實際上返回的結果很好,但它很慢。如何提高我的朋友列表MySQL查詢?
SELECT DISTINCT
username,
user.id as uid,
email,
ui.gender,
ui.country,
ui.birthday,
IF(last_activity_date >= now() - INTERVAL 1 HOUR, 1, 0) as is_online,
p.thumb_url,
friend_request.id as sr_id,
IF(ul.id IS NOT NULL, 1, 0) as st_love,
DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthday, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(birthday, '00-%m-%d')) AS age
FROM friend_request
JOIN user ON (user.`id` = friend_request.`to_user_id`
OR
user.`id` = friend_request.`from_user_id`)
AND user.`id` != '$user_id'
AND friend_request.`status` = '1'
JOIN user_info ui ON user.`id` = ui.`user_id`
JOIN photo p ON ui.`main_photo` = p.`id`
LEFT JOIN user_love ul ON ul.`to_user_id` = user.`id`
AND ul.`from_user_id` = $user_id
WHERE (friend_request.`to_user_id` = '$user_id'
OR friend_request.`from_user_id` = '$user_id')
ORDER BY friend_request.id DESC
LIMIT 30
「$ user_id」是登錄用戶的ID。
這裏是「friend_request」的表結構:
CREATE TABLE `friend_request` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`from_user_id` int(11) DEFAULT NULL,
`to_user_id` int(11) DEFAULT NULL,
`date` datetime DEFAULT NULL,
`seen` int(11) DEFAULT '0',
`status` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `from_user_id` (`from_user_id`),
KEY `to_user_id` (`to_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
你能幫我改善查詢?
我還沒有複製其他表的表結構,因爲經過一些測試後,「優化問題」似乎來自friend_request表。
謝謝!
編輯:
這裏是「解釋」給我:
考慮提供一個數據集和所需的結果集。 – Strawberry
做左連接而不是右連接。 (當然,你必須將表格左移<-> ......)這是可讀性的真正提高! (大多數人都有足夠的左連接問題,並且在正確加入時會感到困惑......) – jarlh
您是否從應用程序調用此應用程序?可能可以在應用程序代碼中執行一些業務邏輯(所有if/then語句和日期轉換),並將參數化列表傳遞給MySql以減輕數據庫上的一些處理。我同意@jarlh使用左連接,而不是正確的。 – ragerory