Упорядочение по RAND () для ОГРОМНОЙ таблицы приводит к сбою в MySQL. Зачем? - PullRequest
1 голос
/ 09 ноября 2010

Добрый день, друзья. Я использую Fedora 13 на 32-битной машине.

У меня есть огромная таблица IP-адресов 1,5 Б (которая будет разделена, когда у меня будут ресурсы, не волнуйтесь;)). Когда я запускаю этот запрос:

SELECT ip FROM ips ORDER BY RAND() LIMIT 500000;

Иногда происходит сбой таблицы (я получаю сообщение об ошибке «MySQL Table помечен как разбитый и должен быть восстановлен»), иногда это не так. Мой вопрос Что может привести к сбою таблиц MyISAM или InnoDB? Память влияет? Поскольку мой системный монитор показывает, что он использует только около 30%.

Вот my.cnf (по умолчанию, установка из метапакета):

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Также; Я слышал, что PostGreSQL «более надежен» и не падает, как MySQL в этих ситуациях. Это правда или история о женах?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Сортировка 1500M IP-адресов - не лучшая идея.

Если вы хотите 500K случайные IP-адреса, используйте этот подход:

Это также не будет слишком эффективным, поскольку для этого нужно два прохода по столу.

Вы можете поставить приблизительную оценку COUNT(*) вместо подзапроса. Это ускорит запрос, за счет небольшой возможности пропустить некоторые адреса или получить меньше результатов, чем необходимо.

1 голос
/ 09 ноября 2010

упорядочение по rand () вызовет временную таблицу с сортировкой файлов, я подозреваю, что сбой таблицы вызван ограничением памяти. Вы можете попробовать настроить свой conf-файл так, чтобы mysql использовал больше памяти для временных таблиц и сортировочных буферов.

...