За последние 24 часа нас посетили 9256 программистов и 459 роботов. Сейчас ищут 85 программистов ...

Партиционирование таблиц

Тема в разделе "MySQL", создана пользователем justc, 1 сен 2020.

  1. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    123
    Симпатии:
    0
    Добрый день!

    Есть таблица со статьями, хочу разбить ее на разделы.

    Как я понял, разбить таблицу можно только по первичному ключу? у меня первичный ключ это "id".
    Но я хочу разбить по полю "date" (unixtime).

    1. Объясните новичку, что значит
    "Таблица может иметь только один первичный ключ, который может состоять из одного или нескольких полей."

    я добавил date в первичный ключ вторым полем (я так понимаю), но в чем прикол?
    ADD PRIMARY KEY (`id`, `date`)

    просто date же не уникальное поле, и в чём вообще смысл нескольких полей?

    вообщем, разбить получилось, как-то так:

    Код (Text):
    1.  
    2. ALTER TABLE stats PARTITION BY RANGE(YEAR(date))(
    3.      PARTITION t_08    VALUES LESS THAN(2008),
    4.      PARTITION t_09    VALUES LESS THAN(2009),
    5.      PARTITION t_now VALUES LESS THAN(MAXVALUE)
    6. );
    только на локалке чет ошибку выдало на YEAR пришлось с unixtime работать

    вопросы:

    2. Действительно быстродействие возрастает? По логике, это гениально))
    у меня myisam

    3. работа с БД абсолютно не меняется? запросы переписывать не нужно и тп?
    можно импортировать в таблицу материал без дополнительных ухищрений?
    он сам "раскидается" в нужные разделы?

    экспорт/импорт/резервное копирование всё как обычно?
     
  2. Drunkenmunky

    Drunkenmunky Новичок

    С нами с:
    12 авг 2020
    Сообщения:
    220
    Симпатии:
    36
    Уникальный ключ был 123, теперь он 1232007-06-20 15:24:00
    Другой уникальный ключ - 1232007-06-20 15:24:01
     
  3. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    123
    Симпатии:
    0
    @Drunkenmunky а в чем смысл? если 123 итак было уникальным? Или иногда так сделать не получается? типа, чтобы улучшить уникальность?
    --- Добавлено ---
    Если на рабочей БД добавить второе поле date? никаких последствий?
    просто изменится значения первичного ключа у всех записей в таблице?
     
  4. Drunkenmunky

    Drunkenmunky Новичок

    С нами с:
    12 авг 2020
    Сообщения:
    220
    Симпатии:
    36
    123 теперь не уникальный ключ. А в сочетании с датой уникальный.
    Смысл в том, что у некоторой уникальной записи в одной таблице есть уникальные свойства в другой таблице. И их может быть больше, чем одно.
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.503
    Симпатии:
    473
    Адрес:
    Татарстан
    раз вы по году партционируете, то наверное вам и ключ надо по году
    ADD PRIMARY KEY (`id`, YEAR(date))
     
  6. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    123
    Симпатии:
    0
    @ADSoft вылетела ошибка, что-то типа нет такого поля YEAR(date)
    да ладно, это не суть, буду писать VALUES LESS THAN(1598950124)

    мне больше другие вопросы интересуют

    @Drunkenmunky видать мне это образно никак не понять)) если столкнусь сам, то тогда и дойдет)) для чего это и зачем применять
    если конечно вам не лень на пальцах мне объяснить)) типа вот таблицы test1 и test2... )) но я не настаиваю

    касательно партиционирования, если для партиционирования я добавлю второе поле date в первичный ключ, на рабочем сайте, это как-то отразится на его работе? или ничего не изменится

    и по поводу 2 и 3 вопроса, я понимаю они очевидные, но очень хочется услышать мнение людей кто на практике всё это использует, есть ли подводные камни и тп
    --- Добавлено ---
    пардон, это мой косяк, но все равно выдает ошибку синтаксиса
     
    #6 justc, 1 сен 2020
    Последнее редактирование: 1 сен 2020
  7. Drunkenmunky

    Drunkenmunky Новичок

    С нами с:
    12 авг 2020
    Сообщения:
    220
    Симпатии:
    36
    Вспомнил тут вам простой пример.
    Допустим у вас есть директории /usr/home/local/dir/ и /usr/home/local/dir1/
    Присваиваете им уникальный id в таблице `t1`
    А в таблице `t2` храните список файлов в них. И id директории.
    Имена файлов, само собой так же должны быть уникальны.
    Но вам периодически их нужно сортировать по расширению.
    Для этого можно применять сложные манипуляции, а можно просто заранее разбить их на имя и расширение, и уникальный индекс применить к этим трем полям.
    При добавлении в таблицу `t2` строки 123, 'index','html', дублирование записи не произойдет.