Оптимизация базы данных..

12 3
[Удален]
1174

Добрый день, Уважаемые специалисты!

Помогите пожалуйста разобраться и найти пусть в следующем вопросе:

Есть например таблица почти в миллион строк:

table sms (myisam)

id int

people_in int (связь на табличку с юзерами)

people_out int (связь на табличку с юзерами)

tema char (50)

core text

dt datetime

в которой содержаться сообщения от пользователей (от кого и кому).. в пике при частых insert новых строк и удалении прочитанных, происходят задержка в чтении..

Как грамотно организовать дальнейшую разработку и масштабируемость, если мне как раз и необходимо читать из неё то что было добавлено.. Ведь кол-во insert будеn расти и она будет падать.. Перевод на транзакции? Но это размер будет расти, а для того чтобы достать одну свежую последнюю запись нужно будет смотреть по всей таблице! Не вариант, разбить на партишены? Да можно, но это тоже временный выход..

Каким образом это например делает на крупных проектах, если база на одном сервере и если база на двух и более?

Второй вопрос:

Есть табличка people

id int

name char(40)

last_time (время в секундах от 1970)

в поле last_time делает update текущего времени при заходе пользователя на половине страниц.

Табличка участвует практически в каждых запросах на сайте (отобразить сообщения, статьи, дневники и прочее), чтобы было видно этот участник в сети или нет. Соответственно при высокой нагрузке updatов больше и происходит lock по селекту.. Какой здесь путь масштабируемости? Где хранить данные о посещении и как и как их использовать в частых запросах?

Поделитесь пожалуйста опытом, а то я только начинаю, и уже уткнулся в стопор..

Заранее благодарен!

T.R.O.N
На сайте с 18.05.2004
Offline
314
#1
Senator007:
Каким образом это например делает на крупных проектах, если база на одном сервере и если база на двух и более?

1. переходят с мускула на что-то серьезней, тот-же MsSql....

2. Есть понятие кластерные сервера...

3. Можно искать умные решения.. например.. делать базу, где хранится только актуальная информация, допустим за последние неделю/сутки/час, в конце дня ее переливать в общую, аля архив...

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

Senator007:
Второй вопрос:

тут вообще бред

знание пыха и мускулу на дает знаний в программировании. Понимаете?

Зачем так насиловать базу? Для этого есть сессии. А когда она заканчивается - информация один раз вписывается в базу...

T.R.O.N добавил 12.02.2010 в 12:38

Senator007:
Поделитесь пожалуйста опытом, а то я только начинаю, и уже уткнулся в стопор..

потому что начали изучать программирование не с информационных технологий а с языка

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
S
На сайте с 15.07.2008
Offline
30
#2
Senator007:
Добрый день, Уважаемые специалисты!

Помогите пожалуйста разобраться и найти пусть в следующем вопросе:
Есть например таблица почти в миллион строк:

table sms (myisam)
id int
people_in int (связь на табличку с юзерами)
people_out int (связь на табличку с юзерами)
tema char (50)
core text
dt datetime

в которой содержаться сообщения от пользователей (от кого и кому).. в пике при частых insert новых строк и удалении прочитанных, происходят задержка в чтении..

Как грамотно организовать дальнейшую разработку и масштабируемость, если мне как раз и необходимо читать из неё то что было добавлено.. Ведь кол-во insert будеn расти и она будет падать.. Перевод на транзакции? Но это размер будет расти, а для того чтобы достать одну свежую последнюю запись нужно будет смотреть по всей таблице! Не вариант, разбить на партишены? Да можно, но это тоже временный выход..
Каким образом это например делает на крупных проектах, если база на одном сервере и если база на двух и более?

Варианты:

1. INSERT DELAYED в помощь в случае использования MyISAM

2. Использование InnoDB

Транзакции тут ни при чём. Проблема в уровне изоляции и умении движка делать row-lock.

Senator007:
Второй вопрос:

Есть табличка people

id int
name char(40)
last_time (время в секундах от 1970)

в поле last_time делает update текущего времени при заходе пользователя на половине страниц.
Табличка участвует практически в каждых запросах на сайте (отобразить сообщения, статьи, дневники и прочее), чтобы было видно этот участник в сети или нет. Соответственно при высокой нагрузке updatов больше и происходит lock по селекту.. Какой здесь путь масштабируемости? Где хранить данные о посещении и как и как их использовать в частых запросах?

Поделитесь пожалуйста опытом, а то я только начинаю, и уже уткнулся в стопор..
Заранее благодарен!

Грамотно это делается через memcached. Заводится шаред массив с активными сессиями пользователей. Дальше начинаются вариации в зависимости от постановки задачи.

Santyago добавил 12.02.2010 в 12:57

T.R.O.N:
1. переходят с мускула на что-то серьезней, тот-же MsSql....
2. Есть понятие кластерные сервера...
3. Можно искать умные решения.. например.. делать базу, где хранится только актуальная информация, допустим за последние неделю/сутки/час, в конце дня ее переливать в общую, аля архив...

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

А ещё, говорят, бывают велосипеды с квадратными колёсами...

Банки Украины (http://www.bankstore.com.ua) Генератор сайтмепов (/ru/forum/272468) Ода Гугльботу (/ru/forum/285758)
[Удален]
#3
T.R.O.N:

тут вообще бред
знание пыха и мускулу на дает знаний в программировании. Понимаете?
Зачем так насиловать базу? Для этого есть сессии. А когда она заканчивается - информация один раз вписывается в базу...

T.R.O.N добавил 12.02.2010 в 12:38

потому что начали изучать программирование не с информационных технологий а с языка

как мне из папки темп где сессии ловить время окончания? Ведь пользователи не всегда жмут на кнопку выход чтобы, отменить это в базе.. Как мне узнать что сессия замолчала и нужно такому-то юзеру отметить флаг offline?

N
На сайте с 06.05.2007
Offline
419
#4
Перевод на транзакции? Но это размер будет расти, а для того чтобы достать одну свежую последнюю запись нужно будет смотреть по всей таблице!

здесь непонятно. неужели нельзя индекс добавить ?

1. а есть ли смысл часто удалять ? иногда выгоднее вставлять пометку об удалении в отдельную таблицу и потом объединять. Удаление же сделать периодической задачей.

Попробуйте переписать запросы вывода на union основной таблицы myisam и небольшой буферной innodb.

Это комбинирует преимущества "легкой" вставки в innodb и выгодного компактного хранилища myisam.

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

2. очевидно, нужно периодически подчищать сессии. в mysql 5.1 появилось что-то типа cron. может вам понравится.

И вместо memcache попробуйте для начала engine=memory. Функции те же, производительность почти та же, но sql-интерфейс вам уже знаком.

Кнопка вызова админа ()
T.R.O.N
На сайте с 18.05.2004
Offline
314
#5
Senator007:
как мне из папки темп где сессии ловить время окончания

а причем тут папка? Данные сессии просто исчезнут, когда сессия заканчивается... (если кривые руки не изменят настройки)

как делать именно на пыхе, никогда не интересовался.. об окончании сессии возникает событие сервера. Для IIS это Session_OnEnd.... об аппачи - читайте

Santyago:
Грамотно это делается через memcached. Заводится шаред массив с активными сессиями пользователей

и сервак ложиться по переполнению памяти... оченнь круглые колеса

S
На сайте с 15.07.2008
Offline
30
#6
T.R.O.N:
а причем тут папка? Данные сессии просто исчезнут, когда сессия заканчивается... (если кривые руки не изменят настройки)
как делать именно на пыхе, никогда не интересовался.. об окончании сессии возникает событие сервера. Для IIS это Session_OnEnd.... об аппачи - читайте

При чём тут Апач? Сессии организовываются движком PHP. Никаких событий на эту тему этот движок не генерирует. Перед тем как посоветовать очередную глупость, неплохо было бы хоть чуть-чуть в теме разбираться.

T.R.O.N:
и сервак ложиться по переполнению памяти... оченнь круглые колеса

Ничего личного, но это очередная глупость.

T.R.O.N
На сайте с 18.05.2004
Offline
314
#7
Santyago:
Ничего личного, но это очередная глупость.

Ваша, дорогой человек

Santyago:
При чём тут Апач? Сессии организовываются движком PHP. Никаких событий на эту тему этот движок не генерирует.

я поэтому и сказал, что пыхом не знаимаюсь... Аппач имеет свои сессии, как почти и любой иной веб сервер (иначе оно просто захлебнется)..

Даже у старенького перла была библиотека для работы с ними Apache::Session

А то что пых стал движком... это супер. Ждите, бирман придет.. он такое любит

N
На сайте с 06.05.2007
Offline
419
#8

Ну если на сайте миллионы сессий одновременно, то может и ляжет, а так глупость.

Apache::Session не работает с сессиями apache. Это просто удобное хранилище сессий созданное в основном для mod_perl, причем ему требуется какой-то механизм хранения данных сессии на выбор.

S
На сайте с 15.07.2008
Offline
30
#9
T.R.O.N:
Ваша, дорогой человек

Утверждение о том, что "сервак ложиться по переполнению памяти" из-за использования memcached - это полная некомпетентность и "сказать абы что сказать".

T.R.O.N:
я поэтому и сказал, что пыхом не знаимаюсь... Аппач имеет свои сессии, как почти и любой иной веб сервер (иначе оно просто захлебнется)..
Даже у старенького перла была библиотека для работы с ними Apache::Session

Феерическая некомпетентность. Не позортесь, молодой человек.

T.R.O.N:
А то что пых стал движком... это супер. Ждите, бирман придет.. он такое любит

Вам знакомо устоявшееся в узких кругах выражение "PHP engine"? Ну, да... Вы же не "пыхом не занимаетесь"... Тогда может хватить позориться или очень хочется поспорить?

P
На сайте с 08.03.2007
Offline
250
#10

<удалено, так как все уже высказались об этом>

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий