Я часто не приезжаю сюда для справки, но я довольно расстроен этим, и я надеюсь, что кто-то встретился с нею прежде.
Каждый раз, когда я пытаюсь выбрать записи от таблицы с помощью больше чем одного соединения, я получаю эту ошибку:
#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, как описано в этом сообщении в блоге. Я все еще не уверен, каково решение было бы, хотя...
Индексные ключи для одной из 3 таблиц могут быть плохими, попробуйте запустить команду восстановления на всех 3 таблицах.
Запустите это
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
Использование ключевого слова EXPLAIN может помочь выяснить, как лучше всего оптимизировать этот запрос. По сути, вам нужно как можно быстрее получить как можно меньший набор результатов. Если у вас есть набор результатов каждой строки в core_username до конца, когда вы его заказываете, вы рискуете ... this.
Если вы можете без проблем выполнить упорядочивание только для core_username, вы можете получить строку min () как подзапрос.
Проверьте свободное место в MySQL tmpdir (/tmp в вашем случае) во время выполнения запросов, так как при работе с большими таблицами он может съедать сотни мегабайт. У меня сработало что-то вроде этого:
$ while true; do df -h /tmp; sleep .5; done