Проблема возникла при выполнении простого SQL-запроса через PhpMyAdmin. - PullRequest
1 голос
/ 27 июня 2011

Я создал базу данных и две таблицы customer_full и customer_change через PhpMyAdmin. Я успешно заполнил две таблицы из двух текстовых файлов, теперь customer_full содержит 12902 строки, в то время как customer_change содержит 12947 строк, и каждая строка имеет поле CUSTOMER_ID для идентификации каждого клиента. В таблице customer_change есть несколько новых членов, которых нет в customer_full, и я хочу захватить их.

Задача, которую мне нужно выполнить, очень распространена, мне нужно получить строки, которые существуют только в таблице customer_change, но не существуют в таблице customer_full, поэтому я написал и выполнил следующий запрос:

SELECT * FROM customer_change 
LEFT JOIN customer_full ON customer_change.CUSTOMER_ID = customer_full.ID 
WHERE customer_full.ID IS NULL

Похоже, что после того, как я отправлю запрос в PhpMyAdmin, он всегда останется в «ожидании http://localhost/phpmyadmin/import.php"» и в конечном итоге окажется ошибкой тайм-аута. Однако, если я выполню какой-нибудь простой запрос, такой как

SELECT * FROM customer_change,customer_full

Это сработает и вернет результат, просто соединив каждую запись из двух таблиц. Поэтому мне интересно, могут ли какие-либо эксперты помочь мне отладить, может быть, у моего запроса есть проблема с эффективностью, или я должен сделать дополнительную проверку конфигурации PhpMyAdmin? Или могут быть какие-то другие возможные причины, по которым мой предыдущий запрос не удался?

Прошу прощения, если это просто, так как я только начал самообучаться MySql. Заранее спасибо за помощь.

1 Ответ

2 голосов
/ 27 июня 2011

Это:

SELECT * FROM customer_change,customer_full  

Является перекрестным соединением, оно объединяет каждую строку в таблице customer_change с каждой строкой в ​​customer_full. Таким образом, возвращается 12 902 x 12 947 = 167 042 194 строки. Понятия не имею, зачем вам это нужно.

Левое соединение, которое вы написали, выглядит правильно:

SELECT * FROM customer_change 
LEFT JOIN customer_full ON customer_change.CUSTOMER_ID = customer_full.ID 
WHERE customer_full.ID IS NULL

Отсутствует индекс
Чтобы он работал быстро, вам нужно поместить индекс в customer_change.CUSTOMER_ID и индекс в customer_full.ID.
Как только вы это сделаете, он должен запуститься мгновенно.

Поврежденные таблицы
Также возможно, что ваши таблицы повреждены; особенно если вы используете MyISAM.
Попробуйте выполнить шаг, описанный в этой ссылке:
http://dev.mysql.com/doc/refman/5.0/en/corrupted-myisam-tables.html
Или по этой ссылке: http://www.thegeekstuff.com/2008/09/how-to-repair-corrupted-mysql-tables-using-myisamchk/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...