简体   繁体   中英

MYSQL: Left Join is very slow

I'm using MySQl for my database and I have three tables where I want to join them using left join but the performance are very slow.

Below are the tables:

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 ;

My query is like this:

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

Can anyone help me about this? Many thanks.

As requested by Strawberry, here I put the result of using 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

I'm sorry guys. I should have posted the real query. The left join acutally is like this:

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

I thought the ABS didn't really matter so I erase it to make it more straight forward. But actually this is the culprit.

Nothing wrong with my query. So case close. Thanks for any attempt to help me. Appreciate it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM