优化yii2的查询

时间:2017-05-24 15:47:46

标签: mysql optimization yii2 query-builder

这个查询正在获取我想要的正确数据,但这在我们的服务器上是如此缓慢和沉重,只有5417行数据。我将如何在查询构建器或yii2框架方式中优化此查询?

SELECT  t1.id
    FROM  tbl_ticket t1
    WHERE  NOT EXISTS 
        ( SELECT  1
            FROM  tbl_ticket
            WHERE  parent_id = t1.id 
        )
      AND  parent_id =0
    UNION  ALL 
SELECT  MAX( id )
    FROM  tbl_ticket
    WHERE  parent_id <>0
    GROUP BY  parent_id
    ORDER BY  id ASC

2 个答案:

答案 0 :(得分:0)

( SELECT  t1.id
    FROM      tbl_ticket t1
    LEFT JOIN tbl_ticket t2  ON  t2.parent_id = t1.id 
    WHERE t2.id IS NULL
      AND t1.parent_id = 0 )
UNION  ALL 
( SELECT  MAX( id )
    FROM  tbl_ticket
    WHERE  parent_id <> 0
    GROUP BY  parent_id )
ORDER BY id ASC

第一个SELECT似乎找到了没有孩子而没有父母的ids。正确的吗?

第二个SELECT似乎找到了每个家庭的最后一个兄弟,不包括亚当和夏娃。那是你的意图吗?

我添加了括号,将ORDER BY从第二个SELECT移到整个查询。那是你的意图吗?

要快速运行该查询&#39;,您需要

INDEX(parent_id, id)

我假设您已经拥有PRIMARY KEY(id)。 (请提供SHOW CREATE TABLE tbl_ticket。)

答案 1 :(得分:0)

这是表格:

CREATE TABLE IF NOT NOT EXISTS tbl_ticket(   id int(9)NOT NULL AUTO_INCREMENT,   parent_id int(11)NOT NULL,   ticket_title varchar(250)NOT NULL,   location_id varchar(250)CHARACTER SET latin1 NOT NULL,   status int(11)NOT NULL,   remarks varchar(250)CHARACTER SET latin1 NOT NULL,   r_date datetime NOT NULL,   d_date datetime NOT NULL,   hd_user_username varchar(250)CHARACTER SET latin1 NOT NULL,   hd_user_email varchar(250)CHARACTER SET latin1 NOT NULL,   description varchar(3000)NOT NULL,   attachment varchar(250)NOT NULL,   created_by varchar(250)NOT NULL,   updated_by varchar(250)NOT NULL,   room_no varchar(250)NOT NULL,   gsm varchar(250)NOT NULL,   file_mime_type varchar(250)NOT NULL,   file_original_name varchar(250)DEFAULT NULL,   file_size varchar(250)DEFAULT NULL,   file_extension varchar(250)DEFAULT NULL,   acknowledged varchar(250)DEFAULT NULL,   ip_address varchar(20)DEFAULT NULL,   hostname varchar(255)DEFAULT NULL,   useragent文字,   closing_remark varchar(2048)DEFAULT NULL,   rating int(6)DEFAULT NULL,   is_student int(2)DEFAULT NULL,   installation int(1)DEFAULT NULL,   type int(1)DEFAULT NULL,   PRIMARY KEY(id),   KEY idid),   KEY parent_idparent_id) )ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 5428;