Вот вопрос ...
Учитывая мои 192 триллиона записей, какими должны быть мои соображения?
Моя главная забота - скорость.
Вот таблица ...
CREATE TABLE `ref` (
`id` INTEGER(13) AUTO_INCREMENT DEFAULT NOT NULL,
`rel_id` INTEGER(13) NOT NULL,
`p1` INTEGER(13) NOT NULL,
`p2` INTEGER(13) DEFAULT NULL,
`p3` INTEGER(13) DEFAULT NULL,
`s` INTEGER(13) NOT NULL,
`p4` INTEGER(13) DEFAULT NULL,
`p5` INTEGER(13) DEFAULT NULL,
`p6` INTEGER(13) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY (`s`),
KEY (`rel_id`),
KEY (`p3`),
KEY (`p4`)
);
Вот вопросы ...
SELECT id, s FROM ref WHERE red_id="$rel_id" AND p3="$p3" AND p4="$p4"
SELECT rel_id, p1, p2, p3, p4, p5, p6 FROM ref WHERE id="$id"
INSERT INTO rel (rel_id, p1, p2, p3, s, p4, p5, p6)
VALUES ("$rel_id", "$p1", "$p2", "$p3", "$s", "$p4", "$p5", "$p6")
Вот несколько заметок ...
- ВЫБОР будет выполняться гораздо чаще, чем ВСТАВКА. Однако иногда я хочу добавить несколько сотен записей одновременно.
- Что касается нагрузки, то в течение нескольких часов не будет ничего, а может быть, несколько тысяч запросов одновременно.
- Не думаю, что я могу нормализовать больше (нужно, чтобы значения p в комбинации)
- База данных в целом очень реляционная.
- Это будет самая большая таблица на данный момент (следующая по величине - около 900 тыс.)
ОБНОВЛЕНИЕ (08/11/2010)
Интересно, что мне дали второй вариант ...
Вместо 192 триллионов я мог бы хранить 2,6 * 10 ^ 16 (15 нулей, что означает 26 квадриллионов) ...
Но во втором варианте мне нужно будет хранить только один bigint (18) в качестве индекса в таблице. Вот и все - только один столбец. Поэтому я бы просто проверил наличие значения. Время от времени добавляя записи, никогда не удаляя их.
Это заставляет меня думать, что должно быть лучшее решение, чем mysql для простого хранения чисел ...
Учитывая этот второй вариант, я должен взять его или придерживаться первого ...
[edit] Только что получили новости о каком-то тестировании, которое было выполнено - 100 миллионов строк с этой настройкой возвращают запрос за 0,0004 секунды [/ edit]