2016-07-27 3 views
-2

表1MySQLのクエリは、私が実行しています

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='نشاط التطبيق'; 

クエリを実行するために4分かかります。

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; 

あなたは適切なインデックスを必要としています。 1つはbranches(branch_id)にありますが、既にこれを持っている可能性があります。

第2はapplication_activity(userid, activityid)です。

すべての相関サブクエリの列は、テーブルの別名で修飾することを強くお勧めします。

+0

私はしたが、結果は同じである(SELECT COUNT(*)FROM application_activity aa where aa.userid = au.'id ')あなたが言ったように、この結果は素早く –

+0

になります。 –

関連する問題