MySQL неправильный файл ключей для tmp таблицы при создании нескольких соединений

Я часто не приезжаю сюда для справки, но я довольно расстроен этим, и я надеюсь, что кто-то встретился с нею прежде.

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

#126 - Incorrect key file for table '/tmp/#sql_64d_0.MYI'; try to repair it

Таким образом, этот запрос произведет ошибку:

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

Но этот не будет:

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

И ни один не будет этот:

SELECT * FROM `core_username`
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

Что могло вызывать это? Я действительно не знаю, как пойти о восстановлении tmp таблицы, но я действительно не думаю, что это - проблема, как это - новая tmp таблица каждый раз. Таблица имени пользователя является довольно большой (233 718 записей прямо сейчас), но я сомневаюсь, что это имеет какое-либо отношение к ней.

Любая справка очень ценилась бы.

ОБНОВЛЕНИЕ: После некоторого дальнейшего тестирования кажется, что ошибка только происходит, когда я пытаюсь заказать результаты. Таким образом, этот запрос даст мне, что я ожидаю:

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
LIMIT 1

Но если я добавляю:

ORDER BY `core_username`.`name` ASC

Ошибка инициирована. Это только происходит на определенном веб-сервере, который я в настоящее время использую. Если я загружаю базу данных и пробую то же самое на моем localhost, а также других серверах, это хорошо работает. Версия MySQL 5.0.77.

Знание этого, я довольно уверен, что то, что происходит, - то, что tmp составленная таблица является слишком большой и дроссели MySQL, как описано в этом сообщении в блоге. Я все еще не уверен, каково решение было бы, хотя...

57
задан OMG Ponies 5 May 2011 в 23:24
поделиться

4 ответа

Индексные ключи для одной из 3 таблиц могут быть плохими, попробуйте запустить команду восстановления на всех 3 таблицах.

-1
ответ дан 24 November 2019 в 19:25
поделиться

Запустите это

REPAIR TABLE `core_username`,`core_site`,`core_person`;

или сделать это:

select * from (
 SELECT * FROM `core_username`
 INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
 INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
 LIMIT 1)
ORDER BY `name` ASC
6
ответ дан 24 November 2019 в 19:25
поделиться

Использование ключевого слова EXPLAIN может помочь выяснить, как лучше всего оптимизировать этот запрос. По сути, вам нужно как можно быстрее получить как можно меньший набор результатов. Если у вас есть набор результатов каждой строки в core_username до конца, когда вы его заказываете, вы рискуете ... this.

Если вы можете без проблем выполнить упорядочивание только для core_username, вы можете получить строку min () как подзапрос.

-1
ответ дан 24 November 2019 в 19:25
поделиться

Проверьте свободное место в MySQL tmpdir (/tmp в вашем случае) во время выполнения запросов, так как при работе с большими таблицами он может съедать сотни мегабайт. У меня сработало что-то вроде этого:

$ while true; do df -h /tmp; sleep .5; done
20
ответ дан 24 November 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: