私の意見は私の意見にすぎず、時には非常にカテゴリー的であるとすぐに言わなければなりません。 いくつかの理由により、負荷の高いサイトや複雑なWebアプリケーションで作業する必要があります。
優先順位と統計を監視するという1つの貴重な経験が、それらに取り組むことから学んだ。 これはどういう意味ですか? それは簡単です:ブログがあり、1日あたりの訪問者が2-3から4-10012百万人で、記事が1日に1から2から3-3435回しか書かれていない(ビューの数よりも1桁少ない)場合、記事を保存する速度記事の表示速度に関するこの複雑さ)は、比例して小さくなる可能性があります。 表示するほど、表示はより重要になり、記事/ページ/表の保存ではありません。 リラックスできるという意味ではありません。 ブログに記事を3〜5〜10秒保存することは妥当性の枠組みの範囲内ですが、2秒以上ページを生成する(+スクリプトと写真付きスタイルが読み込まれている間)は、「サイトが遅くなり、他のことを読みます」 、さらに悪いことに、「別の場所で購入します」。
投票/カルマ、コメント、ページヒットカウンターなどを含む平均的なサイトを取り上げると、多くの開発者はすぐにSELECTカウント(*)FROMコメントWHERE comment.page = page_idのような構造を思いつきます。 さて、評価の量、コメントの量を計算するために各記事について考えてください。 また、メインページには各セクションから10の記事があります。 1秒あたり10人のトラフィックで、平均VPSで、1ページあたりsqlあたり60〜100クエリを実行できます(こんにちは、bitrix)。
しかし、歌詞を地獄に落とすために(おそらく、私はすでにそれを得た)。 裸のデータ:
テーブルブログ
CREATE TABLE IF NOT EXISTS `blog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(128) NOT NULL,
`text` text NOT NULL,
`creation` datetime NOT NULL,
`modification` datetime NOT NULL,
`img` varchar(128) NOT NULL DEFAULT 'default.png',
`status` tinyint(4) NOT NULL DEFAULT '2',
`user_id` int(11) NOT NULL,
`rate` int(11) NOT NULL,
`relax_type` tinyint(4) NOT NULL,
`timers` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`contest` tinyint(1) NOT NULL DEFAULT '0',
`views` int(11) NOT NULL DEFAULT '0',
`comment` int(11) NOT NULL,
`url` varchar(128) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`),
KEY `country_id` (`country_id`),
KEY `user_id` (`user_id`),
KEY `status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1456435 ;
comments
CREATE TABLE IF NOT EXISTS `comments` (
`owner_name` varchar(50) NOT NULL,
`owner_id` int(12) NOT NULL,
`id` int(12) NOT NULL AUTO_INCREMENT,
`parent_id` int(12) DEFAULT NULL,
`user_id` int(12) DEFAULT NULL,
`text` text,
`creation` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`status` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `owner_name` (`owner_name`,`owner_id`),
KEY `parent_id` (`parent_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=243254252 ;
, ( comment).
:
1. —
2. / — .
, — .
, 2 ( 3): ( — («», . .).
, .
: .
:
CREATE TRIGGER `add_count_comment` AFTER INSERT ON `comments`
FOR EACH ROW BEGIN
//
UPDATE user SET user.countcomment= user.countcomment+1 WHERE user.id = NEW.user_id;
//
CASE NEW.`owner_name`
WHEN 'Blog' THEN UPDATE `blog` SET `blog`.`comment` = `blog`.`comment`+1 WHERE `blog`.id = NEW.`owner_id` ;
WHEN 'Article' THEN UPDATE `article` SET `article`.`comment` = `article`.`comment`+1 WHERE `article`.`id` = NEW.`owner_id` ;
WHEN 'PopulatePlace' THEN UPDATE `populate_place` SET `populate_place`.`comment` = `populate_place`.`comment`+1 WHERE `populate_place`.`id` = NEW.`owner_id` ;
END CASE;
//
// url ,
CASE NEW.`owner_name`
WHEN 'Blog' THEN SET userurl = (SELECT url FROM `blog` WHERE `blog`.id= NEW.`owner_id`);
WHEN 'Article' THEN SET userurl = (SELECT url FROM `article` WHERE article.id=NEW.`owner_id`);
WHEN 'PopulatePlace' THEN SET userurl = ``;
END CASE;
// ,
CASE NEW.`owner_name`
WHEN 'Blog' THEN SET usertitle = (select title from `blog` where blog.id=NEW.`owner_id`);
WHEN 'Article' THEN SET usertitle = (select title from `article` where article.id=NEW.`owner_id`);
WHEN 'PopulatePlace' THEN SET usertitle = ` `;
END CASE;
INSERT INTO user_has_events VALUES (NEW.user_id,NEW.id,"Comments",NOW(),userurl , usertitle );
END
:
CREATE TRIGGER `del_count_comment` AFTER DELETE ON `comments`
FOR EACH ROW BEGIN
UPDATE user SET user.countcomment= user.countcomment -1 WHERE user.id = OLD.user_id;
CASE OLD.`owner_name`
WHEN 'Blog' THEN UPDATE `blog` SET `blog`.`comment` = `blog`.`comment`-1 WHERE `blog`.`id` = OLD.`owner_id` ;
WHEN 'Article' THEN UPDATE `article` SET `article`.`comment` = `article`.`comment`-1 WHERE `article`.`id` = OLD.`owner_id` ;
WHEN 'PopulatePlace' THEN UPDATE `populate_place` SET `populate_place`.`comment` = `populate_place`.`comment`-1 WHERE `populate_place`.`id` = OLD.`owner_id` ;
END CASE;
END
, :
1. sql (, , )
2. ( . .)
3. .
4. .
5. ( 1 , «» .)
sphinx , . modification.
:
CREATE TRIGGER `ins_blog` BEFORE INSERT ON `blog`
// «» .
FOR EACH ROW BEGIN
SET NEW.modification = NOW();
END
.
:)
CREATE TRIGGER `ins_blog` BEFORE UPDATE ON `blog`
// «» .
FOR EACH ROW BEGIN
SET NEW.modification = NOW();
END
— .
sql — . sql , .
UPD: .