Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

MySQL. Сколько же таблиц оптимально?

12
18 января 2007 года
alekciy
3.0K / / 13.12.2005
С MySQL как-то немного работал, XML за глаза хватало. Но вот сейчас озадачился таким вот практическим вопросом. Сколько таблиц в одной БД оптимально хотя бы для форума? Ведь можно все посты хранить в одной таблице, но тогда при сложном поиске будет сканироваться все таблица. Время, тормоза... можно каждую ветку форума выделить в отдельную таблицу... а ведь можно на каждый сутки создания тем создавать по отдельной таблице. Но не получиться ли так, что скорость обработки запросов к многотабличной БД будет такая же как и для малотабличной ввиду времени выбора нужно таблицы? Но для малотабличной БД запросы создавать проще, не получиться ли так, что с малотабличной БД будет проще работать?

Собственно понятно, что для одних задач более оптимальные это многотабличные БД, для других более оптимально юзать малотабличные. Вот и интерисует мнение тех, кто с БД много работал, т.е. практическая сторона. В каких случаях лучше делать кучу таблиц, в каких лучше мало?

Просто вот думаю... есть БД каталог в которой есть список товаров, список покупателей и покупки (таблица которая связывает таблицу товаров и покупателей). Я вот думаю, лучше сделать все покупки в одной таблице, или, например, для каждый суток создавать отдельную новую таблицу? Ибо потом еще нужно в админке генерировать отчеты по дня и если у нас каждый новые сутки будет новая таблица, то выбрать нужные сутки будет просто, если таблица одна, то придется сканить всю таблицу (ну или её часть учитывая что первичный ключ это время в *них формате).
23K
18 января 2007 года
lost_shadow
13 / / 05.01.2007
Цитата: alekciy
Ведь можно все посты хранить в одной таблице, но тогда при сложном поиске будет сканироваться все таблица.



Нет, не будет. В базах данных как правило нет нужды читать всю таблицу, чтобы выбрать несколько строк. Сложность при этом заключается лишь в правильной расстановке индексов. Например, если у тебя в таблице есть поля "сообщение","id пользователя","id ветки" (разумеется, их на практике должно быть куда больше, но ограничимся пока этим), то если тебе часто приходится читать из таблицы запросом типа select ... where 'id_ветки'=... , то при наличии индекса на поле id_ветки запрос будет произведён очень быстро при многогигабайтной таблице.

Применительно к MySQL читай
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Цитата: alekciy
Просто вот думаю... есть БД каталог в которой есть список товаров, список покупателей и покупки (таблица которая связывает таблицу товаров и покупателей). Я вот думаю, лучше сделать все покупки в одной таблице, или, например, для каждый суток создавать отдельную новую таблицу?



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

Цитата:
Ибо потом еще нужно в админке генерировать отчеты по дня и если у нас каждый новые сутки будет новая таблица, то выбрать нужные сутки будет просто, если таблица одна, то придется сканить всю таблицу (ну или её часть учитывая что первичный ключ это время в *них формате).



За первичный ключ в timestamp надо расстреливать на месте. В MySQL есть auto_increment, в Oracle-последовательности и триггеры (а, вероятно, и более простой способ) - в любом случае в каждой нормальной БД вопрос генерации первичных ключей решён.

Применительно к данному случаю рекомендую:
Заменить timestamp на time и date. А если MySQL умеет строить частичные индексы по datetime (в чём я сомневаюсь), то на него.
Внимательно прочитать http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html и расставить соответствующие индексы. В целом, согласно содержимому этой ссылки, индексы на сбалансированных бинарных деревьях будут использоваться и при выражениях timestamp<... and timestamp>=..., но всё же рекомендую сделать по-человечески.
Да, и не забудь сделать внешние ключи для контроля целостности данных - по-моему, индексы на внешние ключи MySQL использует автоматически.

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

Однако в силу вопроса, выдающего твою низкую квалификацию в этой области, очень рекомендую почитать литературу по базам данных, так как неправильное проектирование таблиц может повлечь очень плачевные последствия в плане объёма переписываемого кода. Также как альтернативу можешь освоить библиотеки ORM (объектно-реляционного отображения), которые вбирают себя работу со многими типичными случаями без необходимости писать запросы вручную. К сожалению, я не знаю очень хорошей библиотеки для PHP, но если тебе вэтом вопросе так ничего и не посоветуют, можешь попробовать phpdoctrine, однако сразу предупреждаю, что по тупости её разработчика в персистентных классах там нельзя использовать свои конструкторы.

11K
18 января 2007 года
.nornad
125 / / 04.01.2007
Цитата: lost_shadow
Нет, не будет. В базах данных как правило нет нужды читать всю таблицу, чтобы выбрать несколько строк. Сложность при этом заключается лишь в правильной расстановке индексов.



Автор подразумевал, похоже, полнотекстовый поиск подстроки в тексте сообщений форума. Тут индексация особо не поможет. Например, если пользователь хочет получить список сообщений (или тем) форума, где встречается подстрока "Вася Пупкин", то придётся тупо идти по всем сообщениям.
[INDENT] Цитата: Сообщение от alekciy
Просто вот думаю... есть БД каталог в которой есть список товаров, список покупателей и покупки (таблица которая связывает таблицу товаров и покупателей). Я вот думаю, лучше сделать все покупки в одной таблице, или, например, для каждый суток создавать отдельную новую таблицу?
[/INDENT]Зачем усложнять? У тебя разве предполагается добавление порядка миллиона записей о покупках за один день? Сомневаюсь, что хотя бы порядка тысячи наберётся. Прикинь насколько быстро будет забиваться таблица покупок и сделай периодическое перемещение части информации из основной таблицы в архивную. А лучше вообще в архивную БД.

Цитата: lost_shadow
За первичный ключ в timestamp надо расстреливать на месте.



Просвети, пожалуйста, в чём причина. Дело в том, что опыт в разработке структуры БД у меня небольшой и хотелось бы, так сказать, пользуясь моментом, повысить квалификацию.

12
18 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: lost_shadow

За первичный ключ в timestamp надо расстреливать на месте.


Ну это я и не делал. Использую суррогатный ключ id. Просто подумалось, что тут у нас естественное упорядочинное поле. И потом на тип timestamp отводится 4 байта как и на int, так почему бы не юзат этот естественный ключ?

Цитата: lost_shadow

Применительно к данному случаю рекомендую:
Заменить timestamp на time и date.


Была такая мысль. Но возникает сомнение ибо тут работаем с двумя полями, а при timestamp с одним.

Цитата: lost_shadow

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


Книга есть, и довольно большая. Прочесть за день два ну ни как не получится :D . Но пролистав её по быстрому и порывший в предметном указателе я так и не нашел однозначно ответа в какое количество таблиц может быть оптимальным. Это я так понимаю можно вынести из практики проектирования не одной БД. Поэтому и запостил.

Цитата: lost_shadow

Также как альтернативу можешь освоить библиотеки ORM (объектно-реляционного отображения), которые вбирают себя работу со многими типичными случаями без необходимости писать запросы вручную.


Э нет, это в данный момент не наш метод :) . Сейчас как раз и нужно писать вручную и писать много. Имхо, как с HTML. Народ лучше понимаем что это и зачем когда работает с исходной разметкой без всяких там визуалок. И тут блокнот рулит :D

10
18 января 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: lost_shadow
За первичный ключ в timestamp надо расстреливать на месте.


Если сервер позволяет полноценно формировать timestamp из даты и времени в запросах, почему бы и нет? Первичный ключ может быть не только суррогатным, но и натуральным - перечитай теорию. В некоторых задачах натуральные ключи рулят.

С остальным согласен.

Цитата: alekciy
Но пролистав её по быстрому и порывший в предметном указателе я так и не нашел однозначно ответа в какое количество таблиц может быть оптимальным.


И не мудрено, ибо вопроса "оптимального количества таблиц" в теории реляционных БД не существует. Сколько требуется по модели (зависящей от решаемой задачи), столько и делают. У сервера может быть ограничение на число таблиц в одной БД, как правило, очень большое, вроде 4096 или 65536.

А ляпать по таблице на каждую ветку форума - однозначный маразм.

256
18 января 2007 года
foxweb
1.0K / / 27.07.2005
оптимальное количество таблиц - 5.

шутка конечно. нельзя так вопрос ставить. тут вопрос в правильном проектировании БД.

на данном этапе лучше освоить нормлаьные формы (а это вообще должен назубок знать любой дизайнер БД)

http://ru.wikipedia.org/wiki/Нормальная_форма

хотя некоторые даже и не догадываются, но большинство разработчиков работают с 3NF.

Ежели ты сознательный программист, то всё поймёшь и будет ясно, что делать дальше.

в любом случае плодить таблицы нельзя. БД теряет всякий смысел.
12
18 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: foxweb

на данном этапе лучше освоить нормлаьные формы (а это вообще должен назубок знать любой дизайнер БД)

http://ru.wikipedia.org/wiki/Нормальная_форма


Я знаю правила нормализации данных, более того, делал их, пусть и для простых БД. Вопрос то не по нормализации, а по скорости.

12
18 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: foxweb

в любом случае плодить таблицы нельзя. БД теряет всякий смысел.


Почему? Объективная причина есть? Например в данном форуме 22 ветки, я думаю, что 22 таблицы в БД сделать не трудно. А работать было бы удобнее с 22 таблицами, чем с одной. Разве нет?

12
18 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Freeman
Если сервер позволяет полноценно формировать timestamp из даты и времени в запросах, почему бы и нет?


Это как раз не проблема. В PHP как раз для это все есть. На мускул будут идти уже отформатированные timestamp.

Цитата: Freeman

И не мудрено, ибо вопроса "оптимального количества таблиц" в теории реляционных БД не существует.


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

10
19 января 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: alekciy
Почему? Объективная причина есть?


Да. Первое правило разумного решения задач - не умножать сущностей без надобности.

Цитата: alekciy
А работать было бы удобнее с 22 таблицами, чем с одной.


См. выше. Если задача решаема одной таблицей, в 21-й оставшейся нет надобности. У тебя неправильное понятие о БД или серьёзный разрыв теории с практикой.

12
19 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Freeman

См. выше. Если задача решаема одной таблицей, в 21-й оставшейся нет надобности. У тебя неправильное понятие о БД или серьёзный разрыв теории с практикой.


Хм.. а если 22 таблицы будет быстрее, чем одна?

256
19 января 2007 года
foxweb
1.0K / / 27.07.2005
ты кому хочешь создать удобство - себе или компьютеру? ;)
если себе - то одну, а компьютеру, точнее СУБД всё равно.
вопрос в том, как ты с помощью скриптов будешь переключаться между таблицами.

разницы ИМХО не будет. но зачем МНОГО когда проще ОДНУ? БД десятки лет проектируются, и поверь разработчики обо всём давно подумали.

а прикинь, если тебе нужно сделать запрос по всему архиву, то есть по всем 22 таблицам? что, 22 запроса? или UNION, что в принципе однох... а если тебе структуру сущности надо поменять?

Лично я не видел, что бы в каком то проекте было много таблиц для одной сущности. Плодить таблицы имеет см%u
256
19 января 2007 года
foxweb
1.0K / / 27.07.2005
из жизни. проектировал базу MySQL.
каждая запись - большая газетная статья + куча параметров.
в день наполнение 50-100 записей.
база живёт почти три года скоро будет (хм, когда я её проектировал мне было 18 и это была моя первая БД )))
сейчас там записей около 100000 и ничего, всё работает. кстати полнотекстовый поиск без индекса тоже нормально, 0.1 в среднем выдача ответа от базы (применял FULLTEXT).

и пока ни разу даже мыслей таких не было, чтобы пилить на отдельные таблицы, ибо перед этим много читал и общался с разработчи%u
12
19 января 2007 года
alekciy
3.0K / / 13.12.2005
0,1 для не такой уж и маленькой БД неплохо ))) ну значит не буду пилить, все равно там даже 100.000 записей не будет.
13
19 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Оптимально столько нужно чтобы БД не впадала в даун... Если записей будет меньше миллиона - можешь не парится и пихать все в одну... Главное правильно расставить индексы, нормально спроектировать структуру таблицы и писать грамотные запросы. Ну и не забывать периодически выполнять команду VACUUM

Если же записей будет более 1 миллиона и нагрузка будет относительно высокой (более 10 запросов в секунду) - тогда нужны другие подходы и MySQL тут уже отдыхает.
256
19 января 2007 года
foxweb
1.0K / / 27.07.2005
Цитата: alekciy
0,1 для не такой уж и маленькой БД неплохо ))) ну значит не буду пилить, все равно там даже 100.000 записей не будет.



0.1 - текстовые поисковые запросы по FULLTEXT, обычные запросы и намного меньше времени занимают.

11K
19 января 2007 года
.nornad
125 / / 04.01.2007
Цитата: Freeman
Если задача решаема одной таблицей, в 21-й оставшейся нет надобности. У тебя неправильное понятие о БД или серьёзный разрыв теории с практикой.


В случае БД для форума одна таблица не всегда лучше нескольких (по разделам форума). Если на твоём форуме за день оставляют по несколько тысяч сообщений, то база пухнет быстро. А производить поиск по всей базе (все разделы форума) требуется достаточно редко и можно позволить себе и неудобства, и небольшую задержку.

12
19 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: RussianSpy

Если же записей будет более 1 миллиона и нагрузка будет относительно высокой (более 10 запросов в секунду) - тогда нужны другие подходы и MySQL тут уже отдыхает.


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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог