SELECT * from `employees` a
LEFT JOIN (SELECT phone1 p1, count(*) c, FROM `employees` GROUP BY phone1) b
ON a.phone1 = b.p1;
Я не уверен, что именно этот запрос имеет проблему. Я получаю ужасную производительность в целом с этой базой данных. В рассматриваемой таблице 120000 строк. Я пробовал этот конкретный запрос удаленно и локально с движками MyISAM и InnoDB, с различными типами объединений, с индексом на телефоне и без него. Я могу заставить это завершиться приблизительно через 4 минуты на таблице 10000 строк успешно, но производительность падает экспоненциально с большими таблицами. Удаленно он потеряет соединение с сервером, а локально поставит мою систему на колени и, кажется, будет работать вечно.
Этот запрос - только маленький шаг, который я пытался сделать, когда больший запрос не мог быть выполнен. Может быть, я должен объяснить весь сценарий. У меня есть одна большая плоская уродливая таблица, в которой перечислены группы людей, их контактная информация и информация о компаниях, в которых они работают. Я пытаюсь нормализовать базу данных и разумно определить, какие номера телефонов относятся к отдельным людям, а какие - к офису. Я рассуждаю так: если номер телефона встречается несколько раз, а количество случаев совпадения совпадает с числом совпадений с указанным адресом, то это должен быть номер офиса. Таким образом, первым шагом является подсчет каждой группы телефонов по номеру телефона. Обычно, если вы просто используете COUNT () ... GROUP BY, он будет перечислять только первую найденную запись в этой группе, поэтому я решил, что мне нужно присоединить полную таблицу к таблице подсчета, где совпадает номер телефона. Это работает, но, как я уже сказал, я не могу успешно завершить его на любой таблице, которая превышает 10 000 строк. Это кажется жалким, и это не похоже на сумасшедший запрос. Есть ли лучший способ добиться того, чего я хочу, или мне нужно разбить мой большой стол на 12 частей или что-то не так с таблицей или БД?
Изменить, чтобы ответить на запрос Роба:
1, 'PRIMARY', 'a', 'ALL', '', '', '', '', 60097, ''
1, 'PRIMARY', '', 'ALL', '', '', '', '', 9363, ''
2, 'DERIVED', 'employees1', 'ALL', '', '', '', '', 60097, 'Using temporary; Using filesort'