トリガー-救世主

インターネットには既にsqlトリガーに関する多くの記事がありますが、「主題」にある人々のために資料を修正し、Zen sqlを理解し始めたばかりの人々のために資料をよりよく理解するために適切な例をもう1つ追加します。 同時に、トピックに関するディスカッションを作成します。



私の意見は私の意見にすぎず、時には非常にカテゴリー的であるとすぐに言わなければなりません。 いくつかの理由により、負荷の高いサイトや複雑な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: .



All Articles