SQL - первичный ключ, кластерный индекс, автоинкремент - PullRequest
2 голосов
/ 14 марта 2012

Мой веб-сайт отображает сообщения по дате, хотя таблица SQL упорядочена по идентификатору. Поскольку порядок идентификатора не всегда совпадает с порядком DATE, я запускаю запрос с ORDER BY 'DATE'.

Пример таблицы SQL:

----------------------------
| ID | DATE                |
----------------------------
| 1  | 2011-10-20 00:00:00 | 
| 2  | 2012-10-20 00:00:00 |
| 3  | 2010-10-20 00:00:00 |
| 4  | 2011-09-20 00:00:00 |
----------------------------

To query I use: SELECT * FROM `table` ORDER BY 'DATE';

Мои вопросы:

  1. Повысит ли производительность запроса, если индекс кластера или первичный ключ таблицы будет столбцом DATE?

  2. Возможно ли автоматическое увеличение столбца идентификатора, если он не является первичным ключом?

То, что я хочу сделать, - это сделать запрос как можно быстрее (что, я думаю, было бы возможно, сделав DATE индексом кластера или первичным ключом), но также позволить каждому сообщению иметь уникальный идентификатор автоинкремента. Я пытался сделать DATE первичным ключом, но получил сообщение об ошибке: «может быть только один автоматический столбец, и он должен быть определен как ключ».

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Я бы не определял дату как первичный ключ, а скорее добавил бы индекс в поле.Уникальный, если нужно.Я полагаю, что возможно иметь автоинкремент в поле не первичного ключа, но попытка сделать это самостоятельно даст вам лучший ответ!

<- EDIT ->

Чтобы ответить на ваш комментарийвопрос, я не могу сказать, что это ПЛОХАЯ идея, но даты всегда придирчивы.На этот раз вы должны решить, будете ли вы использовать UTC или местную дату, просмотреть, как летнее время влияет на вашу программу, предвидеть, будет ли необходимость обновления даты в какой-то момент жизни приложения, и тому подобное.Я скорее забываю об этом и просто использую уникальный автоматически сгенерированный ключ.Если вы выберете дату как PK, вы можете использовать метку времени и избежать второго столбца последовательности.

Я нашел дополнительную информацию о датах в качестве первичных ключей на techtarget.com и made2mentor.com .

0 голосов
/ 09 августа 2013

Хорошо для индексов, если входящие в него значения неупорядочены.Не обязательно, но приятно.Поскольку они являются деревьями, если индекс представляет собой только столбец автоинкремента, вы получаете несбалансированное дерево с самого начала, каждый раз, когда вы перебликуете индекс, вы гарантированно всегда получаете несбалансированный при добавлении новых данных, поскольку они будут добавляться только к одному листу.дерева (до тех пор, пока страница индекса не заполнится).

Для кластеризованных индексов в полях с автоинкрементом (первичные ключи которых по умолчанию используются в Sybase, MS SQL и, вероятно, во всем остальном), вероятно, хорошей идеей будетделать сравнительно частые перестройки индексаМоя философия - кластеризация на наиболее распространенном сканировании.Таким образом, я мог бы установить свой первичный ключ в столбце ID, но я бы кластеризовал на DATE, поэтому, когда я делаю что-то вроде выбора Date from table where или select ... order by Date, запрос будет сканировать последовательные элементы в процессе чтения страниц.с диска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...