2016-07-27 25 views
-2

表1.MySQL查詢需要4分鐘,以執行

CREATE TABLE `admin_users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`branch_id` int(11) DEFAULT '0', 
`landingpage` int(11) DEFAULT '8', 
`user_role_id` int(11) DEFAULT '0', 
`user_parent_role` int(11) DEFAULT '0', 
`bank_branch_id` int(11) DEFAULT '0', 
`status` enum('1','0') COLLATE utf8_unicode_ci DEFAULT '1', 
`firstname` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
`lastname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
PRIMARY KEY (`id`), KEY `user_role_id` (`user_role_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=281 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='الموظفين'; 

表我執行2.

CREATE TABLE `application_activity` (
`activityid` bigint(11) NOT NULL AUTO_INCREMENT, 
`dataid` text, 
`datatable` varchar(255) DEFAULT NULL, 
`userid` int(11) DEFAULT '0', 
`activitytype` char(1) DEFAULT 'I', 
`activitytime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`activityip` varchar(15) DEFAULT NULL, 
`activitydevice` text, 
PRIMARY KEY (`activityid`)) ENGINE=MyISAM AUTO_INCREMENT=152862 DEFAULT CHARSET=utf8 COMMENT='نشاط التطبيق'; 

查詢。

SELECT admin_users.`firstname`,admin_users.`lastname`,admin_users.`id`, branches.`branch_name`, 
      (SELECT COUNT(activityid) FROM application_activity WHERE userid=admin_users.`id`) AS cnt, 
      (SELECT activitytype FROM application_activity WHERE userid=admin_users.`id` ORDER BY activityid DESC LIMIT 0,1) AS activitytype, 
      (SELECT datatable FROM application_activity WHERE userid=admin_users.`id` ORDER BY activityid DESC LIMIT 0,1) AS datatable, 
      (SELECT activitytime FROM application_activity WHERE userid=admin_users.`id` ORDER BY activityid DESC LIMIT 0,1) AS activitytime 
      FROM admin_users 
      JOIN branches ON branches.`branch_id`=admin_users.`branch_id` 
      HAVING cnt > 0 
      ORDER BY cnt DESC 

表1有100個記錄的用戶和表2有更多然後100k的記錄的應用程序活動。

當我執行查詢它將需要4分鐘給予結果。

+0

你看過_EXPLAIN_嗎? –

+0

我需要解釋一下,我是新的數據庫,所以引導我 –

+0

谷歌爲MySQL解釋命令 –

回答

0

對於此查詢:

這是您的查詢:

SELECT au.`firstname`, au.`lastname`, au.`id`, b.`branch_name`, 
     (SELECT COUNT(*) FROM application_activity aa WHERE aa.userid = admin_users.`id`) AS cnt, 
      (SELECT aa.activitytype FROM application_activity aa WHERE aa.userid = au.`id` ORDER BY aa.activityid DESC LIMIT 0,1) AS activitytype, 
      (SELECT aa.datatable FROM application_activity aa WHERE aa.userid = au.`id` ORDER BY aa.activityid DESC LIMIT 0,1) AS datatable, 
      (SELECT aa.activitytime FROM application_activity aa WHERE aa.userid = au.id` ORDER BY aa.activityid DESC LIMIT 0,1) AS activitytime 
FROM admin_users au JOIN 
    branches b 
    ON b.`branch_id` = au.`branch_id` 
HAVING cnt > 0 
ORDER BY cnt DESC; 

你需要合適的索引。一個是在branches(branch_id) - 但你可能已經有了。

第二個是application_activity(userid, activityid)

我強烈建議當全部列中的相關子查詢使用表別名限定。

+0

我做但結果是一樣的,當我提交(選擇計數(*)從application_activity aa WHERE aa.userid = au.'id ')作爲cnt這個結果來到快速 –

+0

正如你所說我做了一些修改,它完成了..... –

相關問題