Как в Mysql вынести shows, views и ctr в отдельную таблицу?

Я еще только изучаю php и mysql. Есть база:
CREATE TABLE `site_posts` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `url` varchar(255) NOT NULL,
 `title` varchar(255) NOT NULL,
 `img` varchar(255) NOT NULL,
 `tags` tinytext NOT NULL,
 `views` int(11) NOT NULL,
 `shows` int(11) NOT NULL,
 `ctr` float NOT NULL,
 `status` char(16) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `status` (`status`),
 KEY `ctr` (`ctr`),
 KEY `shows` (`shows`),
 KEY `views` (`views`),
 KEY `title` (`title`)
) ENGINE=InnoDB

На страницах делаю вывод постов по уменьшению ctr. Потом увеличиваю показ на 1 и пересчитываю ctr.
SELECT * FROM site_posts WHERE status='on' ORDER BY ctr DESC LIMIT 50;
UPDATE site_posts SET shows = shows + 1 WHERE id IN ($ids);
UPDATE site_posts SET ctr = (views/shows) WHERE id IN ($ids);


Решил вынести views, shows и ctr в отдельную таблицу.
CREATE TABLE `site_ctr` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `views` int(11) NOT NULL,
 `shows` int(11) NOT NULL,
 `ctr` float NOT NULL,
 PRIMARY KEY (`id`),
 KEY `ctr` (`ctr`),
 KEY `views` (`views`),
 KEY `shows` (`shows`)
) ENGINE=InnoDB


Теперь делаю вывод и подсчеты так:
SELECT * FROM site_posts, site_ctr WHERE site_posts.id = site_ctr.id AND status='on' ORDER BY ctr DESC LIMIT 35;

UPDATE site_ctr SET shows = shows + 1 WHERE id IN ($ids);
UPDATE site_ctr SET ctr = (views/shows) WHERE id IN ($ids);


Стало работать на порядок медленней. Почему?
Получается, что не надо выносить views, shows и ctr в отдельную таблицу?
Или я что-то делаю не так?
  • Вопрос задан
  • 2558 просмотров
Решения вопроса 2
AloneCoder
@AloneCoder
[object Object]
Выносить отдельно в этом конкретном случае смысла особо не было
Работает медленнее потому что появился JOIN
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
0) вы сами ещё не путаетесь, что есть shows, а что - views? На мой взгляд это синонимы.
1) если у вас связь 1:1, то почему оба id сделаны AI?
2) работать стало медленнее - в цифрах, с расстановкой, с измерением, который из запросов стал требовать больше ресурсов.
3) вопросы по производительности select'а без explain'а задавать неправильно. explain update - понимаю, только в mysql5.6 появился, ещё могли не обновиться.
4) Зачем вообще два апдейта?
UPDATE site_ctr SET shows = shows + 1, ctr = (views/(shows+1)) WHERE id IN ($ids);


PS: не придираюсь
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы