728x90

접속로그 통계 구현을 위해서 로그를 쌓고 있는 테이블에서 데이터를 가공해야 한다.

접속로그 테이블에는 접속실패, 접속성공 등 모든 접속 시도 데이터를 저장해야 한다.

CREATE TABLE `rb_accessLog` (
  `uid` int(11NOT NULL,
  `ipaddr` varchar(20NOT NULL,
  `access_date` datetime NOT NULL COMMENT '접속시간',
  `userID` varchar(60NOT NULL,
  `userNM` varchar(20DEFAULT NULL,
  `OS` varchar(60DEFAULT NULL,
  `browser` varchar(30DEFAULT NULL,
  `hit` int(11NOT NULL DEFAULT 0,
  `success` int(1NOT NULL DEFAULT 1 COMMENT '성공실패',
  `date` char(8NOT NULL,
  `time` varchar(10NOT NULL,
  `YM` char(6NOT NULL,
  `MD` char(4NOT NULL,
  `year` char(4NOT NULL,
  `month` char(2NOT NULL,
  `day` char(2NOT NULL,
  `route` int(1NOT NULL DEFAULT 0 COMMENT '접속루트',
  `errCode` int(2NOT NULL DEFAULT 0 COMMENT '에러코드',
  `display` tinyint(2NOT NULL DEFAULT 1
ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
ALTER TABLE `rb_accessLog`
  ADD PRIMARY KEY (`uid`) USING BTREE,
  ADD KEY `date` (`date`),
  ADD KEY `YM` (`YM`),
  ADD KEY `MD` (`MD`);
 
 
ALTER TABLE `rb_accessLog`
  MODIFY `uid` int(11NOT NULL AUTO_INCREMENT;
COMMIT;
 

 

 

하지만 접속통계는 로그인 성공에 대한 것만 일자별로 사용자 기준으로 접속하는 테이블을 구현하면 될 것이다.

CREATE TABLE `rb_accessLog_tmp` (
  `uid` int(11NOT NULL,
  `date` char(8NOT NULL,
  `userID` varchar(60NOT NULL,
  `userNM` varchar(20DEFAULT NULL,
  `YM` char(6NOT NULL,
  `MD` char(4NOT NULL,
  `year` char(4NOT NULL,
  `month` char(2NOT NULL,
  `day` char(2NOT NULL,
  `hit` int(11NOT NULL DEFAULT 0,
  `display` tinyint(2NOT NULL DEFAULT 1
ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
ALTER TABLE `rb_accessLog_tmp`
  ADD PRIMARY KEY (`uid`) USING BTREE,
  ADD UNIQUE KEY `date_userID` (`date`,`userID`);
 
ALTER TABLE `rb_accessLog_tmp`
  MODIFY `uid` int(11NOT NULL AUTO_INCREMENT;
COMMIT;

 

 

데이터를 추출하여 넣은 SQL 쿼리문은 다음과 같다.

INSERT INTO rb_accessLog_tmp (date, userID, userNM, YM, MD, year, month, day,hit) 
(select date, userID, userNM, YM, MD, year, month, day, count(*) as hit 
from rb_accessLog where success=1 group by date, userID) 
ON DUPLICATE KEY UPDATE date = VALUES(date), 
userID = VALUES(userID), hit=VALUES(hit)

없는 자료는 Insert 하고 중복된 자료는 특정 칼럼만 업데이트한다.

달라질 칼럼은 hit 칼럼밖에 없을 것이다.

 

중복체크하는 중요한 Key는 date_userID 인덱스 설정이다.

 

이 테이블에서 다시 일별 사용자수 접속 통계, 접속수 통계를 구분하는 테이블을 만들어보자.

CREATE TABLE rb_access_Stats (
  uid int(11NOT NULL,
  date char(8NOT NULL,
  YM char(6NOT NULL,
  day char(2NOT NULL,
  IDCnt int(11NOT NULL DEFAULT 0,
  dailyCnt int(11NOT NULL DEFAULT 0
ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
ALTER TABLE rb_access_Stats
  ADD PRIMARY KEY (uid),
  ADD UNIQUE KEY date (date) USING BTREE;
 
ALTER TABLE rb_access_Stats
  MODIFY uid int(11NOT NULL AUTO_INCREMENT;
COMMIT;

 

UNIQUE KEY 설정은 필수 사항!!!

# 일일 통계 생성 
INSERT INTO rb_access_Stats (date,YM,day,IDCnt,dailyCnt) 
(select date, YM, day ,count(distinct userID) as IDCnt,sum(hit) as dailyCnt 
from rb_accessLog_tmp group by date)
ON DUPLICATE KEY UPDATE date = VALUES(date), IDCnt = VALUES(IDCnt), 
dailyCnt = VALUES(dailyCnt)

 

728x90

'SQL' 카테고리의 다른 글

DB 공간 부족으로 테이블 백업  (0) 2024.07.30
MySQL 접속 경과시간 Query  (0) 2024.05.01
MySQL foreign key 예제  (0) 2022.05.16
[MySQL] 샘플 데이터베이스 설치하기  (0) 2022.04.28
MariaDB 멀티 인덱스(index) 설정  (0) 2022.04.05
블로그 이미지

Link2Me

,