'2007/11'에 해당되는 글 5건
- 2007.11.23 :: 리눅스 커널 파라메터 2
- 2007.11.23 :: ASCII Code Table
- 2007.11.23 :: 한글 유니코드 값 구하는 공식
- 2007.11.15 :: Understanding the Query Cache
- 2007.11.06 :: InnoDB
# 128M -> 8192
# 256M -> 13684
# 512M -> 32768
# 1G -> 65536
# 2G -> 131072
fs.file-max = 65535
# 동시 사용자가 몰릴 경우에 대비해 received host대한 충분한 backlog 수치를 늘려주는 것이 좋음
net.core.netdev_max_backlog=2500
# 소켓 수신 큐 최대값과 기본값 조정.
# 일반적인 경우의 대용량 Serving을 위한 설정. 기본 값이 변경되는 경우 아파치 등의 웹서버 설정을 특별히 해줄 필요는 없다고 함.
net.core.rmem_default = 65536
net.core.rmem_max = 8388608
# 소켓 출력 큐 최대값과 기본값 조정.
# 일반적인 경우의 대용량 Serving을 위한 설정으로 더 적은 시스템콜로 웹페이지를 네트웍 스택에 보낼 수 있음.
# 기본 값이 설정되는 경우 아파치 등의 웹서버 설정을 특별히 해줄 필요는 없다고 함.
net.core.wmem_default = 65536
net.core.wmem_max = 8388608
# TCP layer의 수신 버퍼를 상향 조정
# 대량의 데이터를 클라이언트로 전송하는 경우에는 이 값을 추천.
net.ipv4.tcp_rmem = 4096 87380 8388608
# TCP layer의 송신 버퍼를 상향 조정 대량의 데이터를 클라이언트로 전송하는 경우에는이 값을 추천.
net.ipv4.tcp_wmem = 4096 65536 8388608
# The tcp_mem variable defines how the TCP stack should behave when it comes to memory usage.
# TCP스택이 메모리를 어떻게 사용할지에 대한 메모리 페이지 단위 설정.
# 순서대로 min pressure max설정이다. tcp_wmem과 tcp_rmem설정에 따른 적정한 크기를 할당한다.
# IA32는 4KB가 한 개의 페이지이다.
# ※ 이 설정 값은 네트워크 성능에 영향을 큰 영향을 줄 수 있으므로 주의가 요구된다.
# {min} {pressure} {max}
net.ipv4.tcp_mem = 4096 4096 4096
# 유저 파일 핸들에 할당되지 않은 커넥션에 대해 몇번을 제거 시도를 할 것인지를 정하는 파라메터.
# 하이로드의 웹서버인 경우 이 값을 7이하로 떨어뜨릴 경우 “TCP: too many of orphaned sockets”와
# “Out of socket memory”에 대한 커널 메시지가 나타날 수 있다.
net.ipv4.tcp_orphan_retries = 7
# 클라이언트의 소켓으로부터 RST을 받아 TIME_WAIT 상태로 가는 경우 즉시 소켓을 종료시킴.
# 웹서버와 같은 유형의 서버에서는 소켓을 열고 닫는 회수가 많으므로 이 쪽을 튜닝하면
# net.ipv4.tcp_max_tw_buckets 값을 줄이는 설정을 해도 됨. 파일 서버와 같은 경우는 이 값을 기본값으로 놓는 것이 좋음.
net.ipv4.tcp_rfc1337 = 1
# SPECWeb99의 권고는 인트라넷 네트워크에서만 사용하는 네트웍인 경우 selective acknowledgements를 off 시킴으로써 성능이 향상된
다고 함. SPECWeb99의 테스트는 완전한 1-2hop 이내의 네트워크 토폴로지를 가정하였으므로 일반적으로는 이 부분을 on으로 해주는 좋다
는 권고.
# ※ 외부 접속을 받는 네트워크에선 on으로 해야함.
net.ipv4.tcp_sack = 1
# SPECWeb99의 권고는 인트라넷 네트워크에서만 사용하는 서버인 경우 timestamps 생성를 off 시킴으로써 성능이 향상됨.
# SPECWeb99의 테스트는 완전한 1-2hop 이내의 네트워크 토폴로지를 가정하였으므로 일반적으로는
# 이 부분을 on으로 해주는 좋다는 권고. tcp_window_scaling 부분 참조
# ※ 외부 접속을 받는 네트워크에선 on으로 해야함
net.ipv4.tcp_timestamps = 1
# tcp_sack와 tcp_timestamps의 경우와 같은 튜닝 관점이다.
# 단, rmem, wmem과 tcp_rmem, tcp_wmem의 버퍼 상향 조정시에는
# tcp_timestamps와 함께 on 설정을 해주어 윈도크기를 조절하도록 하는 것이 좋다고 권고함.
net.ipv4.tcp_window_scaling = 1
# KEEPALIVE 시간을 줄이면 비정상적으로 stale된 접속을 해제하는 시간을 줄일 수 있음.
net.ipv4.tcp_keepalive_time = 1300
# 소켓의 listen backlog 값 조정으로 동시접속이 몰릴 경우에 대한 최적화
net.ipv4.tcp_max_syn_backlog = 8192
# FIN_TIMEOUT 대기 시간을 줄이면 끊어진 소켓의 소거 시간을 줄일 수 있음.
net.ipv4.tcp_fin_timeout = 30
# 새 접속에서 사용할 수 있는 포트의 사용 가능 범위를 확장.
net.ipv4.ip_local_port_range = 16384 65536
# DOS 공격 중의 하나인 SYN flooding 공격을 막아주도록 On으로 변경.
# 방화벽으로부터 보호되고 있어도 위 공격에 대한 대비책이 없다면 켜주는 것이 좋으나 성능에 영향이 있으며,
# 이 부분을 켜주는 것 보다는 tcp_
net.ipv4.tcp_syncookies = 1
# off상태면 두 네트웍 인터페이스간 IP 패킷 전달을 해제합니다.
net.ipv4.ip_forward = 0
# 웹서버와 같은 유형의 서버에서 high load에서는 사용자 소켓의 종료 진행에서
# TIME_WAIT 상태가 되는데 이 것의 양이 60초간 지속 된다는 것을 가정하고 이 값을 충분히 높여 주는 것이 좋음.
net.ipv4.tcp_max_tw_buckets = 2000000
# Linux 2.4에서 주의해야할 점.
# 주어진 경로에 대한 ssthread 값이 라우팅 테이블에 캐시되는데 이 값으로 윈도 값 설정이 감소하게 되면
# 이후 10분간의 모든 다른 커넥션에 이 값을 사용하게 되므로 웹서버등에서는 켜주는 것이 좋을 것 같다.
net.ipv4.route.flush = 1
# 가상 메모리 하부 시스템의 성능 향상.
# 가상 메모리 및 버퍼 메모리 관리에 대한 성능을 높여줌.
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
# 브로드캐스브, 멀티캐스트 주소에 ICMP ECHO 요청을 막음. smurf 공격 방지용
#
net.ipv4.icmp_echo_ignore_broadcasts = 1
# SRR 옵션으로 패킷들을 수용한다. IP source routing 을 제어한다. 보통 호스트로
# 향하게 하는 것을 권장한다. TRUE (router) FALSE (host)
#
net.ipv4.conf.all.accept_source_route = 0
#net.ipv4.conf.all.send_redirects=0
#net.ipv4.conf.all.accept_redirects=0
# DOS 공격 중 하나인 IP Spoofing을 Source Route 를 검사해서 방지합니다.
# 방화벽에서 막아주거나 외부에 노출되어 있지 않은 서버 등 공격의 우려가 없다면 끄는 것이 좋음.
# 알 수 없을 경우 on으로 설정해둡니다.
# RFC182에 따른 IP spoof 방지를위한 설정(커널 2.2이상 버전)
#
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
# Log Spoofed Packets, source Routed Packets, Redirect packetes
# ip주소를 스푸핑한다고 예상되는 경우 로그에 기록하기
#
net.ipv4.conf.all.log_martians = 1
# 공유 메모리 최대값 조정
kernel.shmmax=3800000000
# 세마포어 최대값 조정
# 의미: {배열당 최대 SEM 수}{최대SEM시스템넓이}{SEMOP호출당최대OP수}{최대배열수}
# 공식: {최대SEM시스템넓이} = {최대 배열 수} x {배열당 최대 SEM 수} (DB2 튜닝문서에 따름)
kernel.sem=1000 32000 32 512
# 메시지큐 시스템 크기 조정
kernel.msgmni = 1024
10진수 |
16진수 |
8진수 |
2진수 |
ASCII |
10진수 |
16진수 |
8진수 |
2진수 |
ASCII |
0 |
0×00 |
000 |
0000000 |
NULL |
64 |
0×40 |
100 |
1000000 |
@ |
1 |
0×01 |
001 |
0000001 |
SOH |
65 |
0×41 |
101 |
1000001 |
A |
2 |
0×02 |
002 |
0000010 |
STX |
66 |
0×42 |
102 |
1000010 |
B |
3 |
0×03 |
003 |
0000011 |
ETX |
67 |
0×43 |
103 |
1000011 |
C |
4 |
0×04 |
004 |
0000100 |
EOT |
68 |
0×44 |
104 |
1000100 |
D |
5 |
0×05 |
005 |
0000101 |
ENQ |
69 |
0×45 |
105 |
1000101 |
E |
6 |
0×06 |
006 |
0000110 |
ACK |
70 |
0×46 |
106 |
1000110 |
F |
7 |
0×07 |
007 |
0000111 |
BEL |
71 |
0×47 |
107 |
1000111 |
G |
8 |
0×08 |
010 |
0001000 |
BS |
72 |
0×48 |
110 |
1001000 |
H |
9 |
0×09 |
011 |
0001001 |
HT |
73 |
0×49 |
111 |
1001001 |
I |
10 |
0×0A |
012 |
0001010 |
LF |
74 |
0×4A |
112 |
1001010 |
J |
11 |
0×0B |
013 |
0001011 |
VT |
75 |
0×4B |
113 |
1001011 |
K |
12 |
0×0C |
014 |
0001100 |
FF |
76 |
0×4C |
114 |
1001100 |
L |
13 |
0×0D |
015 |
0001101 |
CR |
77 |
0×4D |
115 |
1001101 |
M |
14 |
0×0E |
016 |
0001110 |
SO |
78 |
0×4E |
116 |
1001110 |
N |
15 |
0×0F |
017 |
0001111 |
SI |
79 |
0×4F |
117 |
1001111 |
O |
16 |
0×10 |
020 |
0010000 |
DLE |
80 |
0×50 |
120 |
1010000 |
P |
17 |
0×11 |
021 |
0010001 |
DC1 |
81 |
0×51 |
121 |
1010001 |
Q |
18 |
0×12 |
022 |
0010010 |
SC2 |
82 |
0×52 |
122 |
1010010 |
R |
19 |
0×13 |
023 |
0010011 |
SC3 |
83 |
0×53 |
123 |
1010011 |
S |
20 |
0×14 |
024 |
0010100 |
SC4 |
84 |
0×54 |
124 |
1010100 |
T |
21 |
0×15 |
025 |
0010101 |
NAK |
85 |
0×55 |
125 |
1010101 |
U |
22 |
0×16 |
026 |
0010110 |
SYN |
86 |
0×56 |
126 |
1010110 |
V |
23 |
0×17 |
027 |
0010111 |
ETB |
87 |
0×57 |
127 |
1010111 |
W |
24 |
0×18 |
030 |
0011000 |
CAN |
88 |
0×58 |
130 |
1011000 |
X |
25 |
0×19 |
031 |
0011001 |
EM |
89 |
0×59 |
131 |
1011001 |
Y |
26 |
0×1A |
032 |
0011010 |
SUB |
90 |
0×5A |
132 |
1011010 |
Z |
27 |
0×1B |
033 |
0011011 |
ESC |
91 |
0×5B |
133 |
1011011 |
[ |
28 |
0×1C |
034 |
0011100 |
FS |
92 |
0×5C |
134 |
1011100 |
\ |
29 |
0×1D |
035 |
0011101 |
GS |
93 |
0×5D |
135 |
1011101 |
] |
30 |
0×1E |
036 |
0011110 |
RS |
94 |
0×5E |
136 |
1011110 |
^ |
31 |
0×1F |
037 |
0011111 |
US |
95 |
0×5F |
137 |
1011111 |
_ |
32 |
0×20 |
040 |
0100000 |
SP |
96 |
0×60 |
140 |
1100000 |
. |
33 |
0×21 |
041 |
0100001 |
! |
97 |
0×61 |
141 |
1100001 |
a |
34 |
0×22 |
042 |
0100010 |
" |
98 |
0×62 |
142 |
1100010 |
b |
35 |
0×23 |
043 |
0100011 |
# |
99 |
0×63 |
143 |
1100011 |
c |
36 |
0×24 |
044 |
0100100 |
$ |
100 |
0×64 |
144 |
1100100 |
d |
37 |
0×25 |
045 |
0100101 |
% |
101 |
0×65 |
145 |
1100101 |
e |
38 |
0×26 |
046 |
0100110 |
& |
102 |
0×66 |
146 |
1100110 |
f |
39 |
0×27 |
047 |
0100111 |
' |
103 |
0×67 |
147 |
1100111 |
g |
40 |
0×28 |
050 |
0101000 |
( |
104 |
0×68 |
150 |
1101000 |
h |
41 |
0×29 |
051 |
0101001 |
) |
105 |
0×69 |
151 |
1101001 |
i |
42 |
0×2A |
052 |
0101010 |
* |
106 |
0×6A |
152 |
1101010 |
j |
43 |
0×2B |
053 |
0101011 |
+ |
107 |
0×6B |
153 |
1101011 |
k |
44 |
0×2C |
054 |
0101100 |
' |
108 |
0×6C |
154 |
1101100 |
l |
45 |
0×2D |
055 |
0101101 |
- |
109 |
0×6D |
155 |
1101101 |
m |
46 |
0×2E |
056 |
0101110 |
. |
110 |
0×6E |
156 |
1101110 |
n |
47 |
0×2F |
057 |
0101111 |
/ |
111 |
0×6F |
157 |
1101111 |
o |
48 |
0×30 |
060 |
0110000 |
0 |
112 |
0×70 |
160 |
1110000 |
p |
49 |
0×31 |
061 |
0110001 |
1 |
113 |
0×71 |
161 |
1110001 |
q |
50 |
0×32 |
062 |
0110010 |
2 |
114 |
0×72 |
162 |
1110010 |
r |
51 |
0×33 |
063 |
0110011 |
3 |
115 |
0×73 |
163 |
1110011 |
s |
52 |
0×34 |
064 |
0110100 |
4 |
116 |
0×74 |
164 |
1110100 |
t |
53 |
0×35 |
065 |
0110101 |
5 |
117 |
0×75 |
165 |
1110101 |
u |
54 |
0×36 |
066 |
0110110 |
6 |
118 |
0×76 |
166 |
1110110 |
v |
55 |
0×37 |
067 |
0110111 |
7 |
119 |
0×77 |
167 |
1110111 |
w |
56 |
0×38 |
070 |
0111000 |
8 |
120 |
0×78 |
170 |
1111000 |
x |
57 |
0×39 |
071 |
0111001 |
9 |
121 |
0×79 |
171 |
1111001 |
y |
58 |
0×3A |
072 |
0111010 |
: |
122 |
0×7A |
172 |
1111010 |
z |
59 |
0×3B |
073 |
0111011 |
; |
123 |
0×7B |
173 |
1111011 |
{ |
60 |
0×3C |
074 |
0111100 |
< |
124 |
0×7C |
174 |
1111100 |
| |
61 |
0×3D |
075 |
0111101 |
= |
125 |
0×7D |
175 |
1111101 |
} |
62 |
0×3E |
076 |
0111110 |
> |
126 |
0×7E |
176 |
1111110 |
~ |
63 |
0×3F |
077 |
0111111 |
? |
127 |
0×7F |
177 |
1111111 |
DEL |
[{(초성)×588}+{(중성)×28}+(종성)]+44032
예를 들어, ‘뷁’이라는 글자의 유니코드 값을 구한다면
- 초성은 ㅂ이므로 7,
- 중성은 ㅞ이므로 15,
- 종성은 ㄺ이므로 9가 된다.
이 값을 위 공식에 대입하면 {(7×588)+(15×28)+9}+44032가 된다. 이를 계산하면 48577이 나온다.
곧, ‘뷁’의 10진수 유니코드 값은 48577이다.
이 코드 앞에 &#을 붙이면 된다...
따라서 뷁을 쓰면 ‘뷁’을 얻을 수 있다.
원리
이 공식이 성립할 수 있는 까닭은 유니코드에 현대 한글 영역이 가나다순으로 11172글자가 쭉 배열돼 있기 때문이다.
- 끝에 44032를 더하는 까닭은 첫 번째 현대 한글 ‘가’의 코드가 44032(16진수 U+AC00)이기 때문이다.
- 초성 값에 588을 곱하는 까닭은 초성이 588(=21×28)글자마다 바뀌기 때문이다. 이때 21은 중성 개수이고 28은 종성 개수이다.
- 중성 값에 28을 곱하는 까닭은 중성이 28글자마다 바뀌기 때문이다. 이때 28은 종성 개수이다.
초성
중성
종성
직접 테이블을 보고 싶다면...
Understanding the Query Cache
흰콧수염
webmaster@10mbps.com
Last translated on Sep 08. 2004.
5.11 The MySQL Query Cache
MySQL Version 4.0.1 이상부터, qeury cache가 도입되었다. qeury cache가 이용될 경우 클라이언트로부터 입력된 SELECT 쿼리를 캐쉬에 저장한다. 이후 정확히 같은 쿼리가 입력되었을 때, 해당 쿼리를 MySQL 서버에서 실행하지 않고 캐쉬로부터 가져와 클라이언트에게 전달한다.
query cache는 테이블의 내용이 자주 변하지 않고 정확히 같은 쿼리를 반복적으로 사용할 경우 큰 효과를 보여준다.
주의 :
1. query cache는 오래된 data를 클라이언트에게 전달하지 않는다. 테이블의 내용이 변경될 경우, 캐쉬에 저장된 관련 쿼리의 내용을 모두 초기화시킨다.
2. 하나의 서버에 여러 mysqld 데몬을 운영하는 경우에는 동작하지 않는다.
5.11.1 How the Query Cache Operates
모든 query는 클라이언트에게 전달하기 전에 서로 비교하는 과정을 거친다. 따라서 query cache는 아래의 두 query문은 서로 다르게 인식한다.
SELECT * FROM tbl_name;
Select * from tbl_name;
query는 동일하게 인식되기 위해서는 정확히 일치해야 한다. 또한 같은 query문이라도 몇몇 상황에서는 다르게 받아들여진다. 다른 database, 다른 protocol 버전, 다른 문자 셑을 가질 경우 각각 서로 다른 query문으로 간주되어 따로 따로 cache 된다.
query cache로부터 결과값이 클라이언트에게 전달되면, 서버는 Qcache_hits 값을 자동 증가시킨다.
특정 테이블의 내용이 변경되면, 해당 테이블로부터 쿼리 cache된 모든 내용은 삭제된다. 테이블의 내용은 INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, 또는 DROP DATABASE와 같은 쿼리로 인하여 변경된다.
query cache는 SELECT SQL_CALC_FOUND_ROWS ... 와 SELECT FOUND_ROWS() 타입의 쿼리에도 적용된다. FOUND_ROWS()는 선행 query가 cache에 저장되어 있다하더라도 record의 개수 또한 cache에 저장되어 있으므로 정확한 값을 반환한다.
아래의 함수를 포함한 query문은 cache를 이용하지 않는다 :
BENCHMARK() |
CONNECTION_ID() |
CURDATE() |
CURRENT_DATE() |
CURRENT_TIME() |
CURRENT_TIMESTAMP() |
CURTIME() |
DATABASE() |
ENCRYPT() with one parameter |
FOUND_ROWS() |
GET_LOCK() |
LAST_INSERT_ID() |
LOAD_FILE() |
MASTER_POS_WAIT() |
NOW() |
RAND() |
RELEASE_LOCK() |
SYSDATE() |
UNIX_TIMESTAMP() with no parameters |
USER() |
|
또 query가 아래와 같은 조건일 경우에도 cached 되지 않는다 :
❚ 사용자 정의 함수(UDF)가 포함된 경우.
❚ 사용자 변수(user variables)가 포함된 경우.
❚ mysql의 system database에 있는 테이블을 조회하는 경우.
❚ 아래의 형태를 가진 경우 :
SELECT ... IN SHARE MODE
SELECT ... INTO OUTFILE ...
SELECT ... INTO DUMPFILE ...
SELECT * FROM ... WHERE autoincrement_col IS NULL
❚ TEMPORARY tables을 사용하는 경우.
❚ table를 사용하지 않는 경우.
❚ user가 관련 table에 column 레벨의 권한만을 가진 경우.
❚ query가 cache로부터 값을 가져오기 전에 MySQL은 user가 관련 database와 table에 SELECT 권한을 가지고 있는 지 체크한다. 권한이 없을 경우 cached 된 값을 반환하지 않는다.
5.11.2 Query Cache SELECT Options
SELECT 구문에 정의할 수 있는 두 개의 cache 관련 옵션이 있다.
SQL_CACHE
query_cache_type이 ON 이거나 DEMAND 인 경우, 결과 값을 cache로부터 반환시킨다.
SQL_NO_CACHE
쿼리 결과를 cache 시키지 않는다.
예 :
SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;
5.11.3 Query Cache Configuration
have_query_cache DB 환경 변수는 query cache를 이용할 수 있는 지 여부를 확인할 수 있다.
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Variable_name |
Value |
have_query_cache |
YES |
query cache를 이용하기 위한 옵션으로 몇 가지가 있다. 이 옵션들은 /etc/my.cnf 에 정의하거나 mysqld 구동 스크립트에 정의 할 수 있다. query cache 관련 변수는 query_cache_ 로 시작한다.
query cache의 크기를 지정하기 위해서는 query_cache_size를 이용한다. 0으로 설정하면 query cache는 더 이상 사용되지 않는다. 기본값은 0이다.
query cache가 enable 된 경우, query_cache_type 변수는 SELECT 방법에 영향을 준다.
0 또는 OFF 인 경우 cache시키거나 혹은 cached 된 결과를 가져올 수 없다.
1 또는 ON 인 경우 SELECT SQL_NO_CACHE 인 구문을 제외하고 cache 기능을 이용한다.
2 또는 DEMAND 인 경우 SELECT SQL_CACHE 구문만 cache 기능을 이용한다.
클라이언트는 query cache 기능을 이용하고 싶지 않을 경우 아래와 같이 할 수 있다:
mysql> SET SESSION query_cache_type = OFF;
하나의 query 결과를 caching 하기 위한 최대 값은 query_cache_limit 변수로 수정할 수 있으며, 기본값은 1MB를 가진다.
5.11.4 Query Cache Status and Maintenance
query cache 기능이 존재하는 알고 싶을 경우 아래의 구문을 사용한다.
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
좀 더 효율적으로 메모리를 사용하기 위해 FLUSH QUERY CACHE 구문으로 조각모음을 할 수 있다. 그렇다고하여 cache로부터 query된 내용을 삭제하지는 않는다.
query cache로부터 query 결과를 삭제하기 위해서는 RESET QUERY CACHE 또는 FLUSH TABLES 구문을 사용한다.
query cache 성능을 모니터링하기 위해서는 SHOW STATUS를 이용한다.
mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| Qcache_free_blocks | 36 |
| Qcache_free_memory | 138488 |
| Qcache_hits | 79570 |
| Qcache_inserts | 27087 |
| Qcache_lowmem_prunes | 3114 |
| Qcache_not_cached | 22989 |
| Qcache_queries_in_cache | 415 |
| Qcache_total_blocks | 912 |
+-------------------------+--------+
SELECT query 전체 구문은 :
Com_select
+ Qcache_hits
+ queries with errors found by parser
Com_select 값은 :
Qcache_inserts
+ Qcache_not_cached
+ queries with errors found during columns/rights check
와 같다.
query cache는 가변 길이의 block을 이용한다. 따라서 Qcache_total_blocks 와 Qcache_free_blocks는 분산된 memory 조각을 가르킨다. FLUSH QUERY CACHE을 하고 난 뒤에는 하나의 free block만 남게된다.
모든 캐쉬에 저장된 query는 최소 2 block를 가진다. query에 이용된 모든 테이블은 1 block을 갖는다. 그러나 같은 테이블을 2 또는 그 이상의 query에서 조회한다면 1 block을 할당해야한다.
1) 예전의 MySQL 의 Storage Engines 으로 MyISAM 을 사용했었습니다.
예를 들자면 블로그라던지, 게시판 처럼 한사람이 글을 쓰면 다른 많은 사람들이 글을
읽는 방식에 최적의 성능을 발휘를 하지요. 지금도 많이 사용하고 있는 방식입니다.
2) 제공하는 웹서비스다 그닥 크지 않다면 이것을 사용해도 괜찮다고 생각을 합니다.
2. InnoDB
1) 트랜잭션-세이프 스토리지 엔진입니다.
2) MyISAM 과 비슷하지만 ORACLE 처럼 많은 기능을 지원을 합니다.
(* commit, rollback, 장애복구, row-level locking, 외래키 등)
3) 다수의 사용자 동시접속과 퍼포먼스가 증가하여 대용량 데이터를 처리할 때 최대의
퍼포먼스를 내도록 설계되었습니다.
CPU효율은 어느 디스크 기반의 데이터 베이스와 비교해도 손색이 없고
자체적으로 메인 메모리 안에 데이터 캐싱과 인덱싱을 위한 버퍼 풀(pool)을 관리합니다.
4) 테이블과 인덱스를 테이블 스페이스에 저장을 하고 테이블 스페이스는 몇개의
서버파일이나 디스크 파티션으로 구성되어있습니다.
이것은 MyISAM 과 다른 점인데, MyISAM은 테이블과 인덱스를 각각 분리된 파일로
관리합니다.
여기서 중요한것이 이제 InnoDB 를 제대로 사용을 하기 위해서는 테이블 스페이스 라는
개념을 파악을 하셔야합니다.
이것에 대해서는 밑에서 따로 언급을 하겠습니다.
5) InnoDB 테이블은 OS의 파일 사이즈 한계가 2GB이더라도 상관없이 어느 크기나
가질 수 있습니다.
6) InnoDB는 높은 퍼포먼스가 필요한 대용량 사이트에 적합합니다.
3. InnoDB 사용하기
1) InnoDB 는 MyISAM 과 공유하는 메모리도 있지만 별도의 Buffer pool을 가지고 있으니까
InnoDB 전용 DB를 구성한다면 MyISAM 이 사용하는 record_boffer 과 key_buffer 에
너무 많은 메모리를 할당하지 마세요.
2) InnoDB 설정
ㄱ) MySQL을 설치한 폴더 아래에 ibdata 와 iblogs 폴더를 생성합니다.
ㄴ) my.ini 파일 설정을 변경
* innodb_buffer_pool_size
- 현재 자신의 시스템 메모리의 50~80% 사이로 만듭니다.
x86 시스템에서는 2G 이상 설정을 할 수 없습니다.
* innodb_additional_mem_pool_size
- 데이터 사전정보 나 내부의 데이터 구조 정보를 담는 메모리 입니다.
보통 2M 정도 잡아주면 아주 많은 테이블을 사용한다면 좀 늘려주시면 됩니다.
만약 메모리공장이 부족하면 error log 에 warning 메서지를 남기니 그때 늘려주세요
* innodb_flush_log_at_trx_commit
- insert, update 등 데이터 삽입과 관계가 있습니다.
commit 을 하였을때 그 즉시 commit 된 데이터를 log file 에 기록할지 안할지를
설정합니다.
로그파일을 기록할 경우 갑작스러운 경우 데이터 손실을 막을 수 있지만
매번 로그를 기록하므로 속도가 저하됩니다.
1 일경우 기록을 하는것이고, 0일 경우 기록을 안하는것입니다.
* innodb_log_file_size
- 트랜잭션을 기록하는 로그 파일의 크기를 결정하는 옵션입니다.
inno_buffer_pool_size 옵션은 성능을 위한것이지만 시스템이 다운되었을 경우
데이터가 손실이 되므로, 이것을 방지하기 위해 log file 을 만들어서 commit 될때마다
로그에 기억을 하고 자동복구를 합니다.
로그파일은 무한정 계속 커지는 것이 아니라 일정한 크기와 갯수를 가지고
순환식으로 처리되므로 크기는 inno_buffer_pool_size 의 15% 정도로 설정을 합니다.
만약 메모리가 1기가이면 inno_buffer_pool_size = 512M 이고,
innodb_log_file_size = 80M 가 됩니다.
* innodb_log_buffer_size
- 로그 파일을 기록하기 위한 버퍼 사이즈입니다.
트랜잭션이 작거나 거의 없다면 크게 잡는것은 낭비이므로 보통 1M~8M 사이로
설정을 합니다.
[mysqld]
innodb_data_home_dir="/var/lib/mysql/ibdata/"
innodb_log_group_home_dir="/var/lib/mysql/iblogs"
innodb_data_file_path=ibdata1:10M:autoextend:max:1000M
innodb_additional_mem_pool_size=3469K
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=2M
innodb_buffer_pool_size=256M
innodb_log_file_size=40M
innodb_thread_concurrency=8
innodb_log_archive=0
ㄷ) my.ini 을 수정했으면 mysql 서버를 재시작합니다.
3) InnoDB 테이블 만들기
create table test_inno (
~
)type=innodb;
으로 맨 마지막에 type=innodb; 라고 명시해주시면 됩니다.
4) InnoDB 트랜잭션 사용
ㄱ) 트랜잭션을 사용하기 위해서는 처음에 set autocommit=0; 이나 begin; 을
선언해야 합니다.
선언 후 데이터 변경이 있을 때, 이상이 없을 경우는 commit를 하고,
이상이 있을 경우 rollback을 실행합니다.
오라클이랑 비슷하다고 보시면 되요
mysql>set autocommit=0; //begin; 같음
mysql>insert into test_inno values (1,'aaa');
mysql>select * from test_inno; //현재창에서는 입력한 내용이 보이지만
다른창에서는 보이지않음
mysql>commit; //다른창에서 select를 할경우 입력한 값이 보임
4. InnoDB 테이블 스페이스
좀전에 MyISAM 과 차이점이 InnoDB 는 테이블과 인덱스를 테이블 스페이스 라는곳에
저장을 한다고 하였습니다.
그런데 사용을 하다보니 점차 DB가 늘어나서 테이블 스페이스가 FULL 이 발생하는 경우가
생깁니다.
4.0.x 버전부터는 일일이 할 필요가 없다는 글이 있는데 그래도 FULL이 발생하였을 때
대처방법을 알면 좋겠죠
my.ini 에서 아래와 같이 추가를 해주면 안됩니다.
innodb_data_file_path = /ibdata/ibdata1:1000M:autoextend 라고 할 경우
innodb_data_file_path = /ibdata/ibdata1:1000M;/ibdata/ibdata2:1000M:autoextend 라고
ibdata2를 추가하면 안됩니다.
아래와 같은 과정대로 하세요
1. Use mysqldump to dump all your InnoDB tables.
2. Stop the server.
3. Remove all the existing tablespace files.
4. Configure a new tablespace.
5. Restart the server.
6. Import the dump files.
즉, 일단 mysqldump 로 InnoDB 테이블의 전체 덤프뜬 다음 MySQL 서버를 중지시킵니다.
그다음 테이블스페이스 파일을 모두 지우고 테이블스페이스를 아래와 같이 추가를 합니다.
innodb_data_file_path = /ibdata/ibdata1:1000M;/ibdata/ibdata2:1000M:autoextend
그다음 MySQL 서버를 구동시킨다음 처음에 덤프뜬 파일을 import 하시면 됩니다.
출처 - 모 까페.. (페이지 저장해놨다가 올리려니, 까페이름이 기억이 안나네요..)