MYSQL:Left Join非常慢

时间:2015-08-10 13:30:32

标签: mysql left-join

我正在使用MySQl作为我的数据库,我有三个表,我想使用左连接加入它们,但性能非常慢。

以下是表格:

CREATE TABLE IF NOT EXISTS `register_doctor` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `doc_title` int(11) NOT NULL,
  `first_name` varchar(35) NOT NULL,
  `last_name` varchar(35) DEFAULT NULL,
  `gender` int(11) NOT NULL,
  `city_id` int(11) NOT NULL,
  `province_id` int(11) NOT NULL,
  `specialty_id` int(11) NOT NULL,
  `status` int(11) NOT NULL COMMENT '0 = Pending; 1 = Verified, 2 = Not Reg Yet, 3 = Pending Approval',
  `str_number` char(6) DEFAULT NULL,
  `editted_by` int(11) DEFAULT NULL,
  `editted_date` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `city_id` (`city_id`),
  KEY `specialty_id` (`specialty_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10267 ;

CREATE TABLE IF NOT EXISTS `ref_doctor_practice_place` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `doctor_id` int(11) NOT NULL,
  `practice_place_id` int(11) NOT NULL,
  `is_primary` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `doctor_id_2` (`doctor_id`,`practice_place_id`),
  KEY `doctor_id` (`doctor_id`),
  KEY `practice_place_id` (`practice_place_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=23677 ;

CREATE TABLE IF NOT EXISTS `practice_place` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(75) NOT NULL,
  `statement` text,
  `address` varchar(200) NOT NULL,
  `phone` varchar(15) NOT NULL,
  `fax` varchar(15) NOT NULL,
  `email` varchar(50) NOT NULL,
  `village_id` varchar(50) NOT NULL,
  `sub_district_id` varchar(50) NOT NULL,
  `province_id` varchar(50) NOT NULL,
  `zipcode` varchar(10) NOT NULL,
  `website` varchar(50) NOT NULL,
  `latitude` double NOT NULL,
  `longitude` double NOT NULL,
  `type` int(11) NOT NULL,
  `managed_by` int(11) DEFAULT '0',
  `doctor_group_id` int(11) NOT NULL,
  `category` varchar(50) NOT NULL,
  `photo_file` char(36) NOT NULL,
  `is_branch` int(11) NOT NULL,
  `parent_id` int(11) NOT NULL,
  `editted_by` int(11) NOT NULL,
  `editted_date` bigint(20) NOT NULL,
  `status` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `village_id` (`village_id`),
  KEY `doctor_group_id` (`doctor_group_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=24182 ;

我的查询是这样的:

SELECT SQL_CALC_FOUND_ROWS RD.id as rd_id
                         , RD.first_name
                         , RD.last_name
                         , RD.gender
                         , RD.str_number
                         , GROUP_CONCAT(DISTINCT PP.type SEPARATOR '|') as pp_type
                      FROM register_doctor RD 
                      LEFT 
                      JOIN ref_doctor_practice_place RDPP  
                        ON RDPP.doctor_id = RD.id
                      LEFT 
                      JOIN practice_place PP 
                        ON PP.id = RDPP.practice_place_id
                     GROUP 
                        BY RD.id 
                     ORDER 
                        BY RD.id DESC 
                     LIMIT 0,25

任何人都可以帮我这个吗?非常感谢。

根据Strawberry的要求,我在这里使用EXPLAIN的结果:

id  select_type     table   type    possible_keys   key         key_len ref                     rows    Extra   
1   SIMPLE      RD  index   PRIMARY,city_id PRIMARY     4   NULL                    15  NULL
1   SIMPLE      RDPP    ref     doctor_id   doctor_id   4   k6064619_lokadok.RD.id          1   NULL
1   SIMPLE      PP  eq_ref  PRIMARY,id  PRIMARY     4   k6064619_lokadok.RDPP.practice_place_id     1   NULL

1 个答案:

答案 0 :(得分:0)

我很抱歉。我应该发布真实的查询。左连接是这样的:

LEFT JOIN ref_doctor_practice_place RDPP ON **ABS(RDPP.doctor_id) = RD.id**

我认为ABS并不重要,所以我将其删除以使其更直接。但实际上这是罪魁祸首。

我的查询没有错。案件结束。感谢任何帮助我的尝试。欣赏它。