2015-05-26 5 views
-1

Я использую python2.7 и mysql5.5 на debian.mysql join query take too many resources

С помощью этого запроса использования MySQL 100% CPU:

mysql> SHOW FULL PROCESSLIST; 
+-----+------------------+-----------------+---------+---------+------+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Id | User    | Host   | db  | Command | Time | State  | Info                                                   | 
+-----+------------------+-----------------+---------+---------+------+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| 253 | whitewall  | localhost:39377 | mailing | Query | 4 | Sending data | 
SELECT 
    contacts.ID, 
    contacts.RATING, 
    mails.MANDRILL_ID 
FROM contacts 
    LEFT JOIN mails 
     ON mails.CONTACT_ID = contacts.ID 
HAVING mails.MANDRILL_ID = 'fea4b3b036b44655a7e24121ac359d0a' | 

Любые намеки на то, что может быть неправильно?

+1

Я не вижу запроса, просто некоторые случайные строки кода. – Strawberry

+1

Где ваша агрегирующая функция? (и остальная часть запроса, tbh) – konart

+0

Как это точно относится к Python? –

ответ

1

Вот правильный способ написать запрос:

SELECT c.ID, c.RATING, c.MANDRILL_ID 
FROM contacts c JOIN 
    mails m 
    ON m.CONTACT_ID = c.ID 
WHERE m.MANDRILL_ID = 'fea4b3b036b44655a7e24121ac359d0a'; 

производительности, вы хотите следующие показатели: mails(mandrill_id, contact_id) и contacts(id) (Вы, наверное, последний).

Примечания:

  • left join был превращается в join в любом случае условием на mails.
  • Статья having должна действительно использоваться в основном с group by. У MySQL есть расширение, но оно вам не нужно. Используйте where.
  • Использование having, вероятно, помешало оптимизатору выбрать лучший путь оптимизации.
  • Табличные псевдонимы облегчают запись и чтение.
1

Изменить HAVINGWHERE.

Ваш запрос в соответствии с этим списком процессов предоставляет набор результатов вашему клиенту (вашей программе python). Редко можно увидеть запрос в этом состоянии, если набор результатов не очень велик.

Ваш запрос, как написано, возвращает каждую строку в вашей таблице contacts вашей программе python. Если вы хотите вернуть только строку contacts, относящуюся к строке mails с MANDRILL_ID = 'fea4b3b036b44655a7e24121ac359d0a', измените ваш LEFT JOIN на JOIN.