LINUX.ORG.RU

Что выбрать для первичного ключа в таблице под MySQL

 


0

3

В таблице есть синтетический ключ уникальный для каждой строки, еще в таблице есть три поля которые составляют уникальную комбинацию - натуральный ключ. Два из трех полей натурального ключа это год и месяц и взаимодействие в 99.9999% происходит со строками за текущий месяц, а предыдущие уходят в прошлое, но остаются в этой таблице для «истории». Мне кажется что для целей быстродействия было бы целесообразным сделать первичным ключом натуральный ключ (три поля) что бы кластерное расположение строк нейтрализовало расходы на поиск строк за текущий месяц среди гигантского множества всех строк включая старые за прошедшие месяцы (так ли?). Но. В свою очередь тройной ключ накладывает свои расходы на быстродействие т.к. 1) увеличивается трафик и 2) клиентское ПО должно хранить весь тройной ключ в памяти и каждая GUI таблица должна содержать невидимые колонки с этим большим ключом, это не удобно программировать, но именно первичный ключ необходим для возможности позиционированного обновления (positioned update) т.е. обновления через рекордсет. Господа опытные администраторы БД, взываю к вашему опыту и прошу подсказать какой из этих ключей больше подойдет под первичный, синтетический в одно поле, или составной в три поля. И еще, действительно ли кластеризация по месяцам ускорит поиск по сравнению с кластеризацией по синтетическому AUTO_INCREMENT ключу?

★★★

Я не профи, но не вижу профита делать первичный ключ из 3-х полей. Можно набрость таблицу с тестовыми данными и погонять запросы с explain.

Я бы сделал просто индекс по полям месяц+год. (В постгресе ещ можно было бы partial index по последнему месяцу сделать, чтобы все летало).

pi11 ★★★★★
()
Ответ на: комментарий от quest

Иди в баню, ты достал уже со своим постгресом. После твоих не в тему коментариев меньше всего хочется постгреса.

normann ★★★
() автор топика

В свою очередь тройной ключ накладывает свои расходы на быстродействие т.к. 1) увеличивается трафик
1) увеличивается трафик

WAT?

kiotoze ★★★★
()
Ответ на: комментарий от quest

Ставим postgres ииспользуем наследование таблиц

Убер тоже сначала поставили postgres, потом поплевались и теперь мигрируют на MySQL.

Не повторяйте ошибок убера, у них хотя бы есть деньги их исправить, а у вас?



Я бы использовал стандартный инкрементный ключ + индекс на дату, но все сильно зависит от ваших запросов, одну и ту же выборку можно получить 100500 разными способами с индексами и без.

BaBL ★★★★★
()
Последнее исправление: BaBL (всего исправлений: 1)

Поделюсь своим опытом, не утверждаю что вам тоже подойдет:

1) пара {месяц,год} была замена на номер месяца, начиная с января 2000. В обе стороны конвертируется легко, а поле одно

2) таблица была разделена на две части. В одной только текущий месяц, во второй весь архив. Секционирование для бедных.

German_1984 ★★
()
Ответ на: комментарий от normann

После твоих не в тему коментариев меньше всего хочется постгреса.

Что-ж конкретно вы можете использовать mysql вместо базы данных, CVS вместо Git ну и так далее. Мужайтесь и не сворачивайте!

quest ★★★★
()
Ответ на: комментарий от BaBL

Убер тоже сначала поставили postgres, потом поплевались и теперь мигрируют на MySQL.

Смеялись всем офисом)))

Не повторяйте ошибок убера, у них хотя бы есть деньги их исправить, а у вас?

Так расскажите же скорее какие они допустили ошибки при выборе PostgresQL?

quest ★★★★
()
Ответ на: комментарий от BaBL

Мигрируют на самописную NoSQL СУБД на основе мускулопараши*

Кстати, ты уверен, что у ОПа нагрузки уровня убера?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от BaBL

Не повторяйте ошибок убера

Сразу используйте постгрес чтобы потом не ебаца с миграциями.

ritsufag ★★★★★
()

Щас предложу. Тут конечно набегут. Но я всеравно предложу. Смысл в этом есть.

Тебе надо копаться выборками за «текущий» месяц. Никто тебе не запрещает генерировать при вставке значение для автоинкрементного поля. И никто не запрещает делать его разреженным, с пропусками. Ну вот возьми и впили там BIGINT(20) UNSIGNED AUTOINCREMENT пусть сам все индексирует. А при вставке новой записи кроме реальных датэтайм или таймстамп генерируй значение автоинкр ключа вида yyyymmddhhmmssuu и няхай вставляет. Выборку будешь делать так: WHERE id BETWEEN yyyymm0000000000 AND yyyymm0000000000

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от pi11

Тем что в одном поле и сразу упорядочено искаропки, на самом низком уровне, а не надстройками. Но я осознаю что это все пованивает. И я так не делал, нужны тесты как минимум.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Это не будет быстрее. Максимум с такой же скоростью работать будет. Никакой это не самый низкий уровень, обычный индекс. А вот программно это лишний геморой.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

Не программно, а «паттерново», т.к. лабаться будет на какойнить готовой CRUD/AR хренатени. Гемор только отсюда.

deep-purple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.