Кому интересно - подписывайтесь на тему, по мере наполнения сайта сюда будет дописываться что и как делается.
Так же если надо пример какого-то функционала - так же пишите сюда.
Это пример того, как сделать большую базу (пример nudevista.com)
Тестировалось на базе 12М галер (к моменту публикации думаю уже больше)
1. Наполнение
Сейчас импортсет умеет добавлять дамп практически любого размера, но конечно это занимает определенное время.
Просто добавляем в импорт сет нужные урлы и по мере обработки будет виден процент добавленного.
Обратите внимание, что это именно добавление в базу. Создание тумб, обработка правил и тп так же занимает опредленное время.
те не стоит ожидать что за сутки будет добавлено 10М галер, но они будут добавлены в итоге.
При добавлении есть ньансы:
- некоторые тубы дают полный дамп в архиве. Скрипт не будет сам распаковывать его, вам надо скачать руками и распаковать его самостоятельно
- поскольку дампы бывают очень большие, а серваки их могут отдавать медленно то в итоге можно столкнуться с таймаутом. В этом случае можно добавлять как
/full_path_to/super_big_dymp.csv те не как урл, а как путь на вашем серваке.
- таги - лучше если у вас будет сразу whitelist потому что после большого дампа с разных тубов таги образуются миллионами и разобрать их очень слонжо,
а тк база больша то процесс этот получается довольно медленным
2. в includes/config.php надо добавить
$config['big_database_flag'] = true;
это флаг который говорит скрипту и базе, о том, что не надо подсчитывать общее кол-во результатов.
В реальности серфера не интерисует у вас 9 852 231 галер или 9 902 345. Если очень надо какое-то число на сайте - выведите его прямо в темплейте.
Для особой "динамики" можете вывести как <?=rand(....)?>
Из-за того что мы не знаем общего кол-ва галер по запросам - не будет навигации по страницам.
Точнее будет только навигация вперед и назад, но не будет нумерации страниц.
3. Темплейты и скорость работы сайта.
В версии 1 запросы по тагам, по моделям и по категориям были построены грубо говоря одинаково. Из-за этого при запросе категории в которой было 100-200к галер такие запросы были довольно медленными.
В версии 2 изменена структура базы, что бы запросы по таким большим категориям были быстрыми. Это актуально для сайтов где 12М галер и конечно в категории может быть очень много галер.
4. При такой большой базе не обойтись без Sphinx.
Он позволяет искать быстро, а именно поиск будет основным инструментом. (http://smartcj.com/wiki/doku.php?id=ru: ... inx_config)
В конфиг скрипта прописываем основной индекс и дельта индекс. Зачем нужен дельта индекс написано выше.
Реиндексация: в ссылке выше написано про реиндексацию, в целом надо взять график нагрузки и посмотреть в какой момент суток нагрузка меньше всего и поставить реиндексацию на это время.
Пример конфига
Code: Select all
source big_base_source
{
type = mysql
sql_host = localhost
sql_user = ****
sql_pass = ***
sql_db = ***
sql_port = 3306 # optional, default is 3306
#sql_query_pre = SET CHARACTER_SET_RESULTS=utf8
sql_query_pre = SET NAMES utf8
sql_query_pre = UPDATE rot_settings SET value = (SELECT MAX(gallery_id) FROM rot_gallery_info) WHERE name = 'sphinx_max_gallery_id'
sql_query_range = SELECT MIN(gallery_id),MAX(gallery_id) from rot_gallery_info;
sql_range_step = 1000000
sql_query = SELECT gi.gallery_id, UNIX_TIMESTAMP(gi.activation_date) as date, alt, description, gi.duration, sponsor_id, gs.total_ctr, gi.content_type, \
(SELECT group_concat(tag_name) FROM rot_gal2tag g2t \
LEFT JOIN rot_tags as t on t.tag_id = g2t.tag_id \
WHERE g2t.gallery_id = gi.gallery_id) as tags, \
\
(SELECT group_concat(tag_id) FROM rot_gal2tag g2t \
WHERE g2t.gallery_id = gi.gallery_id) as tag_ids, \
\
(SELECT group_concat(gss.group_id) FROM rot_gallery_stats1 as gss \
WHERE gss.gallery_id = gi.gallery_id AND group_id != 0) as categories \
FROM rot_gallery_info AS gi \
JOIN rot_gallery_data1 AS gd ON gi.gallery_id = gd.gallery_id \
JOIN rot_gallery_stats1 AS gs ON gs.gallery_id = gi.gallery_id \
WHERE gallery_status = 'active' and gallery_type = 0 \
AND gs.best_thumb = 'yes' and gs.group_id = 0 \
AND gi.gallery_id >= $start AND gi.gallery_id <= $end
sql_attr_timestamp = date
sql_attr_uint = duration
sql_attr_uint = sponsor_id
sql_attr_float = total_ctr
sql_attr_uint = content_type
sql_attr_multi = uint tag_ids from field;
sql_attr_multi = uint categories from field;
}
source big_base_source_delta : big_base_source
{
sql_query_pre = SET NAMES utf8
sql_query_range = SELECT (SELECT value FROM rot_settings WHERE name = 'sphinx_max_gallery_id'), (SELECT MAX(gallery_id) FROM rot_gallery_info)
sql_query = SELECT gi.gallery_id, UNIX_TIMESTAMP(gi.activation_date) as date, alt, description, gi.duration, sponsor_id, gs.total_ctr, gi.content_type, \
(SELECT group_concat(tag_name) FROM rot_gal2tag g2t \
LEFT JOIN rot_tags as t on t.tag_id = g2t.tag_id \
WHERE g2t.gallery_id = gi.gallery_id) as tags, \
(SELECT group_concat(tag_id) FROM rot_gal2tag g2t \
WHERE g2t.gallery_id = gi.gallery_id) as tag_ids, \
(SELECT group_concat(gss.group_id) FROM rot_gallery_stats1 as gss \
WHERE gss.gallery_id = gi.gallery_id AND group_id != 0) as categories \
FROM rot_gallery_info AS gi \
JOIN rot_gallery_data1 AS gd ON gi.gallery_id = gd.gallery_id \
JOIN rot_gallery_stats1 AS gs ON gs.gallery_id = gi.gallery_id \
WHERE gi.gallery_id > $start AND gi.gallery_id <= $end \
AND gallery_status = 'active' and gallery_type = 0 \
and gs.best_thumb = 'yes' and gs.group_id = 0
}
index big_base_index
{
source = big_base_source
path = /*****/big_base_index
docinfo = extern
morphology = stem_en
}
index big_base_delta : big_base_index
{
source = big_base_source_delta
path = /*****/big_base_delta
}
5. Создание тумб категорий, тагов, моделей
Поскольку база большая то подсчет точного кол-ва тумб в категориях и моделях не ведется.
Фактически никому точная цифра там не надо, а это позволяет убрать лишнюю нагрузку.
6. Имеет смысл отключить автоматическое создание бекапов в скрипте и делать бекапы самостоятельно опять же в то время когда меньше нагрузки.
Конечно, не одновременно с реиндексацией.
7. Что можно отметить в дефолтных темплейтах
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery-autocomplete/1.0.7/jquery.auto-complete.min.js"></script>
подгружаем общие либы с cdn, а не со своего хоста.
-------
в поиск форме есть автодополнение, хорошее решение прогнать какое-то кол-во слов и фраз через domain/?search=... что бы набралась база с самого начала
------------