Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Нужен ли индекс если в таблице всего одна строка?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Andrew73
Отправлено: 19 Июля, 2011 - 22:44:46
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2010  


Помог: 1 раз(а)




Доброго времени суток.
Понимаю, что не нужен, но все же спрошу у гуру:
Таблица, в которой хранится статистика (вместо 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.  

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

Спасибо.
 
 Top
evgenijj
Отправлено: 19 Июля, 2011 - 23:31:43
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Жесть. Пусть у нас есть три таблицы БД:
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
 
 Top
Andrew73
Отправлено: 19 Июля, 2011 - 23:44:45
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2010  


Помог: 1 раз(а)




не много не так.
в этой таблице - статистика количества юзеров и топиков.
и там будет всего одна строка.
это не кросс-таблица
 
 Top
evgenijj
Отправлено: 19 Июля, 2011 - 23:50:32
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Цитата:
в этой таблице - статистика количества юзеров и топиков.
и там будет всего одна строка.

В самом деле? А зачем вообще эта таблица? Количество пользователей мы знаем, количество топиков -- тоже. Потому как есть таблицы users и topics.

(Отредактировано автором: 19 Июля, 2011 - 23:51:36)

 
 Top
Andrew73
Отправлено: 20 Июля, 2011 - 00:00:52
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2010  


Помог: 1 раз(а)




не хочется часто дергать
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT COUNT(*) FROM `user` WHERE....
  3.  
  4. SELECT COUNT(*) FROM `topic` WHERE....
  5.  

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

а так при каждом INSERT делаю отложенный UPDATE
зато я могу аккуратно брать статистику каждые 10 секунд и выводить динамический счетчик
 
 Top
evgenijj
Отправлено: 20 Июля, 2011 - 00:15:30
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




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

Или это теоретическая задача?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB