2013-04-03 3 views
1

В запросе ниже выполняются запросы, которые клиент сделал раньше, и получают правильные результаты. В любом случае, запрос должен быть как можно быстрее. Во время тестирования я понял, где предложение замедляет запрос. Хок можно решить эту проблему?Где предложение замедляет запрос

SELECT 
customerselections.customer_id, 
customerselections.selectedcompany_id, 
companycampaigns.*, 
companies.company_logo 
FROM customerselections 

INNER JOIN companycampaigns ON companycampaigns.company_id=customerselections.selectedcompany_id 
INNER JOIN companies ON companies.company_id=customerselections.selectedcompany_id 

WHERE customerselections.customer_id='$customerid' LIMIT $offset,$limit 

UPDATE: объяснить результаты

отборы клиентов:

id select_type table type possible_keys key key_len ref rows  Extra 
1 SIMPLE customerselections ALL NULL NULL NULL NULL 12799999 

companycampaigns

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE companycampaigns ALL NULL NULL NULL NULL 2000000 

Компании

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE companies ALL NULL NULL NULL NULL 2039500  

QUERY EXPLAIN

|id|select_type | table | type | possible_keys  |   key | key_len | ref | rows | Extra | 

|1|SIMPLE | customerselections | ref | selectedcompany_id,customer_id | customer_id | 4 | const | 2 9 | | 

|1|SIMPLE| companycampaigns | ref | company_id | company_id | 4 | viptrio.customerselections.selectedcompany_id | 1 | | 

|1|SIMPLE| companies | eq_ref | PRIMARY | PRIMARY | 4 | viptrio.customerselections.selectedcompany_id |1 | | 

UPDATE

CREATE TABLE IF NOT EXISTS `companies` (
    `company_id` int(11) NOT NULL auto_increment, 
    `company_customerid` int(11) default NULL, 
    `company_name` tinytext NOT NULL, 
    `company_description` tinytext, 
    `company_email` tinytext NOT NULL, 
    `company_website` tinytext, 
    `company_gsm` tinytext, 
    `company_landline` tinytext, 
    `company_fax` tinytext, 
    `company_address` tinytext, 
    `company_contactperson` tinytext, 
    `company_businessid` smallint(11) NOT NULL, 
    `company_cityid` smallint(5) NOT NULL, 
    `company_countrycode` char(3) NOT NULL, 
    `company_refnum` tinytext, 
    `company_regdate` tinytext NOT NULL, 
    `company_logo` tinytext, 
    `company_keyword` tinytext, 
    PRIMARY KEY (`company_id`), 
    KEY `company_cityid` (`company_cityid`), 
    KEY `company_countrycode` (`company_countrycode`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2039501 ; 



CREATE TABLE IF NOT EXISTS `companycampaigns` (
`campaign_id` int(11) NOT NULL auto_increment, 
`company_id` int(11) NOT NULL, 
`campaign_title` varchar(40) NOT NULL, 
`campaign_detail` mediumtext NOT NULL, 
`campaign_startdate` tinytext, 
`campaign_enddate` tinytext, 
`published` tinyint(1) NOT NULL default '0', 
PRIMARY KEY (`campaign_id`), 
KEY `company_id` (`company_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2000001 ; 



    CREATE TABLE IF NOT EXISTS `customerselections` (
    `selection_id` int(11) NOT NULL auto_increment, 
    `customer_id` int(11) NOT NULL, 
`selectedcompany_id` int(11) NOT NULL, 
    PRIMARY KEY (`selection_id`), 
    KEY `selectedcompany_id` (`selectedcompany_id`), 
    KEY `customer_id` (`customer_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=12800006 ; 
+0

Он медленный даже без предложения? – DevelopmentIsMyPassion

+0

@ АшРева: намного быстрее. С предложением «where» он занимает около 0,30, без него время запроса составляет около 0,15 – mustafa

+0

. Попробуйте добавить предложение where в первом предложении 'ON'' FROM customerslections INNER JOIN companycampaigns ON customerselections.customer_id = '$ customerid 'AND companycampaigns.company_id = customerselections.selectedcompany_id INNER JOIN компании ON companies.company_id = customerselections.selectedcompany_id LIMIT $ offset, $ limit' Надеюсь, это поможет. – Meherzad

ответ

0

Попробуйте (с индексом на Customer_ID):

SELECT t1.customer_id, t1.selectedcompany_id, 
     cc.*, c.company_logo 
FROM (SELECT customer_id, selectedcompany_id, 
     FROM customerselections 
     WHERE customer_id='$customerid') AS t1 
INNER JOIN companycampaigns cc ON cc.company_id = t1.selectedcompany_id 
INNER JOIN companies c ON c.company_id = t1.selectedcompany_id 
LIMIT $offset, $limit 

Я предпочитаю использовать псевдоним таблицы, чтобы сделать запросы более читабельными.

+0

Он выдает синтаксическую ошибку: синтаксис для использования рядом с 'FROM customerselections) WHERE customer_id =' 2 ') – mustafa

+0

Извините, у вас была слишком близкая скобка. Починил это. Можете ли вы попробовать сейчас? –

+0

Показывает синтаксическую ошибку. – mustafa

0

вы можете попробовать ниже

SELECT * FROM

(SELECT * FROM customerselections WHERE customer_id = '$ CUSTOMERID'), как сСт Внутреннее объединение companycampaigns cc ON cc.company_id = cs.selectedcompany_id
INNER JOIN компании с ON c.company_id = cs.selectedcompany_id LIMIT $ офсет, $ предел

+0

, который дает синтаксическую ошибку. «синтаксис для использования рядом с« FROM customer_id = «14335»), так как cs INNER присоединяется к companycampaigns cc ON cc.company_id «в строке 2» – mustafa

+0

Я сделал несколько модификаций, пожалуйста, попробуйте еще раз – shola

+0

в два раза медленнее, чем запрос OP. – mustafa

0

попробовать это:.

SELECT '$ CUSTOMERID', сс *, c.logo ИЗ companycampaigns куб.см INNER JOIN компании с ON c.company_id = cc.company_id где c.company_id в (SELECT selectedcompany_id FROM customerselections FROM customer_id = '$ CUSTOMERID') LIMIT $ офсет, $ предел

+0

qshola: этот запрос занимает «секунды», смертельно медленный. – mustafa

0

Смотрит на меня как `customerselections`.`customer_id` является int, но вы пытаетесь сделать:

WHERE customerselections.customer_id='$customerid'

который бы сравнить его в строку. Вы пробовали:

WHERE customerselections.customer_id = $customerid.

+0

yes "customer_id" - INT. Я попробовал ваше предложение. Не повезло. – mustafa