| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > Эффективный алгоритм выборки данных |
| Автор: AGENTxXx 10.4.2014, 13:02 |
| Добрый день, уважаемые форумчане! Нужен Ваш совет! Задача следующая: В таблице authors хранятся авторы. У каждого автора есть значение accuracy. Нужны только такие авторы, у которых accuracy > 2. Через php мы получаем множество различных авторов со своими сообщениями. И нам необходимо проверить, если у этого автора accuracy > 2, то мы должны записать его сообщение, а если меньше - то не должны. Если автора нет, то мы добавляем его в таблицу с accuracy = 1. Сам я вижу 2 алгоритма: 1 вариант) Загружаем в ассоциативный массив всех авторов и проверяем каждое сообщение на то, есть ли в ключах данного массива этот автор. Но тут проблема в том, что в настоящее время у меня 4000 целевых авторов. А через пару месяцев их может быть уже 50000. И я думаю, не слишком ли будет много памяти жрать данный массив; 2 вариант) Я сохраняю все записи в таблицу. И после того, как все записи сохранились я запускаю сложный запрос DELETE, который будет проверять, что если у автора accuracy <= 2, то удалить его сообщение. Но тут не эффективность в том, что я трачу время на запись так сказать "ненужных" данных в таблицу. Надеюсь объяснил нормально и меня смогут понять. |
| Автор: Akina 10.4.2014, 14:34 |
| Первым этапом следует ВСЕ данные записать во временную таблицу на сервере. Обычный CREATE TEMPORARY TABLE ... SELECT ... Вторым - выполнить добавление в таблицу авторов всех, кого там нет. Обычный INSERT INTO ... SELECT ... Третьим - выполнить добавление сообщений в таблицу сообщений. Обычный INSERT INTO ... SELECT ... Все три запроса следует выполнять в одном connection. Любая обработка на клиенте - ересь. За исключением одного случая - бОльшая часть сообщений написана авторами с accuracy = 1. Если же данных очень много, они структурированы (CSV), и имеется возможность загрузить файл с данными на MySQL-сервер (скажем, по FTP) - лучше передать данные именно так, и на первом этапе использовать CREATE TEMPORARY TABLE + LOAD DATA INFILE. |
| Автор: AGENTxXx 10.4.2014, 18:19 |
| Спасибо за совет! Думаю что так и сделаю (через временную таблицу) |