Перейти к контенту
  • 0

Выделение загрузок в отдельную таблицу


movies

Вопрос

По умолчанию информация о загруженных файлах хранится в ibf_posts. Оптимально ли это?

Большую часть на моем форуме составляют сообщения без присоединений (95%), и поэтому поля attach_ - пустые

Как вы думаете, может, стоит выделить присоединения в некую ibf_uploads?

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0
Вы можете сделать копию таблицы, удалить в ней столбцы аттачей и попробовать сделать несколько запросов, подобных запросам форума. Если разница в скорости будет колоссальна, может быть и стоит. Только не нужно забывать, что тогда вам нужно будет каким-то другим образом получать прикреплённые файлы, а значит будет ещё один запрос, хоть и легковесный. Имхо, учитывая размер поля post, эти колонки особой погоды не делают.
Ссылка на комментарий
Поделиться на других сайтах

  • 0
значит будет ещё один запрос, хоть и легковесный
Можно ведь использовать Left Join

 

Имхо, учитывая размер поля post, эти колонки особой погоды не делают.
Спасибо за мнение
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Можно ведь использовать Left Join
В чём тогда, по вашему, получится ускорение? :D Записи из ibf_posts всегда выбираются по условию на индексированное поле, а значит размер самой таблицы не должен заметно на это влиять. Плюс join будет отнимать дополнительное время.

 

P.S. Это идеальная картина, может отличаться в зависимости от настроек сервера и проставленных индексов. Посмотрим что скажут более знающие люди ;)

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Как вы думаете, может, стоит выделить присоединения в некую ibf_uploads?

Стоит, конечно.

Заодно появится возможность добавлять к посту не одно вложение, а сколько угодно.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Как вы думаете, может, стоит выделить присоединения в некую ibf_uploads?

Стоит, конечно.

Заодно появится возможность добавлять к посту не одно вложение, а сколько угодно.

Song, расскажи заодно, почему :D Кроме как для мода мультиаттача.

 

Multiattach: http://www.ibresource.ru/forums/index.php?showtopic=36569.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Есть такая штука - нормализация.

Так вот данные должны быть нормализованы.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Есть такая штука - нормализация.

Так вот данные должны быть нормализованы.

Само собой :D Но заметно оптимальнее(с точки зрения скорости/нагрузки) это в данном случае не будет, я правильно понимаю?

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Но заметно оптимальнее(с точки зрения скорости/нагрузки) это в данном случае не будет, я правильно понимаю?

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

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Но заметно оптимальнее(с точки зрения скорости/нагрузки) это в данном случае не будет, я правильно понимаю?

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

Т.е. если вспомнить о том, что основной размер этой таблицы это все-таки сообщения, то это особо не нужно? :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0
оптимальнее будет занимаемое таблицей место на диске. ...

Слууууушай....

а если организовать для постов несколько таблиц

одна - ibf_posts_main, будет содержать все то же, что и сейчас, кроме поста, вместо него - номер таблицы и ид записи, в которой текст

а другие - ibf_posts_1 , ibf_posts_2 и т.д. - посты

 

хотя яваскрипт FatCat'а лучше, но сама идея то...

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Т.е. если вспомнить о том, что основной размер этой таблицы это все-таки сообщения, то это особо не нужно?

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

В случае размещения аттачей в постах, аттачи даже пустые занимают место на каждую строку.

 

одна - ibf_posts_main, будет содержать все то же, что и сейчас, кроме поста, вместо него - номер таблицы и ид записи, в которой текст

а другие - ibf_posts_1 , ibf_posts_2 и т.д. - посты

мошшшно..

Там даже есть тип таблиц такой - MERGE

 

но ИМХО одно и то же.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
аттачи у нас не к каждому посту, соответственно получившаяся таблица с аттачами не будет равна по количеству строк таблице постов. Соответственно здесь выигрываем.

В случае размещения аттачей в постах, аттачи даже пустые занимают место на каждую строку.

Song, я не настолько глупый, не надейся :D А ТС наверняка захочет поставить мультиаттач, так что выбора у него не будет.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
[хотя яваскрипт FatCat'а лучше, но сама идея то...

Сейчас еще лучше сделано:

В functions.php добавил 2 функции:

	function extract_archived_post($pid, $j_type)
{
	global $ibforums;

	$arc_path = ($pid-$pid%1000)/1000;
	$arc_path = $ibforums->vars['base_dir']."arc/".$arc_path."/";
	$arc_file = $pid%1000;
	$arc_file = $arc_path.$arc_file.".".$j_type;
	if(is_writeable( $arc_file ))
	{
		@ob_start();
		include( $arc_file );
		$archived_post = @ob_get_contents();
		@ob_end_clean();
	}
	else
	{
		$archived_post = "";
	}
	return $archived_post;
}

function create_archived_post($pid, $j_type, $txt)
{
	global $ibforums;

	$arc_path = ($pid-$pid%1000)/1000;
	$arc_path = $arc_path = $ibforums->vars['base_dir']."arc/".$arc_path."/";
	$arc_file = $pid%1000;
	$arc_file = $arc_path.$arc_file.".".$j_type;
	if(file_exists($arc_file))unlink($arc_file);
	if($txt != "")
	{
		if(!file_exists($arc_path))mkdir($arc_path, 0777);
		$fh = fopen($arc_file, "w");
		fwrite($fh, $txt);
		fclose($fh);
	}
}

 

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

 

Во всех файлах, где посты пишутся в базу, добавлена конструкция:

if(strlen($this->post['post']) > 4000)
{
$std->create_archived_post($this->post['pid'], "arc", $this->post['post']);
$this->post['post'] = " ";
}

 

Во всех файлах, где посты читаются, добавлена конструкция:

if ( strlen($out['post']) < 3 )$out['post'] = $std->extract_archived_post($out['pid'], "arc");

 

 

Во всех файлах, где посты удаляются, добавлена конструкция:

$std->create_archived_post($post['pid'], "arc", "");

 

 

 

Таким образом, средний размер таблицы ibf_posts составляет меньше 1 Мб на каждую 1000 сообщений.

 

 

Аналогично сделано для журналов.

В итоге имеем 200 000 сообщений, общий вес БД 80 Мб; и почти 100 Мб в файлах.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Для выделения аттачей в отдельную таблицу пришлось перелопатить довольно много кода - Topics.php, Moderate.php, Post.php, lib/pos_*.php, misc/attach.php.

Но, это еще не конец...

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Навскидку, что помню:

С аттачами работают функции удаления тем и очистки форумов в мультимодерации; в админке в очистке форума и удаление всех сообщений пользователя.

Если используется mJournal, то там с аттачами вообще беда: ошибка в скрипте, по которой сами файлы не удаляются и захламляют аплоады.

Если не ошибаюсь, в sources/lib ТРИ файла работают с аттачами: для нового топика, для нового сообщения и для редактирования сообщения.

А может и четыре: не помню, каким файлом реализуется предпросмотр из формы быстрого ответа...

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Song, я не настолько глупый, не надейся

О, я это и не говорил! :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Song, я не настолько глупый, не надейся

О, я это и не говорил! :D

;) Если не сложно, скажи сколько у тебя сейчас записей в posts и сколько всего/уникальных_по_посту записей в таблице аттачей, я тогда промоделирую и удовлетворю своё любопытство относительно экономии места.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Спасибо :D
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Такого быть не может.

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

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Запрос покажите, вопросы пропадут :D
Ссылка на комментарий
Поделиться на других сайтах

  • 0
просто перевели в другую таблицу

 

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

 

Выходит, в Topics.php к имеющимся

			FROM	ibf_posts p
			LEFT JOIN ibf_members m ON (p.author_id=m.id)
				LEFT JOIN ibf_groups g ON (g.g_id=m.mgroup)

добавляется

				LEFT JOIN ibf_uploads u ON (u.pid=p.pid)
				LEFT JOIN ibf_upl_vote v ON ( (v.upl_id=u.upl_id) AND (v.member_id = '".$ibforums->member['id']."') )

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.