데이터 베이스 MySQL 튜토리얼 通过触发器实现物化视图_MySQL

通过触发器实现物化视图_MySQL

Jun 01, 2016 pm 01:41 PM
얼마나 사용자 방아쇠

bitsCN.com
通过触发器实现物化视图 在电商平台中,我们有时需要对用户订单进行一些聚合计算,如订单总数有多少,总金额有多少,平均价格是多少,而实现这个特性基本有下面几个办法: 一, 每次查询这些聚合信息的时候,直接执行SQL语句的sum,avg,count等,好处是实现简单,不足是每次均需要进行扫表查询,特别是订单变更比较少,而查询比较多的情况下,此方法会浪费不少的机器资源。 二, 新建一个聚合表,当有订单增删改的时候,通过程序进行计算新的聚合信息,然后存储到该聚合表,每次查询的时候只需查询对应计算好的记录即可,好处是查询非常简单,不足是需要应用程序进行同步聚合信息,且如果订单库操作整个,而聚合库失败,则需要保证数据的一致性。 三,利用DB的触发器实现物化视图的方式,好处是数据的同步交给db 去保证,应用程序无需关注,并且若触发器执行失败,则对应的源表操作也会回滚,不足是需要开发对应的触发器程序。本文主要说明用触发器实现这样的一个特性,为了更好的说明如何创建的过程,我们举了这样一个例子,该例子已经在mysql全部调试通过。          1, 新建一个订单表             drop table orders if exists;            create table orders (                        order_id  int unsigned not null auto_increment,                        product_name varchar(30) not null,                        price  decimal(8,2) not null,                        amount smallint not null,                        primary key (order_id)             )engine=innodb;       2,创建一个存储聚合信息的表            drop table orders_mv if exists;           create table orders_mv (                        product_name varchar(30) not null,                        price_sum decimal(8,2) not null,                        amount_sum int not null,                        price_avg float not null,                        orders_cnt int not null,                        unique key product_name(product_name)  //因为需要按照产品名字聚合,这里把product_name作为唯一key进行去重           ) engine=innodb;           3,为表orders创建after insert的触发器             首先说明一下如何查看一个表中是否已经创建了哪些触发器:
                       select * from information_schema.TRIGGERS where event_object_table='tbl_name'/G             drop trigger tgr_orders_insert;             delimiter $$            create trigger tgr_orders_insert            after insert on orders            for each row            begin                   set @old_price_sum  = 0;                   set @old_amount_sum = 0;                   set @old_price_avg  = 0;                   set @old_orders_cnt = 0;                    select IFNULL(price_sum, 0), IFNULL(amount_sum, 0), IFNULL(price_avg, 0), IFNULL(orders_cnt, 0)                  from orders_mv                  where product_name = NEW.product_name                  into @old_price_sum, @old_amount_sum, @old_price_avg, @old_orders_cnt;                   set @new_price_sum  = @old_price_sum + NEW.price;                  set @new_amount_sum = @old_amount_sum + NEW.amount;                  set @new_orders_cnt = @old_orders_cnt + 1;                  set @new_price_avg  = @new_price_sum / @new_orders_cnt;                  replace into orders_mv                 values (NEW.product_name, @new_price_sum, @new_amount_sum, @new_price_avg, @new_orders_cnt);            end;               $$           delimiter ;         4,为表orders创建after update的触发器            drop trigger tgr_orders_update;            delimiter $$           create trigger tgr_orders_update           after update on orders           for each row           begin                        if (STRCMP(OLD.product_name, NEW.product_name)) then                                  update orders_mv                          set                           price_sum  = (price_sum  - OLD.price),                           amount_sum = (amount_sum - OLD.amount),                          orders_cnt = (orders_cnt - 1),                              //错误,此时的price_sum已经是新值, 不能重新 -OLD.price + NEW.price                          //price_avg  = (price_sum - OLD.price) / IF((orders_cnt-1)>0, (orders_cnt-1), 1)                           price_avg  =  price_sum /IF(orders_cnt>0, orders_cnt, 1)                           where product_name = OLD.product_name;                           set @old_price_sum  = 0;                         set @old_amount_sum = 0;                         set @old_price_avg  = 0;                         set @old_orders_cnt = 0;                           select IFNULL(price_sum, 0), IFNULL(amount_sum, 0), IFNULL(price_avg, 0), IFNULL(orders_cnt, 0)                             from orders_mv                         where product_name = NEW.product_name                         into @old_price_sum, @old_amount_sum, @old_price_avg, @old_orders_cnt;                          set @new_price_sum  = @old_price_sum + NEW.price;                         set @new_amount_sum = @old_amount_sum + NEW.amount;                         set @new_orders_cnt = @old_orders_cnt + 1;                         set @new_price_avg  = @new_price_sum / @new_orders_cnt;                          replace into orders_mv                         values (NEW.product_name, @new_price_sum, @new_amount_sum, @new_price_avg, @new_orders_cnt);                      else                          update orders_mv                         set                          price_sum  = (price_sum  - OLD.price + NEW.price),                          amount_sum = (amount_sum - OLD.amount + NEW.amount),                                     //错误,此时的price_sum已经是新值, 不能重新 -OLD.price + NEW.price                        //price_avg  = (price_sum  - OLD.price + NEW.price) /IF(orders_cnt>0,orders_cnt,1)                            price_avg  = price_sum /IF(orders_cnt>0,orders_cnt,1)                                where product_name = OLD.product_name;                    end if;             end;           $$          delimiter ;         5,为表orders创建after delete的触发器             drop trigger tgr_orders_delete;              delimiter $$             create trigger tgr_orders_delete             after delete on orders             for each row             begin                                    update orders_mv                      set                       price_sum  = (price_sum  - OLD.price),                       amount_sum = (amount_sum - OLD.amount),                      orders_cnt = (orders_cnt - 1),                              price_avg  =  price_sum /IF(orders_cnt>0, orders_cnt, 1)                       where product_name = OLD.product_name;                 end;            $$           delimiter ;   作者 tenfyguo bitsCN.com

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Xiaohongshu 계정을 사용하여 사용자를 찾는 방법은 무엇입니까? 내 휴대폰 번호를 찾을 수 있나요? Xiaohongshu 계정을 사용하여 사용자를 찾는 방법은 무엇입니까? 내 휴대폰 번호를 찾을 수 있나요? Mar 22, 2024 am 08:40 AM

소셜 미디어의 급속한 발전으로 Xiaohongshu는 가장 인기 있는 소셜 플랫폼 중 하나가 되었습니다. 사용자는 Xiaohongshu 계정을 만들어 자신의 개인 신원을 표시하고 다른 사용자와 소통하고 상호 작용할 수 있습니다. 사용자의 Xiaohongshu 번호를 찾으려면 다음의 간단한 단계를 따르세요. 1. Xiaohongshu 계정을 사용하여 사용자를 찾는 방법은 무엇입니까? 1. Xiaohongshu 앱을 열고 오른쪽 하단에 있는 "검색" 버튼을 클릭한 다음 "메모" 옵션을 선택합니다. 2. 노트 목록에서 찾고자 하는 사용자가 게시한 노트를 찾아보세요. 클릭하시면 메모 세부정보 페이지로 이동합니다. 3. 노트 상세페이지에서 해당 사용자의 아바타 아래 '팔로우' 버튼을 클릭하여 해당 사용자의 개인 홈페이지로 진입합니다. 4. 이용자 개인 홈페이지 우측 상단의 점 3개 버튼 클릭 후 '개인정보' 선택

Windows 11에 로컬 사용자 및 그룹이 없습니다: 추가하는 방법 Windows 11에 로컬 사용자 및 그룹이 없습니다: 추가하는 방법 Sep 22, 2023 am 08:41 AM

로컬 사용자 및 그룹 유틸리티는 컴퓨터 관리에 내장되어 있으며 콘솔에서 또는 독립적으로 액세스할 수 있습니다. 그러나 일부 사용자는 Windows 11에 로컬 사용자 및 그룹이 누락되어 있음을 발견합니다. 액세스 권한이 있는 일부 사용자에게는 이 스냅인이 이 버전의 Windows 10에서 작동하지 않을 수 있다는 메시지가 표시됩니다. 이 컴퓨터의 사용자 계정을 관리하려면 제어판의 사용자 계정 도구를 사용하십시오. 이 문제는 Windows 10의 이전 버전에서 보고되었으며 일반적으로 사용자 측의 문제 또는 감독으로 인해 발생합니다. Windows 11에서 로컬 사용자 및 그룹이 누락되는 이유는 무엇입니까? Windows Home 버전을 실행 중이며 Professional 버전 이상에서는 로컬 사용자 및 그룹을 사용할 수 있습니다. 활동

슈퍼유저로 Ubuntu에 로그인 슈퍼유저로 Ubuntu에 로그인 Mar 20, 2024 am 10:55 AM

Ubuntu 시스템에서는 루트 사용자가 일반적으로 비활성화되어 있습니다. 루트 사용자를 활성화하려면 passwd 명령을 사용하여 비밀번호를 설정한 다음 su- 명령을 사용하여 루트로 로그인할 수 있습니다. 루트 사용자는 무제한 시스템 관리 권한을 가진 사용자입니다. 그는 파일, 사용자 관리, 소프트웨어 설치 및 제거, 시스템 구성 변경에 액세스하고 수정할 수 있는 권한을 가지고 있습니다. 루트 사용자와 일반 사용자 사이에는 분명한 차이가 있습니다. 루트 사용자는 시스템에서 가장 높은 권한과 더 넓은 제어 권한을 갖습니다. 루트 사용자는 일반 사용자가 할 수 없는 중요한 시스템 명령을 실행하고 시스템 파일을 편집할 수 있습니다. 이 가이드에서는 Ubuntu 루트 사용자, 루트로 로그인하는 방법, 일반 사용자와 어떻게 다른지 살펴보겠습니다. 알아채다

Windows 11 가이드 살펴보기: 기존 하드 드라이브의 사용자 폴더에 액세스하는 방법 Windows 11 가이드 살펴보기: 기존 하드 드라이브의 사용자 폴더에 액세스하는 방법 Sep 27, 2023 am 10:17 AM

권한으로 인해 특정 폴더에 항상 액세스할 수 있는 것은 아닙니다. 오늘 가이드에서는 Windows 11의 기존 하드 드라이브에 있는 사용자 폴더에 액세스하는 방법을 보여 드리겠습니다. 프로세스는 간단하지만 드라이브 크기에 따라 시간이 걸릴 수 있으며 때로는 몇 시간이 걸릴 수도 있으므로 인내심을 갖고 이 가이드의 지침을 자세히 따르십시오. 기존 하드 드라이브에 있는 사용자 폴더에 액세스할 수 없는 이유는 무엇입니까? 사용자 폴더는 다른 컴퓨터의 소유이므로 수정할 수 없습니다. 이 폴더에 대한 소유권 외에는 어떤 권한도 없습니다. 오래된 하드 드라이브에서 사용자 파일을 여는 방법은 무엇입니까? 1. 폴더 소유권을 가져오고 권한을 변경합니다. 이전 사용자 디렉터리를 찾아 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다. "안"으로 이동

sudo란 무엇이며 왜 중요한가요? sudo란 무엇이며 왜 중요한가요? Feb 21, 2024 pm 07:01 PM

sudo(수퍼유저 실행)는 일반 사용자가 루트 권한으로 특정 명령을 실행할 수 있도록 하는 Linux 및 Unix 시스템의 핵심 명령입니다. sudo의 기능은 주로 다음 측면에 반영됩니다. 권한 제어 제공: sudo는 사용자에게 일시적으로 수퍼유저 권한을 얻을 수 있는 권한을 부여하여 시스템 리소스와 민감한 작업을 엄격하게 제어합니다. 일반 사용자는 필요할 때만 sudo를 통해 임시 권한을 얻을 수 있으며, 항상 슈퍼유저로 로그인할 필요는 없습니다. 향상된 보안: sudo를 사용하면 일상적인 작업 중에 루트 계정을 사용하지 않아도 됩니다. 모든 작업에 루트 계정을 사용하면 올바르지 않거나 부주의한 작업에는 전체 권한이 부여되므로 예기치 않은 시스템 손상이 발생할 수 있습니다. 그리고

튜토리얼: Ubuntu 시스템에서 일반 사용자 계정을 삭제하는 방법은 무엇입니까? 튜토리얼: Ubuntu 시스템에서 일반 사용자 계정을 삭제하는 방법은 무엇입니까? Jan 02, 2024 pm 12:34 PM

Ubuntu 시스템에 많은 사용자가 추가되었습니다. 더 이상 사용하지 않는 사용자를 삭제하고 싶습니다. 아래의 자세한 튜토리얼을 살펴보겠습니다. 1. 터미널 명령줄을 열고 userdel 명령을 사용하여 지정된 사용자를 삭제합니다. 2. 삭제 시 반드시 일반 사용자 디렉터리에 있어야 합니다. 아래 그림과 같이 이 권한이 없습니다. 3. 삭제 명령을 실행한 후 실제로 삭제되었는지 어떻게 판단할 수 있나요? 다음으로 아래 그림과 같이 cat 명령을 사용하여 passwd 파일을 엽니다. 4. 삭제된 사용자 정보가 더 이상 passwd 파일에 없는 것을 볼 수 있으며 이는 아래 그림과 같이 사용자가 삭제되었음을 증명합니다. 5. 그런 다음 홈 파일을 입력합니다.

Windows 11 KB5031455 설치에 실패하여 일부 사용자에게 다른 문제 발생 Windows 11 KB5031455 설치에 실패하여 일부 사용자에게 다른 문제 발생 Nov 01, 2023 am 08:17 AM

Microsoft는 Windows 503145511H22 이상에 대한 선택적 업데이트로 KB2를 대중에게 출시하기 시작했습니다. 이는 지원되는 영역의 Windows Copilot, 시작 메뉴 항목에 대한 미리 보기 지원, 작업 표시줄 그룹 해제 등을 포함하여 Windows 11 Moment 4 기능을 기본적으로 활성화하는 첫 번째 업데이트입니다. 또한 메모리 누수를 일으키는 잠재적인 성능 문제를 포함하여 여러 Windows 11 버그를 수정합니다. 하지만 아이러니하게도 2023년 9월의 선택적 업데이트는 업데이트를 설치하려는 사용자에게, 심지어 이미 설치한 사용자에게도 재앙이 될 것입니다. 많은 사용자가 이 Wi-Fi를 설치하지 않을 것입니다.

Linux 시스템의 사용자 비밀번호 저장 메커니즘 분석 Linux 시스템의 사용자 비밀번호 저장 메커니즘 분석 Mar 20, 2024 pm 04:27 PM

Linux 시스템의 사용자 비밀번호 저장 메커니즘 분석 Linux 시스템에서 사용자 비밀번호 저장은 매우 중요한 보안 메커니즘 중 하나입니다. 이 기사에서는 암호화된 비밀번호 저장, 비밀번호 확인 프로세스, 사용자 비밀번호를 안전하게 관리하는 방법을 포함하여 Linux 시스템의 사용자 비밀번호 저장 메커니즘을 분석합니다. 동시에 특정 코드 예제를 사용하여 비밀번호 저장의 실제 작업 프로세스를 보여줍니다. 1. 비밀번호의 암호화된 저장 Linux 시스템에서 사용자 비밀번호는 시스템에 일반 텍스트로 저장되지 않고 암호화되어 저장됩니다. 엘

See all articles