現在のバッファサイズを次で得ることができます:
> ./mysqld --help
この結果、全ての mysqld オプションと次のようなコンフィグ可能変数のリスト を得られます。
Possibly variables to option --set-variable (-O) are: back_log current value: 5 join_buffer current value: 131072 key_buffer current value: 1048568 max_allowed_packet current value: 65536 max_connections current value: 90 max_join_size current value: 4294967295 max_sort_length current value: 1024 net_buffer_length current value: 8192 record_buffer current value: 131072 sort_buffer current value: 2097144 table_cache current value: 64 tmp_table_size current value: 1048576 thread_stack current value: 65536
back_log | MySQL が持てる未解決の接続要求の数です。これは MySQL スレッドがとても多くの接続要求をとても短い時間に得た時に、働き ます。接続のチェックと新しいスレッドの開始はメインスレッドにすこし時間 (しかしとても短い)がかかります。back_log は、MySQL が瞬間的に新 しい要求への回答を停止する前に、この短い時間の間にスタックできる接続数で す。短い期間に多くの接続を期待する場合にだけ、これを増加する必要がありま す。 他の言葉では、TCP/IP 接続の入力 listne キューのサイズです。UNIX システム コール listen(2) のマニュアルページに、さらに詳細があります。 この変数の最大値は OS のドキュメントをチェックしてください。 |
join_buffer | このバッファは(インデックス無しの)完全な結合に使用されます。それは2つの テーブル間の完全な結合ごとに1回割り当てられます。インデックスの追加がで きない時、より速い完全な結合を得るために、これを増加してください。通常、 速い結合を得る一番言い方法は、インデックスを追加することです。 |
key_buffer |
バッファインデックスブロック。全てのスレッドに共有されます。多くのインデッ
クスを持つテーブルで多くの削除/挿入を行うときに、これを増加させてくださ
い。さらに速度を得るためには LOCK TABLES を使用してください。
「LOCK TABLES 構文」節参照 。
|
max_allowed_packet |
一つのパケットの最大サイズ。これはメッセージバッファを必要なときにこの制
限まで増大させることを許します(net_buffer_length に初期化されます)。
これは主に間違ったパケットを見つけるために、とても大きな値が設定されます。
大きな BLOB を使用している場合は、これを増加する必要があります。使用した
い最大の BLOB と同じくらい大きくするべきです。
|
max_connections | 許される同時クライアントの数。これを増加する場合は、mysqld が持つファイ ルディスクリプタの数を増やす必要があるでしょう。これは OS に依存しますの で、OS のドキュメントを見てください。 |
max_join_size |
max_join_size より多いレコードを触るとエラーが返ります。長い時間をかけて
百万行を返すような WHERE なしの結合を作成するようなユーザを持って
いる場合にこれを設定してください。
|
max_sort_length |
BLOB または TEXT 項目上でソートする時に使用するバイト数。
|
net_buffer_length | 通信バッファがクエリ間でこのサイズにリセットされます。これは通常は変更す べきではありませんが、とても小さなメモリしかない場合は、これを期待される クエリのサイズに設定してください。 |
record_buffer | 順序スキャンを行う各スレッドが、スキャンするテーブル毎に、このサイズのバッ ファを割り当てます。多くの順序スキャンを行う場合は、これを増加させてくだ さい。 |
sort_buffer |
ソートを行う必要がある各スレッドがこのサイズのバッファを割り当てます。よ
り速い ORDER BY または GROUP BY のためにはこれを増やしてく
ださい。 「MySQL が一時ファイルを格納する場所」節参照
|
table_cache | 全てのスレッドについてのオープンテーブルの数。これを増加する場合は、オー プンファイルディスクリプタの数も増加することに注意しないといけません。 MySQL はユニークテーブル毎に2つのファイルディスクリプタを必要と します。 |
tmp_table_size |
一時テーブルがこれよりも大きい場合、The table ### is full エラー
が生成されます。多くの先進的な GROUP BY クエリを行う場合は、これ
を増加してください。
|
thread_stack |
各スレッドの C スタックの大きさ。crash-me によって検出される多く
の制限がこれに依存します。デフォルトで通常は十分です。
|
> safe_mysqld -O key_buffer=16M -O table_cache=128 \ -O sort_buffer=4M -O record_buffer=1M &多くの接続で少ないメモリしかない場合、次のようなものを使用します:
> safe_mysqld -O key_buffer=512k -O sort_buffer=100k -O record_buffer=100k &または
> safe_mysqld -O key_buffer=512k -O sort_buffer=16k -O table_cache=32 \ -O record_buffer=8k -O net_buffer=1K &
mysqld
へのオプションを変更する場合、そのサーバのインスタンスにだ
けであることに注意して下さい。パラメータ変更の効果を見るには、このように
しますmysqld -O key_buffer=32m --he
lp
。
mysqladmin variables
で実際のパラメータをチェックできます。
とても多くの接続がある場合、各接続にとても少ないメモリを使用するように
mysqld がコンフィグされていなければ、'スワップの問題' が生じます。もちろ
ん全ての接続に十分なメモリがあれば、ちゃんと働きます。
例えば、200 の接続では少なくても 200 * (max_number of tables in join) の
テーブルキャッシュを持つべきです。
net_bu
ffer_length
) を使用します。
●
全てのスレッドは同じベースメモリを共有します。
●
まだ memmap されていません (圧縮テーブルは除きますが、これは別の話)。これは
4GB の 32bit メモリ空間は多くの大きなテーブルには十分大きくないためです。64bit
アドレス空間を持つシステムを我々が手に入れた時、我々は memmap を通常にサ
ポートします。
●
mysqld
の起動時にキーバッファを指定できます。これは全テーブル内の全ての
インデックスを FIFO ベースでバッファします (変数 key_buffer)。
●
テーブルを越えて順次スキャンを行なう各要求は、読み込みバッファを割り当てます
(変数 record_buffer)。
●
ソートを行う多くの要求は、ソートバッファと一つか二つの一時ファイルを割り
当てます。 ﹁MySQL が一時ファイルを格納する場所﹂節参照
●
全ての結合は1パスで行なわれ、多くの結合は一時テーブルを使用せずに行なわ
れます。多くの一時テーブルはメモリベース(HEAP)のテーブルです。大きなレコー
ドサイズ (= 全項目長の合計) を持つ一時テーブルまたは、B
LOB
を含む
テーブルはディスク上に置かれます。現在の問題は、HEAP テーブルが
tmp_
table_size
のサイズを越えると、エラー 'The table ### is full'
が出ることです。将来我々は、必要時にメモリ (HEAP) テーブルをディスクベー
ス (NISAM) テーブルに自動的に変更することにより、これを修正します。この
問題を回避するため、mysqld への -
O tmp_table_siz
e=#
オプションま
たは SQL オプション SQL_BIG
_TABLES
で増加できます。 ﹁SET OPTION 構文﹂節参照 。MySQL 3.20
では、一時テーブルの最大サイズは
recordbuffer
*16
でした。そのため、このバージョンを使用していると、
r
ecordbuffer
を追加する必要があります。mysqld を --big-tables で
開始することで、常に一時テーブルをディスク上に格納できます。しかしこれは
全ての複雑なクエリの速度に影響します。
●
変形と演算時に使用されるほとんど全てのメモリはローカルメモリストア内で行
なわれます。小さな項目に必要とされるメモリオーバーヘッドはなく、通常の遅
いメモリ割り当て/解放が回避されます。メモリは予期しない大きな文字列にだ
け割り当てられます(これは malloc/free で行なわれます)。
●
各インデックスファイルは一度オープンされ、データファイルは各同時実行スレッ
ド毎に一度オープンされます。各同時スレッドには、テーブル構造、各項目の項目構造そし
て 3 * (BLOB
を計算しない最大行長) のサイズのバッファが割り当てら
れます。BLOB
は5から8バイト + BLOB データの長さを使用します。
●
BLOB
を持つ各テーブルでは、より大きな BLOB
の読み込みでバッファ
は動的に拡大されます。テーブルのスキャンをする場合、割り当てられたバッファは最
も大きい B
LOB
と同じ大きさになります。
●
全てのユーザテーブルはキャッシュ内に保存され、FIFO として管理されます。
通常、キャッシュは64個のテーブルです。テーブルが2つの実行しているス
レッドで同時に使用される場合、キャッシュ内にテーブルの2つのエントリが
あります。
●
mysqlad
min ref
resh
は使用されていない全てのテーブルをクローズし、
使用されている全てのテーブルを、実行中スレッドが終った時にクローズするよ
うにマークします。これは多くの使用メモリを解放するのに有効です。全てのロ
グファイルもクローズと再オープンされます。
mysqld 実行時、ps
や他のプログラムは、それが多くのメモリ
を使用していると報告するでしょう。これは異なったメモリアドレス上のスレッ
ドスタックによって発生します。例えば、Solaris ps はスタック間の未使用メ
モリを使用メモリとして計算します。'swap -s' で有効なスワップをチェックす
ることでこれを確かめられます。我々は市販のメモリリーク検出プログラムで
mysqld
をテストしました。そのため、メモリリークは全くありません。
PRIMARY
, UNIQUE
そして INDEX()
は B tree に格納されます。文字列は自動的に始めと終りの空白が圧縮されます。
﹁CREATE INDEX 構文(互換関数)﹂節参照
SELECT
... WHER
E
をより速くするための最初の問題は、インデッ
クスを追加できるかどうかをチェックすることです。異なるテーブル間の全ての参照は
通常はインデックスを使用して行なわれます。select
で使用されるイン
デックスをチェックするために、EXPLAI
N
コマンドを使用できます。
﹁EXPLAIN 構文。SELECT についての情報を得る﹂節参照 。 ﹁MySQL はどのようにインデックスを使用するか?﹂節参照
●
括弧の除去 (全ての不必要な括弧は削除されます) ((a
AND b)
AND c
OR
(((a
AND b)
AND (c
AND d)))
)
-> (a
AND b)
OR (a
AND b A
ND c AN
D d)
●
定数の保持 (a<b A
ND b=c)
AND a
=5
-> b>5 AN
D b=c
AND a=
5
●
定数条件の除去 (定数保持のために必要とされます)。 (b
>=5
A
ND b
=5)
OR (
b=6
AND
5=5)
OR
(B=7
AND
5=6)
-> B=5
OR B
=6
●
インデックスに使用される全ての表現は一度だけ評価されます。
●
一つのテーブル上の WH
ERE
がない C
ONS
T(*)
は、テーブルから
直接取り出されます。これはまた同じ条件下での任意の NO
T N
ULL
表現
のためにも行われます。
●
不当な定数表現は早く検出されます。不可能な select は 0 行を返します。
●
GRO
UP
BY
または group 関数を使用しない場合は、HAV
ING
は
WHE
RE
とマージされます。
●
各サブ結合についての速い WH
ERE
評価を得るために、また、可能な限り
早くレコードをスキップするために、各サブ結合についてより簡単な
WHE
RE
が構築されます。
●
全ての使用されるインデックスを見つけます。最小のレコードを探すインデック
スを使用します。インデックスは次の場合に使用されます: =
,
>
, >=
, <
, <=
, BE
TWE
EN
そして、'somthing%'
のように文字が最初にある LI
KE
。
●
全ての AN
D
レベルにかからないインデックスを削除します。
●
全ての先行する index_parts 記述を持ちます。
●
ind
ex
= 1
or
A
= 1
0
-> N
ULL
(インデックスを使用できません。)
●
ind
ex
= 1
or
A
= 1
0 a
nd
ind
ex=
2
-> i
nde
x =
1
OR
ind
ex
= 2
●
ind
ex_
par
t_1
=
con
st
and
in
dex
_pa
rt_
3 =
co
nst
-> in
dex
_pa
rt_
1 =
con
st
●
全ての定数テーブルを読みます。定数テーブルは次です:
(一)
0 または1行のテーブル。
(二)
他の定数テーブルと完全にユニークなインデックス上の定数だけを使用するテーブル。
con
st_
tab
le.
ind
ex
= c
ons
tan
t
●
con
st_
tab
le.
ind
ex_
par
t_1
=
con
st_
tab
le2.
col
umn
an
d c
ons
t_t
abl
e.i
nde
x_p
art
_2
= c
ons
tan
t
●
テーブルを結合するために最良の結合の組合せを見つけます。全ての可能性を試して:(。
ORD
ER
BY
または GR
OUP
内の全ての項目が同じテーブルからの場合は、
このテーブルは結合時に最初に優先されます。
●
order 節と 異なる group 節がある場合、または order か group が結合キュー
内の最初のテーブルではない他のテーブルからの項目を含む場合、一時テーブルが生成されます。
●
各テーブルで、もし可能ならば、レコードを読むために範囲インデックスを使用します。
各テーブルのインデックスはクエリされ、レコードの 30% よりスパンが小さいインデッ
クス範囲がある場合、インデックスが使用されます。そのようなインデックスが
見つけられない場合、素早いテーブルの走査(quick table scan)が使用されます。
●
各レコードが出力される前に、HAV
ING
節に適合するものをスキップします。
ta
ble
-ca
che
まで大きくなります(デ
フォルトは 64, -O table_cahe=# で変更可能)。キャッシュが一杯になって、他
のスレッドがテーブルのオープンを試みた時、または 'mysqladmin refresh' を使用し
た場合を除いて、テーブルはクローズされません。
制限に達すると、MySQL は、キャッシュサイズに達するか、または未
使用テーブルがそれ以上なくなるまで、可能な限り多くのテーブルをクローズします。これは、
全てのテーブルがいくつかのスレッドによって使用される場合、キャッシュ制限よりも
多くのオープンテーブルがあることを意味します。しかし、拡張テーブルは最後にクローズさ
れます。表は最後に使用された順に従ってクローズされます。
テーブルは各同時アクセスに (再び) オープンされます。これは、同じテーブルで2つのスレッ
ドが実行されている場合、または同じクエリで(AS
で)テーブルを2回アクセス
する場合、テーブルは2回オープンする必要があることを意味します。最初のテーブルのオー
プンは2つのファイル記述子を使用し、続くテーブルの各使用は1つだけのファイル記述
子を使用します。
MySQL が、テーブルがシンボリックリンクであることに気づいた場合、
symlink を解析し、代わりにその点のテーブルを使用します。これは
realpath() コールをサポートする全てのシステムで働きます︵少なくとも
Linux と Solaris は realpath() をサポートします!︶。realpath() をサポー
トしないシステム上では、symlink とテーブルを同時に使用すべきでありません!
テーブルはテーブルの更新後に矛盾するでしょう。
MySQL はデフォルトではデータベースのリンクをサポートしません。
データベース間のシンボリックリンクを作成しない限り、これは正常に働きます。
次に示すケースは働きません:
db2->db1 db1/本当にこれが必要な場合は、mysys/mf_format.c を変更する必要があります:
if (!lstat(to,&stat_buff)) /* Check if it's a symbolic link */ if (S_ISLNK(stat_buff.st_mode) && realpath(to,buff)) to if (realpath(to,buff))
WRI
TE
ロックのロック方法は次のように働
きます:
テーブル上にロックがない場合 write ロックを置き、そうでなければ write ロッ
クキューにロックを置きます。
MySQL が使用する REA
D
ロックのロック方法は次のように働き
ます:
テーブル上に write ロックがない場合 read ロックを置き、そうでなければ
read ロックキューにロックを置きます。
ロックが解放されたとき、最初に write ロックキュー内のスレッドに、その後
read ロックキュー内のスレッドにロックを与えます。
これは、同じテーブルで多くの更新をする場合、select ステートメントは
update がなくなるまで待たされることを意味します。
同じテーブルで多くの insert と多くの select を行う場合、これを解決するに
は、他のテーブルに行を挿入して、たまに、その一時テーブルから全てのレコー
ドをもう一方のテーブルに update します。
これは次のコードで行えます:
LOCK TABLES real_table WRITE, insert_table WRITE insert into real_table select * from insert_table delete from insert_table UNLOCK TABLES一つのキューだけを使用するように mysys/thr_lock.c 内のロックコードを変更 することもできます。この場合、write ロックは read ロックと同じ優先順位に なります。これはいくつかのアプリケーションを助けます。
N
OT
NUL
L
を使用してください。これは全てをより速くし、項目
毎に1ビットを節約します。
●
全ての項目はデフォルト値を持ちます。デフォルト値が容認できない時のみ、挿入
してください。insert ステートメント内で timestamp または autoincrement
インデックスを挿入する必要はありません。 ﹁最後に挿入された行のユニークIDをどのように得られるか?﹂節参照 。
●
可能ならばより小さいテーブルを得るために、より小さい INT 型を使用してください。
例えば ME
DIU
MIN
T
はしばしば I
NT
よりも良いです。
●
VAR
CHA
R
項目を持たない場合は、固定サイズレコード形式が使用されます。
これはかなり速いです。しかしあいにくいくらかの領域を浪費します。
﹁行形式の種類は? また VARCHAR/CHAR の使用時は?﹂節参照 。
●
MySQL がクエリをより最適化するように、関連データがロードされる
と一度 i
sam
chk
--
ana
lyz
e
をテーブルに対して実行してください。これ
は各インデックスの値を更新し、このインデックスに同じ値が平均で何行あるか
を知らせます。もちろん、ユニークインデックスではこれは常に1です。
●
インデックスとインデックスに一致するデータをソートするために
is
amc
hk
--s
ort
-in
dex
--
sor
t-r
eco
rds
=1
を使用してください(あなたが
インデックス1でのソートを望む場合)。数値順で全てのレコードを読みたいユ
ニークインデックスをもっていれば、これはそれをより速くさせる良い方法です。
●
テーブルにデータをロードする時、L
OAD
DA
TA
FRO
M I
NFI
LE
を使用してくださ
い。これは多くの IN
SER
T
の使用よりも通常20倍速くなります。テキ
ストファイルがサーバ上にない場合、まずそれをサーバに rcp してください。
﹁LOAD DATA INFILE 構文﹂節参照 。
多くのインデックスを持つテーブルへデータをロードする時、次を行うことにより、もっ
と速度を得ることができます:
●
CRE
ATE
TA
BLE.
..
で mysql または perl でテーブルを作成します。
●
mys
qla
dmi
n r
efr
esh
を行ないます。
●
isa
mch
k -
-ke
ys-
use
d=0
da
tab
ase
/ta
ble
_na
me
を使用します。これは全
てのインデックスの使用をテーブルから削除します。
●
LOA
D D
ATA
IN
FIL
E...
でデータをテーブルに挿入します。
●
pack_isam を持っていて、テーブルを圧縮したい場合、pack_isam を実行します。
●
isa
mch
k -
r -
q d
ata
bas
e/t
abl
e_n
ame
でインデックスを再生成します。
●
mys
qla
dmi
n r
efr
esh
を行ないます。
LOA
D D
ATA
FR
OM
INF
ILE
と INS
ERT
の両方について、いくらかの
速度を得るための他の可能性は、キーバッファを増大することです。これは
(s
afe)
mys
qld
に対する -O
key
_bu
ffe
r=#
オプションで行なうこ
とができます。例えば、多くの RAM を持っている場合、16M は良い値です :)
●
他のプログラムへのテキストファイルとしてデータをダンプする時は、
SEL
ECT
...
IN
TO
OUT
FIL
E
を使用してください。 ﹁LOAD DATA INFILE 構文﹂節参照 。
●
多くの行の挿入/更新を行なう時は、テーブルへの L
OCK
TA
BLE
の使用により、
さらに速度を得ることができます。.
..F
ROM
IN
FIL
E...
と
.
..I
NTO
OU
TFI
LE..
.
は原子的ですので、それらの使用時に L
OCK
TAB
LES
を行なう必要はありません。 ﹁LO
CK
TAB
LES
構文﹂節参照 。
あなたがどのように行なっているかをチェックするために、i
sam
chk
-e
vi
を .ISM ファイルに対して実行してください。
LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23) INSERT INTO a VALUES (2,34) INSERT INTO a VALUES (4,33) INSERT INTO a VALUES (8,26) INSERT INTO a VALUES (6,29) UNLOCK TABLES;主な速度差は、全ての insert でインデックスバッファが一度だけディスクにフ ラッシュされることです。通常は insert があるのと同じくらい多くのインデッ クスバッファフラッシュがあります。 ロックも複数接続テストの合計時間を低くしますが、いくつかのスレッドの最大 待ち時間は上がります。 例えば:
thread 1 does 1000 inserts thread 2, 3, and 4 does 1 insert thread 5 does 1000 insertsロックを使用しない場合、2, 3 そして4は1と5の前に終ります。ロックを 使用する場合、2,3,4 は1や5の前に終わることはおそらくありませんが、合 計時間は約 40 % 速くなります。
INS
ERT
, UP
DAT
E
そして DEL
ETE
は MySQL では
とても速いので、1行内に約5以上の inserts/updates を行なう全ての回りに
ロックを追加することにより、全般的により良い性能が得られます。とても多い
insert を行に行なう場合、他のスレッドにそのテーブルへのアクセスを与えるために
UNL
OCK
TA
BLE
S
つづいて LO
CK
TAB
LES
を間に一度 (約 1000 行
ごとに) 行ないます。これでもまだ良い性能が得られます。
もちろん L
OAD
DA
TA
INF
ILE
はとても速いです。
mys
qld
を開始します。よりメモリを持っている場
合は、より速度を与えます。 ﹁MySQL のバッファサイズの変更方法﹂節参照 。
●
SEL
ECT
をより速くするためにインデックスを作成します。
﹁MySQL はどのようにインデックスを使用するか?﹂節参照
●
項目型を可能な限り能率的に最適化します。全ての項目に NOT
NU
LL
を
使用します。
﹁私のテーブルをできるだけ速く/小さく扱う方法は?﹂節参照
●
--s
kip
-lo
cki
ng
は SQL 要求間のファイルロックを無効にします。これ
はより大きな速度を与えますが、次の結果になります:
●
isa
mch
k
でテーブルのチェック/修復を試みる前に、全てのテーブルを
mys
qla
dmi
n r
efr
esh
でフラッシュ しなければなりません。
(is
amc
hk
-d
tab
le_
nam
e
はいつでも許されます)。
●
同じデータファイルに対して2つの MySQL サーバを実行できません。
両方が同じテーブルを更新しようとする場合。
MIT スレッドでコンパイルする時は --s
kip
-lo
cki
ng
がデフォルトです。
これは全てのプラットフォームで MIT スレッドが flock() を完全にサポートし
ていないためです。
●
更新が問題の場合は、更新を遅らせて、後で行の多くの更新を行なうことができ
ます。行内で行なわれる多くの更新は、同時に一つよりもとても速くなります。
●
問題が MIT スレッドで、FreeBSD を使用している場合、FreeBSD 3.0 (またはそ
れ以上) へのアップグレードが助けになります。これはソケットの使用を可能に
し(現在の MIT スレッドでの TCP/IP よりも速くなります)、スレッドパッケー
ジをさらに完成させます。
VAR
CHA
R()
のエミュレートに使用します:
VAR
CHA
R
, BLO
B
または TEX
T
項目型のどれも使用しない
場合、固定行サイズが使用されます。そうでなければ、動的行サイズが使用され
ます。CHA
R()
と VAR
CHA
R()
は、アプリケーションの観点からは
同じに扱われます; 両方とも、項目がアクセスされた時に、項目から終りの空白
を取り除きます。
テーブルに使用された形式は i
sam
chk
-d
でチェックできます。
MySQL は3つの異なったテーブル形式を持ちます:
(一)
固定長テーブル。
●
これはデフォルト形式です。VARCHAR(), TEXT または BLOB 項目型がテーブルに
ない場合に使用されます。
●
全ての CHAR(), NUMERIC() そして DECIMAL() 項目は空白が埋められます。
●
とても速い。
●
キャッシュが簡単。
●
クラッシュ後の再構築が簡単。レコードが固定位置にあるため。
●
多くのレコードが削除され、領域をOSに解放したいのでなければ、(isamchk
で)再編成する必要はありません。
●
これは通常は動的テーブルよりも多くのディスク領域を使用します。
(二)
動的テーブル
●
VAR
CHA
R
, TEX
T
または BLO
B
項目がテーブル内に存在する時に使
用されます。
●
全ての文字列は動的です(長さが3未満の場合を除きます)。
●
各レコードの最初には、どの項目が空 ('') または 0 (これは null 項目と同じ
ではありません)かを示すビットマップがあります。各文字列は長さバイト+文字
列で保存されます。文字列が 0 長または数値 0 の場合、ビットマップにマーク
され、ディスクに保存されません。
●
各レコードは正確に要求されたレコード領域が使用されます。レコードが大きく
なると、要求された多くの断片に分割されます。
●
通常は、固定長レコードよりも小さいディスク領域を使用します。
●
行長を拡張する情報で行を更新する場合、行はフラグメントされます。この場合
より良い性能を得るためには、時々 isa
mch
k -
r
を実行する必要があり
ます。isa
mch
k -
ei
tab
le_
nam
e
をいくつかの統計のために使用します。
●
再構築は簡単ではありません。レコードが多くの断片にあり、リンクが失われて
いるためです。
●
動的サイズのレコードの期待される行の長さは次です: 3 + (項目数 + 7) / 8 +
(文字型列の数) + パックされた数値項目のサイズ + 文字列の長さ + (null 項目 +
7) / 8 。各リンクには6バイトのペナルティがあります。更新がレコードの拡張
を引き起こす場合に、動的レコードはリンクされます。新しい各リンクは少なく
とも20バイトであり、そのため次の拡張はおそらく同じリンクに行なわれます。
そうでなければ他のリンクになります。いくつのリンクがあるかは
isa
mch
k -
ed
でチェックできます。全てのリンクは i
sam
chk
-r
で削除されます。
(三)
圧縮されたテーブル:
●
pack_isam ユーティリティで作成された読み込み専用テーブル。拡張
MySQL email サポートを持つ全ての顧客は、内部使用するための
pack_isam のコピーの権利を与えられます。
●
非圧縮コードが全ての MySQL 配布に存在します。pack_isam を持って
いない顧客でも、pack_isam で(同じプラットフォーム上で)圧縮されたテーブル
を読み込むことができます。
●
とても少ないディスク領域を使用します。最小限のディスク使用法。
●
各レコードは圧縮されて分割されます (とても少ないアクセスオーバーヘッド)
レコードのヘッダは、テーブル中で一番大きなレコードに依存して 1-3 バイト
に固定されます。各項目は別々に圧縮されます。いくつかの圧縮形式は:
@itemized @bullet
●
各項目に種々のハフマンテーブルがあります。
●
サフィックス空白の圧縮。
●
プレフィックス空白の圧縮。
●
値 0 の数値は1ビットに格納される。
●
より小さい範囲で整数が使用された場合、整数項目は可能な一番小さい型で格納
されます。例えば LONGLONG(8バイト)項目は、全ての値が 0-255 の範囲にあれ
ば、TINYINT 項目として格納されます。
●
値が可能な値の小さなセットだけならば、値は enum() に変換されます。
●
項目は上の圧縮の組み合わせを使用します。
(四)
固定または動的長レコードを操作できます (BLOB や TEXT 項目がない場合)。
(五)
isamchk で非圧縮にできます。
MySQL は異なるインデックス型をサポートできますが、通常の一つは NISAM で
す。これは B-tree インデックスで、インデックスファイルのサイズを荒く計算
できます: 全てのキーの次の合計:
(ke
y_l
eng
th+
4)*
0.6
7
(全てのキーがソート順に挿入された時、これは最悪のケースです。)
文字列インデックスは圧縮された空白で、最初のインデックス部が文字列の場合、
それは圧縮された prefix でもあります。項目が 100% に満たない場合または多
くの重複がある場合、これは通常インデックスファイルをより小さくします。
mys
qla
dmi
n s
tat
us
を実行した時、次のようなものが得られます:
Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12これは、あなたが6個しかテーブルを持っていない場合、いくらか惑わせます。 MySQL はマルチスレッドなので、同じテーブルで一度に多くのクエリを持て ます。同じファイル上で異なる状態を持つ2つのスレッドで、問題を最小化する ため、同時に動作する各スレッドのためテーブルを再びオープンします。これはいくつ かのメモリとデータファイルについての一つの拡張ファイル記述子を使用します。 インデックスファイル記述子は全てのスレッド間で共有されます。
Go to the first, previous, next, last section, table of contents.