Производительность CCK

Главные вкладки

Аватар пользователя Waldos Waldos 19 июня 2012 в 1:19

Решил разработать свой сайт на базе Drupal. Разумеется, один из главных вопросов - организация БД. Ознакомился с работой инструмента CCK и обнаружил, что для каждого поля создается отдельная таблица в БД. Сразу возник вопрос о эффективности такого подхода в плане производительности. Насколько это будет работоспособно при нескольких миллионах записей в таблицах и более или менее сложных запросах к ним?

Комментарии

Аватар пользователя sg85 sg85 19 июня 2012 в 7:47

"Waldos" wrote:
Сразу возник вопрос о эффективности такого подхода в плане производительности. Насколько это будет работоспособно при нескольких миллионах записей в таблицах и более или менее сложных запросах к ним?

1.9 млн записей, время генерации страниц практически не изменилось, как-будто там всего 1-2 ноды, пострадал немного вьювс(при довольно сложных и редких представлениях), пришлось его учить напрямую обращаться к нужным мне таблицам, что не так уж сложно и гайдов на эту тему как грязи.
"Waldos" wrote:
Насколько это будет работоспособно при нескольких миллионах записей в таблицах и более или менее сложных запросах к ним?

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

Аватар пользователя alex_shut alex_shut 19 июня 2012 в 10:46

Поцаны. а я мерседес купил. Только вот теперь не знаю, потянет ли мериновский дизель возить по 4-5 мешков картохи каждый день? )

Аватар пользователя Orion76 Orion76 20 июня 2012 в 1:30

Семерка в этом плане гибче..
Можно "написать" свою "сущность"(entity), которая будет хранить свои поля в одной или нескольких связанных таблицах БД.
Можно "написать" "поле" для имеющихся сущностей которое будет состоять из нескольких "подполей",которые храняться в одной или нескольких связанных таблицах БД.
... и еще куча вариантов в зависимости от задач и фантазии-))

ключевые слова: drupal 7,Field API, Entity API

http://drupal.org/project/examples

Аватар пользователя Orion76 Orion76 20 июня 2012 в 10:11

"sg85" wrote:
мне б её лет эдак 5 назад

«Ищите, и обрящете, толцыте, и отверзется» (ищите, и найдете; стучите, и вам откроют).(c)В Евангелии от Матфея

До чего древняя мудрость... а до сих по актуальна-)))
Это не лично вам... так... в общем...

Аватар пользователя sg85 sg85 20 июня 2012 в 10:26

"drupby" wrote:
в школах 5 лет назад изучали друпал ?

Нет, мне в отличии от Вас с этим не повезло, в мое школьное время PHP еще не существовало, не говоря уже про CMS на нем. А если Вам интересна причина написания предыдущего комента - все очень просто, 5 лет назад подобное сэкономило бы мне уйму времени.

Аватар пользователя Waldos Waldos 20 июня 2012 в 12:45

"inza" wrote:
На какой платформе поставил Drupal (Linux, Win, Денвер и пр.)? Если речь идет о CCK, то у тебя Друпал 6 - какая версия, какие еще модули задействованы.

Друпал 7) Скачал с drupal.org cck-7.x-2.x-dev (я так понимаю, это что-то типа беты) вроде бы заработала) Win - XP SP3, Денвер - Denwer3_Base_2010-11-07_a2.2.4_p5.3.1_m5.1.40_pma3.2.3. Набор модулей - CKE, Views, Panels.
"inza" wrote:
Вопрос в том, когда они соединяются, и как. Если при каждом запросе посетителя сайта и при каждой генерации страницы - то это одно, если только когда админ добавляет звписи в БД из админки - это другое.

Предметная логика сайта похожа на автомобильную тематику и все, что с ней связано. Т.е. есть ряд подчиненных таблиц Марки->Модели->Запчасти с весьма внушительным набором полей каждая и ряд таблиц с различной дополнительной информацией, например, значения, которые изменяются периодически (цены и т.п). И вот возникает вопрос: насколько быстро все это будет работать при использовании стандартных механизмов CCK...
Привлекательным моментом считаю отсутствие необходимости заморачиваться над интерфейсом админки - все стандартно, во всяком случае, я сделал такой вывод. Конечно, написание запросов при такой организации данных несколько усложнится за счет кучи соединений, но если это единственный минус, то с ним можно смириться. А вот если окажется, что на больших размерах таблиц запросы будут критично тормозить, то лучше от этого отказаться и искать другие варианты.

Аватар пользователя Waldos Waldos 20 июня 2012 в 16:54

inza wrote:

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

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

Аватар пользователя sg85 sg85 20 июня 2012 в 19:37

"Waldos" wrote:
Возникают сомнения, что соединения с несколькими таблицами будут быстро работать при наличии большого количества записей во всех таблицах. Даже если выбирать одну запись.

Если выбрать записи с простыми критериями в фильтрах, простенькой сортировкой и т.д. то на производительности не скажется ни как, сколько бы там связанных таблиц не было, однако, даже если таблица всего 1, но у вас идет несколько LIKE фильтров, также куча сортировок и еще GROUP BY для полного счастья, то тормоза будут нереальные, если Вы про это(сам друпал такого слава богу не делает, однако подобную выборку можно сотворить во вьювс или в своем модуле).

Аватар пользователя alex_shut alex_shut 20 июня 2012 в 20:21

"inza" wrote:
Наверняка утверждать не готов - не хватает знаний и практики.

элементарная логика.
Если просто материал - то нет смысла бить его на разные таблицы.
Но у нас есть вьюс и еще куча варианта для вывода отдельных полей и обработки.
отсюда следует:
для вывода поля модуль лезет в базу, ищет таблицу конкретного поля и оттуда выкапывает нужную строку.
все просто.

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

Выходит путь таки длиннее.

Аватар пользователя Dan Dan 20 июня 2012 в 23:38

Есть модуль devel - он может генерить ноды автоматически. Не помню, можно ли там задать произвольное число, но что мешает это сделать? Набросай нужную структуру, это займёт полчаса, нагенери миллион нод (это займёт много времени, особенно на винде), и увидишь _реальную_ картину.

Аватар пользователя Orion76 Orion76 21 июня 2012 в 0:19

"alex_shut" wrote:
то нет смысла бить его на разные таблицы.

элементарно "прикрепить" к ноде неопределенное кол-во картинок, это уже связь "один-ко-многим", подобное одной таблицей не реализуешь..

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

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

К тому-же скорость-количество запросов к БД не единственная причина "тормозов" сайта..
Есть еще куча других, и довольно таки не маловажных..

Аватар пользователя kyky kyky 21 июня 2012 в 2:39

Это зависит (с).
Нужно знать объем данных: горизонтальный (число полей) и вертикальный (число записей), а так же принцип работы с ними — что это за данные и что вы с ними будете делать.