Форумы портала PHP.SU » » Работа с СУБД » Нужен ли индекс если в таблице всего одна строка?

Страниц (1): [1]
 

1. Andrew73 - 19 Июля, 2011 - 22:44:46 - перейти к сообщению
Доброго времени суток.
Понимаю, что не нужен, но все же спрошу у гуру:
Таблица, в которой хранится статистика (вместо 2-х запросов COUNT(*) )
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. CREATE TABLE `count` (
  3. `user` INT( 10 ) UNSIGNED NOT NULL DEFAULT '1',
  4. `topic` INT( 10 ) UNSIGNED NOT NULL DEFAULT '1'
  5. ) ENGINE = MYISAM;
  6. INSERT INTO `count` (`user`, `topic`) VALUES ('34255', '344958');
  7.  


запись всего одна, добавление идет как
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. UPDATE `count` SET `user`=`user`+1;
  3.  

Нужен ли индекс к этим полям или нет?

Спасибо.
2. evgenijj - 19 Июля, 2011 - 23:31:43 - перейти к сообщению
Жесть. Пусть у нас есть три таблицы БД:
1. пользователи сайта users: user_id, name, email, info
2. темы topic (топики) форума
3. и таблица типа "один->ко многим" user_id, topic_id

Если пользователь user_id=1234 создает тему topic_id=5678, то почему в таблице связей мы должны все порушить, выполнив запрос
UPDATE `user_topic` SET `user_id`=`user_id`+1;


Поясню. Допустим, у нас есть таблица связей user_topic
CODE (text):
скопировать код в буфер обмена
  1. user_id | topic_id
  2. --------------------
  3. 1234    | 5678
  4. 1234    | 5679
  5. 1235    | 5680
  6. 1235    | 5681


Т.е. пользователь user_id=1234 создал две темы на форуме: 5678 и 5679. А пользователь user_id=1235 создал темы 5680 и 5681.

После выполнения запроса UPDATE `user_topic` SET `user_id`=`user_id`+1 мы получим

CODE (text):
скопировать код в буфер обмена
  1. user_id | topic_id
  2. --------------------
  3. 1235    | 5678
  4. 1235    | 5679
  5. 1236    | 5680
  6. 1236    | 5681


Т.е. безнадежно испортим user_topic
3. Andrew73 - 19 Июля, 2011 - 23:44:45 - перейти к сообщению
не много не так.
в этой таблице - статистика количества юзеров и топиков.
и там будет всего одна строка.
это не кросс-таблица
4. evgenijj - 19 Июля, 2011 - 23:50:32 - перейти к сообщению
Цитата:
в этой таблице - статистика количества юзеров и топиков.
и там будет всего одна строка.

В самом деле? А зачем вообще эта таблица? Количество пользователей мы знаем, количество топиков -- тоже. Потому как есть таблицы users и topics.
5. Andrew73 - 20 Июля, 2011 - 00:00:52 - перейти к сообщению
не хочется часто дергать
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT COUNT(*) FROM `user` WHERE....
  3.  
  4. SELECT COUNT(*) FROM `topic` WHERE....
  5.  

К тому же WHERE накладывают и по скорости опечаток

а так при каждом INSERT делаю отложенный UPDATE
зато я могу аккуратно брать статистику каждые 10 секунд и выводить динамический счетчик
6. evgenijj - 20 Июля, 2011 - 00:15:30 - перейти к сообщению
Врать не буду -- как лучше сделать, не знаю. Я так понимаю, нагрузка очень большая? По расписанию запускать скрипт, который будет брать два значения
SELECT COUNT(*) FROM `user` WHERE 1
SELECT COUNT(*) FROM `topic` WHERE 1
и записывать их в файл? Максимальная частота -- один раз в минуту. Но есть ли в этом необходимость? Так ли уж важно 12345678/23456789=0.526 или 0.527?

Или это теоретическая задача?

 

Powered by ExBB FM 1.0 RC1