Оптимизация?! Пожайлуста без FAQ!

Flanker

незнайка
Оптимизация?! Пожайлуста без FAQ!

Подскажите как выбрать принцип построения баз данных!
Выскажите свое мнение!
>мое мнение: больше таблиц с меньшей информацией(в разумных рамках)
+скорость
-(иногда) тяжесть в манипуляции

<Это только мое мнение, на сколько я понимаю работу баз>
<=Один человек пытаеться опровергнуть эту теорию, пока что я ему верю потому, что он старше, у него больше опыт работы, он за это получает бешенные деньги, больше причин нету.

Помогите найти истину!

Спасибо.
 

Flanker

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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: Фанат
проверь практикой
Это не практический вопрос, а "Есть ли жизнь на Марсе". Когда нужен практический ответ - задают практический вопрос и приводят структуру данных.
А в данном случае - темы для обсуждения под пивко закончились :)
 

Flanker

незнайка
grigori,Фанат какие ваши первоночальные принципы при построении баз данных.
 

440hz

php.ru
какие ваши первоночальные принципы при построении баз данных
использование предыдущего опыта работы.
ИМХО для одних и тех же целей можно использовать и одну большую таблицу и несколько маленьких нормализованных.

все зависит от задачи.
+ хорошее тестирование.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: Flanker
grigori,Фанат какие ваши первоночальные принципы при построении баз данных.
Я делаю анализ бизнес-процессов заказчика, на основе которого составляю спецификацию. Понимая задачу, я понимаю требования к производительности.

Например, приходит человек и говорит - хочу систему, которая сможет обслуживать 40 млн пользователей... Точно зная, что именно система должна делать, я придумываю как её построить.

-~{}~ 04.08.06 17:41:

Автор оригинала: Clubber
Flanker
лично я стараюсь хранить данные 3-й нормальной форме. Иногда, правда, отступаю от этого правила.
У меня был случай, когда файл индекса занимал больше, чем данные - 500 Мб при 200 Мб данных.
Это была реальная проблема, из-за которой пришлось менять структуру.
А 3я нормальная или 2я - это фигня.

В доке по MySQL где-то было написано, что в случае, когда небольшое дублирование повышает скорость - это надо делать.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: Clubber
grigori
Т.е. сделать так, чтобы кол-во данных было тоже равно 500мб? :)
Именно! ... по крайней мере бояться конкуренции мне не стоит.
 

Кром

Новичок
Flanker
А вот некоторые зажигают газовую плиту спичками, а некоторые зажигалкой. А у некоторых есть такая штука для высекания искры. А у некоторых в плите есть высекание искры. А у некоторых плиты электрические. А некоторы варят суп в котелке прямо на костре. А что лучше?
Выскажи свое мнение! Только пожайлуста без FAQ!
 

Pustota

Новичок
В общем, сам задался таким вопросом про оптимизацию... И вот что нарыл (сори, если где-то уже было, просто человек спросил - вот и решил ему прямо ответить).
У самого база порядка 4,5-5 миллионов записей. Постоянно добавлялись новые записи, старые удалялись.
В связи с чем помогает раз в неделю команда
"OPTIMIZE table имя_таблицы".
Потом, при запросах с использованием нескольких таблиц, делаю объединение "LEFT JOIN таблица ON (ключ=ключ)...". Получается быстрее, нежели просто связывать таблицы через WHERE.
Далее. Запросы, которые долго выводятся можно проанализировать: В начале запроса перед SELECT'ом вставить EXPLAIN. Выводит краткий анализ запроса, какие таблицы, ключи используются, сколько строк просматривает при запросе. И по этому надо смотреть чтобы их как можно меньше было, а объединение было по ключевым словам. Если это невозможно - проиндексировать эти поля.
Ну, ещё использовать поменьше запросов. Лучше всё объединить в один, чем выводить по несколько запросов. Моя недавняя ошибка была в том, что я использовал ещё один запрос для подсчёта количества выбранных строк. То есть сначала делал "SELECT count(*) from таблица WHERE ...", и потом сам запрос с таким же WHERE. На что у меня уходило почти в два раза больше времени. Теперь просто в запросе вставляю после SELECT и перед выводом нужных строк SQL_CALC_FOUND_ROWS. А после выполнения запроса делаю:
"SELECT FOUND_ROWS()". Там у меня и хранится количество строк.
Если сервер свой, то можно поконфигурировать настройки переменный MySQL.
"SHOW VARIABLES LIKE '%query_cache%';"
значение query_cache_size устанавливает, сколько мегабайт памяти будет отвтодиться по кэш,
query_cache_type устанавливает этот самый кэш. Использовать его или нет.
Думаю, ответ тут очевиден.
Ну вот пока всё. Не пинать сильно, сам пока только разбираюсь. Если кто заметил неточности или дополнит - буду только рад прочесть.
 

zarus

Хитрожопый макак
Ну, ещё использовать поменьше запросов. Лучше всё объединить в один, чем выводить по несколько запросов. Моя недавняя ошибка была в том, что я использовал ещё один запрос для подсчёта количества выбранных строк. То есть сначала делал "SELECT count(*) from таблица WHERE ...", и потом сам запрос с таким же WHERE. На что у меня уходило почти в два раза больше времени. Теперь просто в запросе вставляю после SELECT и перед выводом нужных строк SQL_CALC_FOUND_ROWS. А после выполнения запроса делаю:
"SELECT FOUND_ROWS()". Там у меня и хранится количество строк.
Попродробнее и посвязнее, пожалуйста...
И как в этому случае делать постраничный вывод?
 

akd

dive now, work later
Команда форума
zarus, использовать "LIMIT count OFFSET skip" вместо "LIMIT skip, count". я проверил, так работает.

сорри, за диггерство :)
 

Mayhem

Новичок
akd, проблема не в этом, а в том как получить общее количество записей до непосредственной их выборки...

например: в таблице 100 записей выводятся по 20 на странице... я хочу чтобы если пользователь захочет отобразить несуществующую страницу (шестую например), то не выводился читый лист, а, скажем, первая страница... как это реализовать с подходом SQL_CALC_FOUND_ROWS / SELECT_FOUND_ROWS() ? по-моему никак...
 

akd

dive now, work later
Команда форума
Mayhem, тебе не кажется, что твоя проблема к данному топику не имеет никакого отношения? :)
 

Mayhem

Новичок
akd, да.. сам только что хотел дописать, что оффтоп пошел жесткий :) Мне просто показалось, что zarus именно этот вопрос имел ввиду...
 
Сверху