- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Решил заново учиться, надо придумать хорошую структуру БД для каталога книг.
Вот необходимые поля:
Название
Год написания
Краткое содержание
Автор (множество)
Жанр (множество)
Издательство (множество)
Как это все в одну таблицу запихать не знаю, т.к. надо выводить книги и по жанрам, и по авторам, да и по издательствам тоже.
Пока придумал такие таблицы
ID книги
Название
Год написания
Краткое содержание
Жанры
ID жанра
Название жанра
Книги и жанры
ID книги
ID жанра
Издатели
ID издателя
Имя издателя
Книги и издатели
ID книги
ID издателя
Авторы
ID автора
Имя автора
Книги и авторы
ID книги
ID автора
Но при выдаче данных, например, по жанрам, надо будет как минимум 2 таблицы объединять в SQL запросе, а если еще и сортировку по названию использовать, то будет достаточно большая задержка в выполнении. Трафа будет много, от 50.000 уников в сутки, сервак вешается уже с такой структурой БД.
Решил заново учиться, надо придумать хорошую структуру БД для каталога книг.
Вот необходимые поля:
Название
Год написания
Краткое содержание
Автор (множество)
Жанр (множество)
Издательство (множество)
Как это все в одну таблицу запихать не знаю, т.к. надо выводить книги и по жанрам, и по авторам, да и по издательствам тоже.
Пока придумал такие таблицы
Но при выдаче данных, например, по жанрам, надо будет как минимум 2 таблицы объединять в SQL запросе, а если еще и сортировку по названию использовать, то будет достаточно большая задержка в выполнении. Трафа будет много, от 50.000 уников в сутки, сервак вешается уже с такой структурой БД.
Если повесить индексы, то такая структура вполне бодро работает. Откуда инфа про большую задержку?
Плюс определённый смысл имеет структура типа key-value-type, т.е. одна таблица это у Вас книги, вторая таблица сшивает книги-свойства, третья таблица свойства (ID, значение, тип - например 1, драма, жанр; 2, толстой, автор и т.д.), что позволяет уменьшить общее количество таблиц объединяемых для выборки.
Проблема в том, что на странице со списком книг по жанрам выводятся разные блоки: последние добавленные книги, случайные книги. Все это напрягает БД и сервер. Если бы трафа было мало, то и пофиг, но траф идет хороший.
Общее время генерации страницы 0.25-0.5 секунд, что очень много, я считаю
Я конечно понимаю, что распределённые базы это круто, но может быть сделать всё в 1 таблице?
Если какие-то списки юзаются часто, например вывод всех авторов, то просто их по крону обновлять.
Ну ещё выход кэшировать страницы т.е. запоминать, что ищут пользователи и запоминать id книг, которые подходят и уже потом выдавать ему информацию.
---------- Добавлено 27.08.2012 в 21:54 ----------
Ну ещё вариант это конечно, это настроить mysql, может быть там размер кэша мелкий.
Так же нужно посмотреть, какие там запросы идут и их надо как-то поправить.
LEOnidUKG, а как в одну таблицу вместить книгу, у которой много авторов, жанров и издательств?
Как потом выводить книги по определенному автору?
Проблема в том, что на странице со списком книг по жанрам выводятся разные блоки: последние добавленные книги, случайные книги. Все это напрягает БД и сервер. Если бы трафа было мало, то и пофиг, но траф идет хороший.
Общее время генерации страницы 0.25-0.5 секунд, что очень много, я считаю
0.25-0.5 время генерации страницы это ни о чем не говорящие цифры. Из 0.25 секунды 0.15 может уходить на коннект к БД и еще 0.9 на пхп код, а на запросы к БД допустим 0.01 секунды. Тогда ускорять выборки из БД - ну совсем бессмысленное дело.
Меряйте само время выполнения запросов. Если будет маленькое - то БД вообще не при чем. Если будет большое - показывайте структуру таблиц с индексами и сами запросы со временем их выполнения, а так же explain обязательно сделайте.
От способа построения запросов тоже много зависит, например, если Вам надо выбирать книги какого-то жанра, то в 90% случаев выгоднее будет начать с таблицы жанров, а если надо выбирать просто последние книги прицепляя к ним жанр для информации - разумнее начать с таблицы книг.
Что касается "разных блоков", дык "последние добавленные" это прямой кандидат на кэширование - даже тупо в файл. И вообще очень многие блоки прямые кандидаты на кэширование и вывод без затрагивания базы данных. Это без вопросов надо использовать.
"Случайные" же книги при большом количестве книг в базе и выборке вида order by rand() - может быть запросов сжирающим 99% времени по отношению к остальным, т.к. такой запрос перетряхивает всю базу... случайные книги надо очень вдумчиво выбирать, если выбираете тем способом который мы предположили - переделывайте.
Попробуйте так же ту структуру которую мы предложили, она во многих случаях легче чем та, что у Вас сейчас, ввиду того, что меньше таблиц которые джоинятся. Нормализация БД имеет свой разумный предел.
LEOnidUKG, а как в одну таблицу вместить книгу, у которой много авторов, жанров и издательств?
Как потом выводить книги по определенному автору?
Ну тогда кэш таблица для поиска. Я так понял, что только в нём проблема?
Так же, как написали выше, вы уверены, что это БД тормозит?
Последние книги кеширую.
Случаные книги не жрут ресурса, проверил. Там идет выборка по случайным ID: берем максимальный ID книг и выбираем случайно штук 100 ID, тупо в цикле с помощью mt_rand(1, maxID). Потом убираю дубли ID и вывожу штук 10 книг из этого массива.
Жрет ресурс выборка списка книг по жанрам, при одновременном использовании сортировки
Индекс в таблице books на year_book стоит, в таблице rubric_book на id_book
Если убрать order by, то нормально работает, быстро
Последние книги кеширую.
Случаные книги не жрут ресурса, проверил. Там идет выборка по случайным ID: берем максимальный ID книг и выбираем случайно штук 100 ID, тупо в цикле с помощью mt_rand(1, maxID). Потом убираю дубли ID и вывожу штук 10 книг из этого массива.
Жрет ресурс выборка списка книг по жанрам, при одновременном использовании сортировки
Индекс в таблице books на year_book стоит, в таблице rubric_book на id_book
Если убрать order by, то нормально работает, быстро
Какой-то странный у Вас запрос, где, например, таблица для которой альяс f прописан?
В остальном - попробуйте не на декартовом произведении делать, а на left join-ах, будет быстрее, т.к. меньше данных будет ворошиться изначально. Учитывая Ваш странный запрос прямой пример привести трудно, но если синтетику, то допустим
select books.book_name from category_book left join books on books.id_book=category_book.id_book where category_book.id_category=10 order by books.year_book limit 0,10
Несколько избыточна структура, можно попробовать упростить:
Книги
ID книги
ID жанра
ID автора
ID издателя
Название
Год написания
Краткое содержание
Жанры
ID жанра
Название жанра
Издатели
ID издателя
Имя издателя
Авторы
ID автора
Имя автора
Запрос:
f вместо b написал:) Очепятка
С left join также все, не лучше. Время генерации страницы 0.102 сек, без order by 0.01
---------- Post added 27-08-2012 at 20:22 ----------
vavenko, тогда лишние данные будут в таблице Книги
Будет много книг "Чук и Гек", но с разными жанрами, авторами, издателями
P.s. если прикинуть, что в среднем на одну книгу приходится 2 жанра, 1.5 автора и 3 издательства (цифры от балды, но примерно так и есть), то на таблицу из 100.000 книг будет записей 900.000
---------- Post added 27-08-2012 at 21:17 ----------
P.p.s. добавил STRAIGHT_JOIN и все летает