Здравствуйте, подскажите как реализовать структуру данных когда только один пользователь использует только свои данные. Например есть список дел id, datetime, text. Почти каждый раз datetime будет изменяться и выборка будет происходить по нему. Самый простой вариант сделать одну таблицу на 4 колонки: id, user_id, datetime, text при этом создать индекс по user_id и datetime. Но раз datetime почти при каждой выборки будет меняться значит и индекс пересчитается. Подозреваю такая реализация будет медленной. Подскажите в какую сторону смотреть и можно ли сделать лучше. Пользователей будет примерно 10,000 и для каждого со временем 1000-2000 записей. upd: нашел секционирование, может кто работал с mysql partition
Менять будет пользователь почти каждый раз как прочитает одну строку своих данных. Индекс после каждого изменения пересчитываться, по этому решил что решение в лоб будет медленным. На счёт индекса, думаю что user_id поможет снизить время поиска, чтобы не затрагивать других пользователей, ихние данные ему не когда не понадобятся.
тебе надо делать выборку по задачам? добавь флаг какойнить типа "закрыта, завершена" и отсеивай большую часть по этому критерию.
Вот есть база: Код (Text): CREATE TABLE IF NOT EXISTS `listtest` ( `id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `dt` datetime NOT NULL, `utext` text NOT NULL, KEY `uid` (`user_id`,`dt`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 Самые ходовые запросы Код (Text): SELECT * FROM `listtest` WHERE `user_id` = '1' AND `dt` > NOW() LIMIT 1; UPDATE `listtest` SET `dt` = NOW() WHERE `id` = '1' LIMIT 1; Эти два запроса идут друг за другом от каждого пользователя в интервале 1-30 минут. Тут я вижу узкое место: пересчёт индекса при каждом обновлении. Все данные нужны и пометить "закрыта" нет смысла, просто список сортируется по дате. Думаю тут подходит очередь сообщений, но для начала хотелось бы сделать на mysql. По этому и спрашиваю, можно ли сделать как-то лучше.
Ты ж выбираешь всё время только одну запись. С остальными что происходит, когда у юзера появляется новая запись? Насчет быстродействия. Попробуй и узнаешь. Я думаю всё будет хорошо работать.
Да выборка идёт по одной, но пользователей много и хотел что-то придумать, чтобы они не мешали друг другу. Новая запись попадает по ситуации так как dt NOW() обычно в начало списка.
Они в конец очереди переходят. Всего при 20,000 записей на update уходит 0,01 сек и это всего в один поток.
Да старые нужны, они почти по кругу используются. Убрал индекс по (user_id, dt) и стало в ~2-3 раза быстрее для update
Да, один пользователь смотрит свои данные по одной записи, потом их изменяет (время, на пару дней вперёд) и так дальше.
почему тогда только одну выбираешь? как он может добраться до других, если ты всегда выбираешь только самую последнюю по сроку? =) я нифига не понял, но задавание такого числа одинаковых вопросов и твоё партизанское настроение отбивают всякую охоту помогать =) чесслово. клещами тянуть информацию приходится. за такое деньги плотют.
Это видимо недопонимание. Я думал что выложу схему и запросы и этого будет достаточно. Выбираю самую последнию потому что такой запрос SELECT * FROM `listtest` WHERE `user_id` = '1' AND `dt` > NOW() LIMIT 1; нужна одна запись и самая последняя. Похоже я допустил ошибку логическую, до других может добраться, вместо NOW() будет подставлена другая дата. В теории узкое место было при UPDATE `listtest` SET `dt` = NOW() WHERE `id` = '1' LIMIT 1; был индекс по user_id и dt я его убрал и update стал быстрее работать. При всего 20,000 записей update занимает ~0,005 сек. Так как в базах я не очень разбираюсь, вот и хотел узнать, сделал ли я всё что мог или всё таки есть вариант как ускорить работу этих запросов. На счёт денег, я компенсирую ответами в других темах
Я так и не понял нафига другие и как они возвращаются в работу. Добавлено спустя 23 секунды: Короче делай как считаешь нужным