[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как верно работать с Партициями? Объясните
inpost
Собственно собираюсь для другой таблицы реализовать партиции. Объем таблицы сейчас 20гб, всего таблицы около 40 гигов, памяти пока на сервере 30гигов, но скоро будет выделено на MySQL 60-70 гигов через пару дней. Пока ожидаю, есть время уточнить некоторые детали.

Таблица:
`id` (autoincrement для уникальности записей),
`id_parent` (связь с таблицей другой),
`date`,
`ban` (заблокирована ли запись),
`text`


1) Тут сказано http://www.slideshare.net/datacharmer/mysq...itions-tutorial что таблица с партициями весит на 20-25% больше (на странице 77). Это правда?

2) 99% на таблицу приходится по полю id_parent, отсюда на него смело можно вешать партицию по этому полю. Как тогда должен выглядеть индекс?
Я правильно понимаю, я должен создать составной PK по `id_parent` + `id` , на id повесить auto-increment, а на id_parent партицию?

Решение: делается составной индекс

3) У меня есть очень редкий случай, когда идёт запрос к `ban`. Примерно на 50 млн. записей будет около 50-100 записей заблокированных для модерации. Я тут думаю вообще отказаться от индекса по этому полю, а вместо этого создать отдельную таблицу с забаненными записями, в которой будет содержаться ID записи. Корректно я рассуждаю?
Решение: отдельная таблица

4) Теперь я хочу удалить запись, раньше я писал:
<pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">DELETE FROM
<span class="sh_att">`table`</span> <span class="sh_keyword">WHERE</span> <span class="sh_att">`id`</span> <span class="sh_symbol">=</span> <span class="sh_number">1</span></pre>
Теперь с учетом партиции я должен первым указывать либо партицию, либо поле, по которой идёт партиция. Учесть это логичнее предположить, что этот запрос:
<pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">DELETE FROM</span> <span class="sh_att">`table`</span> <span class="sh_keyword">WHERE</span> <span class="sh_att">`id_parent`</span> <span class="sh_symbol">=</span> <span class="sh_number">100</span> <span class="sh_keyword">AND</span> <span class="sh_att">`id`</span> <span class="sh_symbol">=</span> <span class="sh_number">1</span></pre>
Лучше заменить так, чтобы имя партиции генерировал PHP (запрос же определяется там), а сам запрос писал бы:
<pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">DELETE FROM</span> <span class="sh_att">`table`</span> PARTITION <span class="sh_att">`p1`</span> <span class="sh_keyword">WHERE</span> <span class="sh_att">`id`</span> <span class="sh_symbol">=</span> <span class="sh_number">1</span></pre>
Я правильно понимаю, что это было бы правильнее и оптимальнее?</span>
Решение: что-то я реально протупил. WHERE `id` = 1 не будет по PK, а id_parent+id = по PK.

5) Допустим мне необходимо будет создать запрос к ТОЛЬКО полю `ban`. Я для этого создам индекс по полю `ban` . Партиции не нанесут вреда запросам, которые идут за пределами этих самых партиций? Первый раз использую партиции и боюсь их применить, ведь вдруг мне понадобится сделать запрос:
SELECT *
FROM `table`
WHERE `ban` = 1

Хотя мне и кажется этот вопрос глупым, всё из-за того, что я не понимаю как именно идёт разбитие на партиции на уровне MySQL. Уточняю вопрос, я могу игнорировать партиции и создать индекс по полю `ban` и получить тот же эффективный запрос, что был до этого, когда таблица не имела партиций вообще?
Ответ: Индексы будут нормально работать "между" партициями. Если ты об этом.

6) Я реализую партицую по полю id_parent, не проблема, как быть с сортировкой по дате? У меня запрос выглядит так:
SELECT *
FROM `table` # тут я думаю, так как выборку делаю прям по определённой партиции непосредственно, то указывать PARTITION `p1` будет лишним. Или нет?
WHERE `id_parent` = 1
ORDER BY `date` DESC

Как именно указать партицию+индекс? Индекс по `date` , партиция по id_parent ? Или же не смотря на то, что партиция по id_parent всё равно писать индекс по двум полям `id_parent` + `date` ? Я просто не понимаю, как взаимодействуют между собой Партиция и индекс одновременно.

7) Вопрос касается этой темы: http://phpforum.su/index.php?showtopic=86172
А именно для той таблицы использовать партицию по полю `date`
Вот у меня есть запрос следующего содержания:
SELECT `id`,`subject`,`prew`,`man_saw`,`girl_id`
FROM `mess_sett`
WHERE `man_id` = ".(int)$_SESSION['user_data']['id']."
AND `man_where` = '".es($GET['sel'])."'
AND `man_group` = ".(int)$GET['id']."
ORDER BY `date` DESC

Я указал партиции по полю `date`. Это как-то поможет мне в сортировке данной таблицы, ведь всё равно ВСЕ данные будут выбираться из разных партиций, вопрос тут только касается того, в каком порядке они выводятся. Если я правильно понимаю, то тут партиции не помогут мне вовсе в данном запросе.
А как быть с индексом? Мне же индекс надо ставить на `man_id` + `man_where` + `man_group` , а MySQL сам совместит ПАРТИЦИЮ+ИНДЕКС в том запросе, то есть будет одновременно работать партиция по `date` + индекс по (`man_id` + `man_where` + `man_group`) ? Или же надо индекс писать с учётом партиции, то есть по 4-ом полям включая `date` ?

Может вообще реализовать как в скайпе, то есть вывод сообщений за день/неделю/месяц, по аналогии с тем же VK/FaceBook. На странице будут выводиться записи, относящиеся к первому участку партиции (этот месяц), а если нажать "показать дальше", то выводить более старые? Или с той же прокруткой вниз подгружать новые письма. Таким образом для тех, кто не листает ДАЛЕЕ, те будут при сортировки по `date` работать внутри одной "части" партиции?

________________________

Спасибо, желательно, конечно, получить ответы на все вопросы. Но можно и выборочные отвечать, надеюсь в конце получить общую картину. ;)

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.