MySQL子查询需要很长时间才能响应

MySQL子查询需要很长时间才能响应,mysql,subquery,Mysql,Subquery,我已经创建了3个表imei、post和view。我在所有3张表中都有大约1000条记录。现在,当我执行b/m查询时,它需要很长时间才能响应 下表给出了设计和样本数据: 表中的值: IMEI: 职位: 视图: 要执行的查询: SELECT * FROM ( SELECT i.imei_id, i.imei_no, p.post_id, p.post_title,

我已经创建了3个表imei、post和view。我在所有3张表中都有大约1000条记录。现在,当我执行b/m查询时,它需要很长时间才能响应

下表给出了设计和样本数据:

表中的值:

IMEI:

职位:

视图:

要执行的查询:

SELECT
    *
FROM
    (
        SELECT
            i.imei_id,
            i.imei_no,
            p.post_id,
            p.post_title,
            p.post_desc,
            p.date,
            1 AS STATUS
        FROM
            imei i,
            post p,
            VIEW v
        WHERE
            i.imei_id = v.imei_id
        AND p.post_id = v.post_id
        AND i.imei_no = 356554064098771
        UNION
            SELECT
                i.imei_id,
                i.imei_no,
                p.post_id,
                p.post_title,
                p.post_desc,
                p.date,
                0 AS STATUS
            FROM
                imei i,
                post p
            WHERE
                i.imei_no = 356554064098771
            AND p.post_id NOT IN (
                SELECT
                    v.post_id
                FROM
                    imei i,
                    post p,
                    VIEW v
                WHERE
                    p.post_id = v.post_id
                AND v.imei_id = (
                    SELECT
                        i.imei_id
                    FROM
                        imei i
                    WHERE
                        imei_no = 356554064098771
                )
            )
    ) AS temp
WHERE
    date >= DATE_SUB(
        (
            SELECT
                date
            FROM
                imei
            WHERE
                imei_no = 356554064098771
        ),
        INTERVAL 1 WEEK
    )
ORDER BY
    date DESC

尝试此查询从视图中选择post_id、post_title、post_desc、date、ifpost_id,其中imei_id=从imei中选择imei_id,其中imei_no=865645026396909,1,0作为状态从post

您希望得到什么结果?请还包括解释的结果。我得到了正确的结果,但这需要更多的时间,因为我使用的不是处于状态。我需要另一个解决方案这个问题对我来说太复杂了,我认为它没有意义。在union的第二次查询中,您从所有3个表中选择,但在where条件中,您仅联接2个post和view,因此与imei表的联接成为carthesian联接,因此对于imei表中的每个记录,您都会得到其他2个表联接的每个记录。@Lijibals原始样本数据,预期结果,口头描述你想要达到的目标对我们理解你的疑问很重要。如果没有这些,将很难为您提供替代解决方案。您的查询似乎过于复杂。此查询运行良好!加载时间从0.4缩短到0.05。如果可能的话,进一步优化它以减少加载时间,谢谢你的代码。
CREATE TABLE IF NOT EXISTS `post` (
  `post_id` int(5) NOT NULL AUTO_INCREMENT,
  `post_title` varchar(60) NOT NULL,
  `post_desc` varchar(500) NOT NULL,
  `post_author` varchar(30) NOT NULL DEFAULT 'Admin',
  `user_id` int(10) NOT NULL DEFAULT '1',
  `date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`post_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=876 ;
CREATE TABLE IF NOT EXISTS `view` (
  `view_id` int(5) NOT NULL AUTO_INCREMENT,
  `post_id` int(11) NOT NULL,
  `imei_id` varchar(30) NOT NULL,
  `status` varchar(10) NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`view_id`),
  UNIQUE KEY `imei_id` (`imei_id`,`post_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13706 ;
INSERT INTO `imei` (`imei_id`, `imei_no`, `imei_net`, `date`) VALUES
(1, '123456789012345', 'Airtel', '2015-08-06 07:39:47'),
(2, '234567890123456', 'Aircel', '2015-08-06 06:08:33')
INSERT INTO `post` (`post_id`, `post_title`, `post_desc`, `post_author`, `user_id`, `date`) VALUES
    (1, 'NSC Rate Down', 'NSC rates are getting down from today', 'Admin', 1, '2015-07-08 05:29:54'),
    (2, 'NCDEX offers cashback', 'NCDEX offers cashback for the previous users', 'Admin', 1, '2015-07-08 05:30:01')
INSERT INTO `view` (`view_id`, `post_id`, `imei_id`, `status`, `date`) VALUES
(1, 1, '1', '1', '2015-08-08 05:04:38'),
(7, 2, '1', '1', '2015-08-08 07:55:25')
SELECT
    *
FROM
    (
        SELECT
            i.imei_id,
            i.imei_no,
            p.post_id,
            p.post_title,
            p.post_desc,
            p.date,
            1 AS STATUS
        FROM
            imei i,
            post p,
            VIEW v
        WHERE
            i.imei_id = v.imei_id
        AND p.post_id = v.post_id
        AND i.imei_no = 356554064098771
        UNION
            SELECT
                i.imei_id,
                i.imei_no,
                p.post_id,
                p.post_title,
                p.post_desc,
                p.date,
                0 AS STATUS
            FROM
                imei i,
                post p
            WHERE
                i.imei_no = 356554064098771
            AND p.post_id NOT IN (
                SELECT
                    v.post_id
                FROM
                    imei i,
                    post p,
                    VIEW v
                WHERE
                    p.post_id = v.post_id
                AND v.imei_id = (
                    SELECT
                        i.imei_id
                    FROM
                        imei i
                    WHERE
                        imei_no = 356554064098771
                )
            )
    ) AS temp
WHERE
    date >= DATE_SUB(
        (
            SELECT
                date
            FROM
                imei
            WHERE
                imei_no = 356554064098771
        ),
        INTERVAL 1 WEEK
    )
ORDER BY
    date DESC