Go to the first, previous, next, last section, table of contents.


MySQL の最大性能を得る方法は?

MySQL のバッファサイズの変更方法

現在のバッファサイズを次で得ることができます:

> ./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 によって検出される多く の制限がこれに依存します。デフォルトで通常は十分です。
MySQL 使   MySQL  使:
> 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 --help mysqladmin variables  使 mysqld ''  200  200 * (max_number of tables in join) 

MySQL 


 Linux  MySQL  OS:

Linux pgcc  -O6   sql_yacc.cc gcc/pgcc  180M  libstdc++ MySQL   configure  CXX=gcc 

-static TCP/IP  Unix  使


gcc  pgcc 使 -O6   gcc  11% 
(-static ) 13% 
(localhost )Unix  TCP/IP 使  7.5% 
Sun SPARCstation 10 gcc 2.7.3  Sun Pro C++ 4.2  13% 
Solaris 2.5.1 mit-pthreads  Solaris  8-12% 

TCX  MySQL-linux  pgcc 

MySQL 使



key_buffer 
 (64K) (  net_buffer_length) 使

 memmap  ()  4GB  32bit 64bit   memmap 
mysqld   FIFO  ( key_buffer)
( record_buffer)
 MySQL  
1使 (HEAP)  (= ) BLOB  HEAP   tmp_table_size  'The table ### is full'   (HEAP)   (NISAM)  mysqld  -O tmp_table_size=#   SQL  SQL_BIG_TABLES  SET OPTION  MySQL 3.20   recordbuffer*16 使 recordbuffer mysqld  --big-tables 
使 / ( malloc/free )
 3 * (BLOB )  BLOB 58 + BLOB 使
BLOB  BLOB   BLOB 
FIFO  642 使2
mysqladmin refresh 使 使 使

mysqld ps  使 Solaris ps 使 使'swap -s'    mysqld 

MySQL 使


, PRIMARY, UNIQUE  INDEX()   B tree   CREATE INDEX () 

 WHERE 


(, MySQL )

 SELECT ... WHERE  使select 使 EXPLAIN 使  EXPLAIN SELECT   MySQL 使 


 () ((a AND b) AND c OR (((a AND b) AND (c AND d)))) -> (a AND b) OR (a AND b AND c AND d)
 (a<b AND b=c) AND a=5 -> b>5 AND b=c AND a=5
 () (b>=5 AND b=5) OR (b=6 AND 5=5) OR (B=7 AND 5=6) -> B=5 OR B=6
使
 WHERE  CONST(*)   NOT NULL 
 select  0 
GROUP BY  group 使HAVING   WHERE 
 WHERE    WHERE 
使 使使: =, >, >=, <, <=, BETWEEN 'somthing%'   LIKE
 AND 

 index_parts 
index = 1 or A = 10 -> NULL (使)
index = 1 or A = 10 and index=2 -> index = 1 OR index = 2
index_part_1 = const and index_part_3 = const -> index_part_1 = const

:

(一) 0 1
(二) 使

const_table.index = constant
const_table.index_part_1 = const_table2.column and const_table.index_part_2 = constant

:( ORDER BY  GROUP 
order   group  order  group 
使  30%  使 (quick table scan)使
HAVING 

MySQL  & 


 table-cache (  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))


3   select 

How does MySQL lock tables?


MySQL 

MySQL 使 WRITE  :

 write  write 

MySQL 使 READ  :

 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 

/



 NOT NULL 使 1
insert  timestamp  autoincrement   ID 
 INT 使  MEDIUMINT  INT 
VARCHAR 使    VARCHAR/CHAR 使 
MySQL   isamchk --analyze  1
  isamchk --sort-index --sort-records=1 使( 1)
LOAD DATA FROM INFILE 使  INSERT 使20  rcp   LOAD DATA INFILE   :

CREATE TABLE...  mysql  perl 
mysqladmin refresh 
isamchk --keys-used=0 database/table_name 使 使
LOAD DATA INFILE... 
pack_isam pack_isam 
isamchk -r -q database/table_name 
mysqladmin refresh 
LOAD DATA FROM INFILE  INSERT    (safe)mysqld  -O key_buffer=#   RAM 16M  :)
SELECT ... INTO OUTFILE 使 LOAD DATA INFILE  
/ LOCK TABLE 使 ...FROM INFILE...   ...INTO OUTFILE... 使 LOCK TABLES  LOCK TABLES  

isamchk -evi  .ISM 

 INSERT 


:


: (3)
: (2)
: (2)
: (1 x )
: (1 x indexes)
: (1)

 ()  (1)

 N log N  (B-tree)


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 415 使2,3,4 15  40 % 

INSERT, UPDATE  DELETE  MySQL  15 inserts/updates    insert   UNLOCK TABLES  LOCK TABLES  ( 1000  ) 

 LOAD DATA INFILE 

 DELETE 


 1M   ( 16M )

 MySQL 



 mysqld   MySQL  
SELECT   MySQL 使
 NOT NULL  使  /
--skip-locking  SQL  :

isamchk /  mysqladmin refresh   (isamchk -d table_name )
2 MySQL 
MIT  --skip-locking   MIT  flock() 

 MIT FreeBSD 使FreeBSD 3.0 ( ) 使 ( MIT  TCP/IP )

  VARCHAR/CHAR 使


MySQL  SQL VARCHAR() 

MySQL 3  VARCHAR() 使:

VARCHAR, BLOB  TEXT 使 使使 CHAR()  VARCHAR()  ; 

使 isamchk -d 

MySQL 3:


(一)

VARCHAR(), TEXT  BLOB  使
 CHAR(), NUMERIC()  DECIMAL() 



OS(isamchk  )
使

(二)

VARCHAR, TEXT  BLOB 使
(3)
 ('')  0 ( null  )+  0  0 
使
使
 isamchk -r  isamchk -ei table_name 使

: 3 + ( + 7) / 8 + () +  +  + (null  + 7) / 8 6 20   isamchk -ed  isamchk -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  : : (key_length+4)*0.67 ()  prefix  100% 


mysqladmin status :
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.