SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.11.2011 11:59:06

Norfonzor
Участник
Зарегистрирован: 15.11.2011
Сообщений: 6

Огромное кол-во записей в таблицах, проектирование БД.

Здравствуйте!

Возник вопрос производительности при работе с БД в которой содержатся таблицы с большим кол-вом записей.

Предположим в некоторой БД существует таблица в которой необходимо хранить и
оперативно работать с 25 000 000 000 000 числом записей.

Как будет работать система? Какие возможны проблемы при работе с таким числом записей, возможно ли это вообще, быстрым ли будет поиск?

Я предположил что следует разбить эту таблицу на несколько (1000 шт с одинаковой структурой) тем самым сократив максимальное число записей с 25 000 000 000 000 до 25 000 000 000. Правильно ли я предполагаю?

Как стоит спроектировать БД?
Эксперты прошу вашей помощи!

Отредактированно Norfonzor (15.11.2011 12:00:03)

Неактивен

 

#2 15.11.2011 12:28:27

rbwest
Участник
Зарегистрирован: 30.10.2011
Сообщений: 21

Re: Огромное кол-во записей в таблицах, проектирование БД.

Я не эксперт, но скажу
1. Как минимум выделеный сервер ( как минимум!)
2. Сервер баз данных на том же сервере, что и сайт ( передача огромного кол-ва данных будет быстрее)
3. Суперспециалиста (лучше несколько) по администрированию MySQL в постоянные сотрудники
4. Подробнейше продумать структуру БД и программной логики ( оптимизация запросов)
5. Распределение нагрузки ( несколько тысяч баз вместо одной) само собой

Ну вот думаю кратчайший минимум того, что вам необходимо. А вообще нет ничего невозможного, фэйсбук написан на PHP и использует MySQL, и ниче - работает ведь))

Неактивен

 

#3 15.11.2011 12:50:34

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Огромное кол-во записей в таблицах, проектирование БД.

Я предположил что следует разбить эту таблицу на несколько (1000 шт с одинаковой структурой) тем самым сократив максимальное число записей с 25 000 000 000 000 до 25 000 000 000. Правильно ли я предполагаю?

Да. Тут нужен шардинг.
А что за проект ? Что то у вас больно много записей, особенно если вы ещё с ними собираетесь

оперативно работать

:-)
Подробней опишите проект. Какая структура таблиц, какие запросы будут примерно.

Неактивен

 

#4 16.11.2011 13:30:41

Norfonzor
Участник
Зарегистрирован: 15.11.2011
Сообщений: 6

Re: Огромное кол-во записей в таблицах, проектирование БД.

Техническое задание
«Разработка модуля педагогического тестирования на базе «1С:Битрикс»

Необходимо разработать программный продукт (далее ПП) модуль педагогического тестирования на базе «1С: Битрикс» . В ПП должна быть предусмотрена возможность добавления различных типов тестов: обычный, адаптивный, модульный и др. В каждом из которых предусмотрен свой интерфейс форм, задач и особенностей.

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

Возможности всех, в конкретном случаи теста:
В тест должно быть предусмотрено:
1)    Добавлять неограниченное число вопросов. (уточнение: ограничение по типу данных)
2)    Добавлять неограниченное число ответов для каждого вопроса. (уточнение: ограничение по типу данных)
3)    Иметь возможность создавать вопросы следующих типов:
a.    Для вопросов части А
i.    Один вариант ответа
ii.    Несколько вариантов ответа
iii.    Сопоставление правильных вариантов
iv.    Правильная последовательность частей ответа
b.    Для вопросов части B
i.    Написание собственного ответа на вопрос
4)    В ходе прохождения тестирования вопросы и, в каждом из которых, ответы должны выводиться в случайном порядке.
5)    ПП должен хранить подробную информацию о пройденных тестах.
6)    К каждому вопросу, при создании теста, должна быть возможность добавлять подсказку. Во время прохождения теста, при необходимости, скрытую по умолчанию подсказку, экзаменуемый мог бы посмотреть ее со снятием с него определенного балла, в случаи успешного ответа на этот вопрос.
7)    В тестировании должна быть предусмотрена возможность выставлять результирующий балл в зависимости от процента правильно отвеченных вопросов за каждый тест.
8)    Ответ на вопрос засчитывается, если истинно отвеченный все пункты вариантов ответа.
9)    Устанавливать ограничение по времени прохождения теста и времени ответа каждого  вопроса.
10)    В тесте должно предусмотрено деление вопросов по разделам.
11)     ПП должен иметь возможность выводить отчеты, список отчетов указан в файле Формы.xlsx, в разделе Отчеты.

12)     Для каждого теста после прохождения должна храниться следующая (общая) информация:
a.    Информация об экзаменуемом
b.    Информация об экзаменаторе, проверившем тест, если это необходимо.
c.    Дата прохождения теста
d.    Сколько раз проходился конкретный тест, конкретным студентом
e.    Балл части А, балл части B, (указывается максимальный, если тест проходился несколько раз)
f.    Время прохождения теста
g.    Статус проверки экзаменатором (проверен/не проверен)
h.    Сообщение от экзаменатора о результатах теста.
13)    Для каждого теста должна храниться следующая (общая) информация:
a.    Тип теста
b.    Наименование теста
c.    Информация о рекомендуемой специальности для прохождения теста
d.    Информация о рекомендуемом предмете для прохождения теста
e.    Информация о сотруднике, создавшем тест
f.    Дата создания
g.    Кол-во вопросов
h.    Дополнительная информация о тесте
i.    Максимально время прохождения теста
j.    Текст вступления экзаменуемому перед прохождением тестирвоания
k.    Максимальный процент неправильных ответов после которых происходит прерывание теста.
l.    Период действия теста, период времени в которое возможно прохождение теста.
14)    Для каждого типа теста должна храниться следующая (общая) информация:
a.    Наименование типа теста
b.    Разработчик типа теста
c.    Текущая версия типа теста
d.    Номер версии с которой возможно обновление
e.    Дополнительна информация о тесте
15)    Информация об экзаменуемых
a.    ФИО
b.    Информация о учебной группе
c.    Пароль доступа
16)    Информация об экзаменаторах
a.    ФИО
b.    Пароль доступа
c.    Право администрирования

Схема данных
http://s2.ipicture.ru/uploads/20111116/r25N3Sc3.jpg

Расчет кол-ва записей в таблицах
http://s2.ipicture.ru/uploads/20111116/eSNIW3ky.jpg

Неактивен

 

#5 16.11.2011 16:22:08

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Огромное кол-во записей в таблицах, проектирование БД.

Во первых как вы пришли к такому числу 25 000 000 000 000 ?
Во вторых ваша структура отлично подходит для шардинга.
Если я ничего не пропустил то у вас практически не должно быть запросов по большому количеству записей (group by,fullscan)
В третих возможно старые записи вы вообще можете переносить типо в архив.
В общем всё можно построить по принципам sharding+partitioning на шардах+для особых общих подсчётов обновлять денормализованые таблицы.

Неактивен

 

#6 17.11.2011 10:04:50

Norfonzor
Участник
Зарегистрирован: 15.11.2011
Сообщений: 6

Re: Огромное кол-во записей в таблицах, проектирование БД.

Отчеты:
http://s2.ipicture.ru/uploads/20111116/FixvQ3UW.jpg

http://s2.ipicture.ru/uploads/20111116/TS1rjVux.jpg

http://s2.ipicture.ru/uploads/20111116/5wTn37D7.jpg

Может быть стоит хранить информацию только о не правильно отвеченных вопросах? Зачем дублировать правильно отвеченный вопрос? Ведь информация о правильных ответах на вопросы хранится таблице "Тответы", и по сути информация о правильных ответах будет дублироваться в таблицах "Тответы" и "Рответы". Это значительно позволит сократить объем записей в таблице "Рответы".
Также метод хранения только не правильно отвеченных вопросов упростит выборку из БД, просто выводить все что есть в таблице "Рответы" с указанным id_теста, группировать по id_вопроса

А вот про архивирование прошлогодних тестов, возможно будет извлекать информацию без труда если это понадобится, поскольку не исключены случаи когда надо будет оперативно сформировать отчет за прошлые года?

Метод партиционирование (partitioning) таблиц — это разбиение больших таблиц на логические части по выбранным критериям.. На нижнем уровне для myISAM таблиц, это физически разные файлы, по 3 на каждую партицию (описание таблицы, файл индексов, файл данных).

Я могу установить границы логических частей в зависимости от количества записей в таблице.

лог_часть1 от 0 до 1 000 000
лог_часть2 от 1 000 001 до 5 000 000
лог_часть3 от 5 000 001 до 10 000 000
лог_часть4 от 10 000 001 до 20 000 000
лог_часть5 от 20 000 001 до 50 000 000
лог_часть6 более 50 000 001

Во время запроса, поиск будет происходить не во всех таблице а только в пределах какого то логического раздела, что существенно сократит поиск информации в таблице.

Я правильно понимаю принцип партиционирования таблиц? Или принцип работы другой и не годится для данной структуры?

Неактивен

 

#7 17.11.2011 16:28:19

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Огромное кол-во записей в таблицах, проектирование БД.

Я правильно понимаю принцип партиционирования таблиц?

В общем да.
Почитай тут, найдёте полезную информацию  Restrictions and Limitations on Partitioning

Неактивен

 

#8 18.11.2011 10:59:25

Norfonzor
Участник
Зарегистрирован: 15.11.2011
Сообщений: 6

Re: Огромное кол-во записей в таблицах, проектирование БД.

я слышал что использование таблиц InnoDB, теперь стало платным, в связи с этим пользуются таблицами MyISAM, но в этих таблицах нельзя делать запросы, объединяющие ключи двух и более таблиц(не работают связи между таблицами JOIN ). Дак что получается делать запрос только для одной таблицы?

Еще вопрос про разбиение разделов как лучше организовать деление на PARTITION (лог. разделы) таблицу?
Собираюсь делить на разделы следующие таблицы:
Ртесты
Тответы
Рответы

1) для таблицы Тответы
Суррогатный ключ: id - авто нумерация
Альтернативный ключ: id_теста+ id_вопроса+id_ответа

2) для таблицы Рответы :
Суррогатный ключ: id - авто нумерация
Альтернативный ключ: id_теста+ id_вопроса+id_ответа+id_студента

3) для таблицы Р_тесты :
Суррогатный ключ: id - авто нумерация
Альтернативный ключ: id_теста+id_студента

[AUTO_INCREMENT]
- При вставке новой записи в таблицу поле с этим атрибутом автоматически получит числовое значение, на 1 больше самого большого значения для этого поля в текущий момент времени. Данная возможность обычно используется для генерирования уникальных идентификаторов строк. Столбец, для которого применяется атрибут AUTO_INCREMENT, должен иметь целочисленный тип. В таблице может быть только один столбец с атрибутом AUTO_INCREMENT. Так же этот столбец должен быть проиндексирован. Отсчет последовательности чисел для AUTO_INCREMENT начинается с 1. Это могут быть только положительные числа.


Получается что во всех таблицах можно использовать id для деления таблиц, но если он будет автоматически нумероваться, то при удалении каких-то записей внутри таблицы, останутся пустые строки в разделе, и на их место уже не запишутся.

К примеру:
раздел1 записи от 1 до 100
раздел 2 от 101 до 200
раздел 3 строго более 200

1)Заполним таблицу, добавим первые 150 записей (авто нумерация id от 1 до 150)
2) удалим первые 100 записей
3) добавим еще 100 записей (авто нумерация (исходя от тек. макс id) id от 151 до 250)

в результате раздел1 будет всегда пустым, полностью заполнится раздел 2, частично будет заполнен раздел 3. Добавляя новые записи будут всегда записываться в раздел 3.
Таким образов потеряется нарушится работа схемы.

Есть ли возможность поправить принцип работы AUTO_INCREMENT, чтобы он искал минимальные не использованные id, и начинал добавление новых записей с них?

Или использовать другой алгоритм деления на разделы?

Отредактированно Norfonzor (18.11.2011 11:02:21)

Неактивен

 

#9 18.11.2011 15:18:56

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Огромное кол-во записей в таблицах, проектирование БД.

я слышал что использование таблиц InnoDB, теперь стало платным

Неправда

но в этих таблицах нельзя делать запросы, объединяющие ключи двух и более таблиц(не работают связи между таблицами JOIN ).

Откуда вы это всё взяли ? :-)

Получается что во всех таблицах можно использовать id для деления таблиц, но если он будет автоматически нумероваться, то при удалении каких-то записей внутри таблицы, останутся пустые строки в разделе, и на их место уже не запишутся.

Да, так и есть, если вы удаляете записи, то в разделах не будет равномерное количество записей. Но в вашем случае это не критично.

Есть ли возможность поправить принцип работы AUTO_INCREMENT, чтобы он искал минимальные не использованные id, и начинал добавление новых записей с них?

Можно контролировать присваивание id, но это вам не подходит. Вам возможно потребуется список новых студентов или вопросов, будет проблема если вы будите искать их по всем разделам.

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

Отредактированно evgeny (18.11.2011 15:19:49)

Неактивен

 

#10 20.11.2011 05:00:13

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Огромное кол-во записей в таблицах, проектирование БД.

evgeny написал:

я слышал что использование таблиц InnoDB, теперь стало платным

Неправда

Поделитесь источником пожалуйста,  где Вы это слышали или прочитали.

evgeny написал:

но в этих таблицах нельзя делать запросы, объединяющие ключи двух и более таблиц(не работают связи между таблицами JOIN ).

Откуда вы это всё взяли ? :-)

Подозреваю, что имелось в виду то, что на таблицах типа MyISAM не работают внешние ключи.

Отредактированно deadka (20.11.2011 05:02:52)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 20.11.2011 13:43:55

Norfonzor
Участник
Зарегистрирован: 15.11.2011
Сообщений: 6

Re: Огромное кол-во записей в таблицах, проектирование БД.

Слышал что таблицы InnoDB, стали платными, но с версии 5.5 снова стали бесплатными но, их поддержка будет не своевременной. Что бы проблем не было сейчас многие стали использовать таблицы MyISAM. Но в них не работаю внешние ключи.

Какие таблицы стоит использовать? Подскажите пожалуйста, раз уж открылась такая тема! Спасибо.

Отредактированно Norfonzor (20.11.2011 13:53:28)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson