MYSQLのシステム状況を確認する方法

mysql>

show status;

+———————————–+———–+
| Variable_name | Value |
+———————————–+———–+
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Binlog_cache_disk_use | 0 |
| Binlog_cache_use | 0 |
| Bytes_received | 5433 |
| Bytes_sent | 33501 |
| Com_admin_commands | 0 |

………

| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 1 |
| Uptime | 16145 |
| Uptime_since_flush_status | 16145 |
+———————————–+———–+
267 rows in set (0.48 sec)

[root@colinux ~]#

mysqladmin extended-status -u root -p

Enter password:
+———————————–+———-+
| Variable_name | Value |
+———————————–+———-+
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Binlog_cache_disk_use | 0 |
| Binlog_cache_use | 0 |
| Bytes_received | 5535 |
| Bytes_sent | 40218 |
| Com_admin_commands | 0 |
| Com_assign_to_keycache | 0 |

………

| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 2 |
| Threads_running | 1 |
| Uptime | 16594 |
| Uptime_since_flush_status | 16594 |
+———————————–+———-+
[root@colinux ~]#


MYSQL Administrator –> Health —> Status Variables

status_variable

データの場所やら現在の接続数など。。。
showstatus

MYISAMのキーバッファーが少ない事を確認して一時的に増やしたり….
key_buffer

※ global server system variableを設定するには、「SUPER」権限が必要です。
※ SET GLOBALは、 設定を実行した後にMYSQLに接続してくる全てのクライアントに適用されます。

————–以下のコマンドは同じ設定変更をします———————-  
set global key_buffer_size = 5 * 1024 * 1024;
set @@global.key_buffer_size = 5 * 1024 * 1024;
—————————————————————————————

buffer

ちなみにSYSMTEM VARIABLESは、幾つかの方法で設定が可能です。

1 ) MYSQLのオプションファイル(永続的)
2 ) mysqldコマンドでサーバーを立ち上げる時のスタートアップオプションとして
3 ) SET GLOBALコマンド
4 ) SET SESSION(or SET LOCAL)コマンド

どのようなコマンドが何回実行されたかが、show statusから判断可能…………

mysql> show status like ‘Com_%’;
+—————————+——-+
| Variable_name | Value |
+—————————+——-+
| Com_admin_commands | 0 |
| Com_assign_to_keycache | 0 |
| Com_alter_db | 0 |
| Com_alter_db_upgrade | 0 |
| Com_alter_event | 0 |
| Com_alter_function | 0 |
| Com_alter_procedure | 0 |
| Com_alter_server | 0 |
…………………….

| Com_xa_prepare | 0 |
| Com_xa_recover | 0 |
| Com_xa_rollback | 0 |
| Com_xa_start | 0 |
| Compression | OFF |
+—————————+——-+
143 rows in set (0.27 sec)

ちなみに、Query Cache上で実行されたSELECTは記録されません。

select

Query Cache上で実行された回数は、「Qcache_hits」からカウント出来るよう…..です。

mysql> show status like ‘Qcache_hits’;
+—————+——-+———
| Variable_name | Value |
+—————+——-+———
| Qcache_hits | 23 |
+—————+——-+———
1 row in set (0.35 sec)

——————————————————————–
おまけ
稼働時間、スレッド数、Query。。。。など
——————————————————————–
[root@colinux ~]# mysqladmin -u root status -p
Enter password:
Uptime: 475 Threads: 1 Questions: 7 Slow queries: 0 Opens: 17 Flush tables: 1 Open tables: 4 Queries per second avg: 0.14

[root@colinux ~]#


FULLTEXTインデックスをシングルカラムに付けたテーブルを作成して検索してみる。
FULLTEXTは2つ作成し、それぞれ別々の列に作成。

single_column_ft

CREATE TABLE `T_FULLTEXT` (
id int UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title varchar(100) NOT NULL,
body varchar(45) NOT NULL,
FULLTEXT (title),
FULLTEXT (body)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;


INSERT INTO T_FULLTEXT (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. MSSQL','In the following database comparison ...'),
('DBMS and MYSQL','MYSQL is Open Source database ...'),
('MySQL Security','When configured properly, MySQL ...');

single_column_ft_result

————————————————————————-
[制限事項など] ↓
————————————————————————-

50_percent

この例で、「MySQL」という言葉は少なくとも 50 % の行で提示されているため、
検索結果は空になります。このように,この言葉は効果的にストップワードとして扱われます。
大きなデータセットでは、これは最も望ましい動作です : 自然言語のクエリは、1GB テーブルの
毎 2 行目は戻さないようになっています。
小さなデータセットにとっては、これはあまり望ましい動作ではありません。

テーブルの行の半分にマッチする言葉は、関連のある資料を見つけるのに適しません。
事実、関連のないものも大量に検出されるでしょう。これはインターネットのサーチエンジン
での検索と同じ論理です。このため、この言葉を含む行は、この特定のデータセットにおいて
語義の値が低く定められています。あるデータセットでは、提示された単語が 50% の
境界値を越えても、他のデータセットではまた異なります。

50% の境界値は、全文検索を行うとその重要性が明らかになります : テーブルを作成し、
テキストの 1 行または 2 行のみをインサートしてみると、テキストのすべての単語は
少なくとも 50% の行に存在することが分かります。そのため、検出結果は検出されません。
少なくとも 3 行以上をインサートするようにしてください。

確かめる為に”MYSQL”という言葉を含まないデータを全体の50%以上Insertしてみて、
再度”MYSQL”という文言を含むデータを検索してみた。結果は全て表示されるようになった。

50_percent_rule

* 単語のあるものは、全文検索では無視されます :
* 短すぎる単語は無視されます。全文検索で検出される言葉で最も短いものは 4 文字です。
* ストップワード リストにある言葉は無視されます。ストップワードは 「the」 や 「some」 などの常用語で、
語義の値はゼロとされています。すでに組み込まれているストップワードのリストがありますが、
ユーザ定義リストで書き換えることができます。

11.7. 全文検索関数
11.7.3. 全文ストップワード
11.7.5. 微調整 MySQL 全文検索


myisampackで圧縮したテーブルは、書き込みも、ALTERも出来ません。
でも書き込みたいことも、変更したくなることもあると思います。
そんな時は再度、解凍してしまいましょう。

insertintocompress

[root@colinux DB01]# myisamchk --unpack TABLE101.MYI
- recovering (with sort) MyISAM-table 'TABLE101.MYI'
Data records: 0
- Fixing index 1
- Fixing index 2

[root@colinux DB01]#

サービスを再起動して確認
uncompress

「サービスを再起動しなくてもいい方法」

alter tableを利用

mysql> use DB01;
Database changed
mysql> select TABLE_NAME,ROW_FORMAT from information_schema.TABLES
-> where TABLE_SCHEMA = 'DB01' and TABLE_NAME = 'TABLE101';
+------------+------------+
| TABLE_NAME | ROW_FORMAT |
+------------+------------+
| TABLE101 | Compressed |
+------------+------------+
1 row in set (0.01 sec)

mysql> insert into TABLE101(title,body) values('Compress','insert test into Compressed');
ERROR 1036 (HY000): Table 'TABLE101' is read only
mysql> create table TABLE101_TMP like TABLE101;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into TABLE101_TMP select * from TABLE101;
Query OK, 30 rows affected (0.02 sec)
Records: 30 Duplicates: 0 Warnings: 0

mysql> drop table TABLE101;
Query OK, 0 rows affected (0.00 sec)

mysql> alter table TABLE101_TMP rename to TABLE101;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> select TABLE_NAME,ROW_FORMAT from information_schema.TABLES
-> where TABLE_SCHEMA = 'DB01' and TABLE_NAME = 'TABLE101';
+------------+------------+
| TABLE_NAME | ROW_FORMAT |
+------------+------------+
| TABLE101 | Dynamic |
+------------+------------+
1 row in set (0.00 sec)

mysql>

table_alter

※ その他の方法としては、mysqldumpで対象のテーブルをバックアップして,mysqlコマンドでリストアする。


myisampackユーティリティはMyISAMテーブルを圧縮します。
myisampackはテーブル内の各カラムを別個に圧縮することで作動します。
通常、myisampackは40%-70%データファイルをパックします。

圧縮後は、読み取り専用テーブルになります。
過去ログをなどに利用すると便利ですね。

[root@colinux DB01]# myisampack -v TABLE100
User time 0.02, System time 0.14
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 380, Physical pagefaults 15, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 9, Involuntary context switches 3

[root@colinux DB01]# myisamchk -rq --analyze --sort-index TABLE100.MYI
- check record delete-chain
- recovering (with sort) MyISAM-table 'TABLE100.MYI'
Data records: 7
- Fixing index 1
- Fixing index 2
- Sorting index for MyISAM-table 'TABLE100.MYI'

[root@colinux DB01]# mysql -u root -p DB01
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.30-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> FLUSH TABLES;
Query OK, 0 rows affected (0.00 sec)


7.6. myisampack — 圧縮された、読み取り専用MyISAM テーブルを作成する。

[root@colinux DB01]# myisampack -v TABLE101
Compressing TABLE101.MYD: (0 records)
- Calculating statistics

normal: 0 empty-space: 0 empty-zero: 0 empty-fill: 0
pre-space: 0 end-space: 0 intervall-fields: 0 zero: 1
Original trees: 3 After join: 1
- Compressing file
Empty file saved in compressed format
Remember to run myisamchk -rq on compressed tables

User time 0.01, System time 0.03
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 398, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 1, Involuntary context switches 21

[root@colinux DB01]# myisamchk -rq --analyze --sort-index TABLE101.MYI
- check record delete-chain
- recovering (with sort) MyISAM-table 'TABLE101.MYI'
Data records: 0
- Fixing index 1
- Fixing index 2
- Sorting index for MyISAM-table 'TABLE101.MYI'

[root@colinux DB01]# mysql -u root -p -e "SHOW TABLE STATUS LIKE 'TABLE101'" DB01
Enter password:

compressed


TABLES テーブルはデータベースのテーブルに関する情報を提供します。


mysql> select TABLE_NAME,ROW_FORMAT from information_schema.TABLES
-> where TABLE_SCHEMA = 'DB01' and TABLE_NAME = 'TABLE911';
+------------+------------+
| TABLE_NAME | ROW_FORMAT |
+------------+------------+
| TABLE911 | Compact |
+------------+------------+
1 row in set (0.06 sec)

mysql>

どんな情報があるか?
tables

ROW-FORMAT情報など

rows


21.2. INFORMATION_SCHEMA TABLES テーブル


メモリーテーブルは高速で便利ですが、サイズの制限をしておかないとメモリーを使いすぎて
しまうので、「set global max_heap_table_size = xxxxxx」でメモリーの上限を設定しておく。
反対に作成しようとしているテーブルが大きい場合は大きめに設定しておく。

mysql> select @@global.max_heap_table_size;
+------------------------------+
| @@global.max_heap_table_size |
+------------------------------+
| 16777216 |
+------------------------------+
1 row in set (0.00 sec)

mysql> set GLOBAL max_heap_table_size = 1024 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> select @@global.max_heap_table_size;
+------------------------------+
| @@global.max_heap_table_size |
+------------------------------+
| 1048576 |
+------------------------------+
1 row in set (0.00 sec)

mysql>

max_heap

set globalでの変更は、DBの再起動で設定が消えてしまうので、オプションファイル(my.cnf)に書いておく。

メモ:
その他の動的変数はここ 4.2.4.2. 動的システム変数


定期的にInnoDBのテーブルをリビルドする事で、データの追加や削除が原因でおこった
Indexのフラグメンテーションを解消する事が出来ます。

その①
InnoDBテーブルのリビルドの方法として、その他のテーブルのメンテナスと同じように
mysqldumpでダンプを作成して、mysqlコマンドでダンプしたデータをリロードする方法。

その②
Alterコマンドでテーブルをリビルドする。

mysql> alter table DB01.TABLE007 ENGINE = InnoDB;
Query OK, 9 rows affected (0.05 sec)

show_create

————————– その他INNODB————————–
PKは各テーブルに付ける
CHARよりもVARCHARの方が良い(目的によりますが…)
SELECT COUNT(*) はなるべく避ける
データを大量に変更するときは、AUTOCOMMIT Session modeはOFFにしておく
定期的にINNODBのテーブルをリビルドする。


MAX_ROWSでMYISAMテーブルの最大サイズを変更

現在のテーブルの最大サイズを調査


mysql> SHOW TABLE STATUS LIKE 'TABLE100'\G
*************************** 1. row ***************************
Name: TABLE100
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 7
Avg_row_length: 60
Data_length: 420
Max_data_length: 281474976710655
Index_length: 3072
Data_free: 0
Auto_increment: 8
Create_time: 2009-04-13 16:03:30
Update_time: 2009-04-13 16:07:52
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

mysql> select table_name,max_data_length from
-> INFORMATION_SCHEMA.TABLES where
-> TABLE_SCHEMA = 'DB01' AND TABLE_NAME = 'TABLE100';
+------------+-----------------+
| table_name | max_data_length |
+------------+-----------------+
| TABLE100 | 281474976710655 |
+------------+-----------------+
1 row in set (0.00 sec)

mysql>

mysql> select @@global.myisam_data_pointer_size;
+-----------------------------------+
| @@global.myisam_data_pointer_size |
+-----------------------------------+
| 6 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql>

max_data_length

max_data_lenght

@@global.myisam_data_pointer_size

max_data_lenght_2

MAX_ROWS

テーブル内に格納する予定の最大行数。これは、厳しい制限というよりは、ストレージ エンジンに対して、テーブルが少なくてもこの程度の行数を格納できる必要があるという事を表すヒントのような物です。

AVG_ROW_LENGTH

テーブルの平均行長近似値です。可変サイズ行を持つ大きいテーブルに対してのみ、これを設定する必要があります。
MyISAM テーブルを作成する時、MySQL はテーブルが最終的にどの程度の大きさになるのかを決める為に MAX_ROWS と AVG_ROW_LENGTH オプションの製品を利用します。もしどちらのオプションも指定しなければ、テーブルの最大サイズはデフォルトで256 TB になります。(もし使用している OS がその大きさのファイルをサポートしていなければ、テーブル サイズはファイル サイズ制限に制約されます。)もし大きいファイルが必要無く、インデックスを小さく早くする為にポインタサイズを小さくしたければ、myisam_data_pointer_size システム変数を設定する事でデフォルトのポインタ サイズを小さくする事ができます。

※ MYSQL5.0.6~ は4GBから256TBになっている。
You are using a MyISAM table and the space required for the table exceeds
what is allowed by the internal pointer size. MyISAM creates data and index
table files to allow up to 4GB by default (256TB as of MySQL 5.0.6),
but this limit can be changed up to the maximum allowable
size of 65,536TB (2567 – 1 bytes).

To change the default size limit for MyISAM tables, set the myisam_data_pointer_size,
which sets the number of bytes used for internal row pointers.
The value is used to set the pointer size for new tables if you do not specify the
MAX_ROWS option. The value of myisam_data_pointer_size
can be from 2 to 7. A value of 4 allows tables up to 4GB; a value of 6 allows tables up to 256TB.

参考URL

別の最大サイズを指定して、テーブルを作成してみる。


CREATE TABLE TABLE101 (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
title varchar(100) NOT NULL,
body varchar(45) NOT NULL,
PRIMARY KEY (id),
FULLTEXT KEY title (title,body)
) MAX_ROWS=4294967295,AVG_ROW_LENGTH=60 ENGINE=MyISAM DEFAULT CHARSET=utf8;

mysql> select table_name,max_data_length from
-> INFORMATION_SCHEMA.TABLES where
-> TABLE_SCHEMA = 'DB01' AND TABLE_NAME = 'TABLE101';
+------------+-----------------+
| table_name | max_data_length |
+------------+-----------------+
| TABLE101 | 1099511627775 |
+------------+-----------------+
1 row in set (0.00 sec)

mysql> SHOW TABLE STATUS LIKE 'TABLE101'\G
*************************** 1. row ***************************
Name: TABLE101
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 1099511627775
Index_length: 1024
Data_free: 0
Auto_increment: 1
Create_time: 2009-04-15 11:49:44
Update_time: 2009-04-15 11:49:44
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options: max_rows=4294967295 avg_row_length=60
Comment:
1 row in set (0.00 sec)

mysql>

size

おそらくほとんど必要ないが、今後MAX_ROWSを指定せずにより大きいサイズのテーブルを扱いたい場合は以下のようにDefault設定を変更しておく。

mysql> select @@global.myisam_data_pointer_size;
+-----------------------------------+
| @@global.myisam_data_pointer_size |
+-----------------------------------+
| 6 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql>

mysql> set @@global.myisam_data_pointer_size = 7;
Query OK, 0 rows affected (0.00 sec)

mysql> select table_name,max_data_length from INFORMATION_SCHEMA.TABLES where TABLE_SCH EMA = 'DB01' AND TABLE_NAME = 'TABLE100';
+------------+-----------------+
| table_name | max_data_length |
+------------+-----------------+
| TABLE100 | 281474976710655 |
+------------+-----------------+
1 row in set (0.00 sec)

mysql> alter table TABLE100 engine = MyISAM; Query OK, 7 rows affected (0.15 sec)
Records: 7 Duplicates: 0 Warnings: 0

mysql> select table_name,max_data_length from INFORMATION_SCHEMA.TABLES where TABLE_SCH EMA = 'DB01' AND TABLE_NAME = 'TABLE100';
+------------+-------------------+
| table_name | max_data_length |
+------------+-------------------+
| TABLE100 | 72057594037927935 |
+------------+-------------------+
1 row in set (0.00 sec)

mysql>

change


全文検索関数

全文検索は MATCH() … AGAINST シンタックスを用いて行われます。MATCH() は、検索用にカラムに名称をつける、
カンマで区切られたリストを使用します。AGAINST は検索するストリングと、実行する検索のタイプを示すオプション
の修飾子を利用します。検索ストリングは、変数やカラム名ではなく、リテラル ストリングでなければなりません。
全文検索には3種類あります :

* ブール検索は、特別なクエリ言語のルールを使用した検索ストリングを解釈します。
ストリングは検索の対象になる言葉を含みます。また、単語は整合行で提示または不提示にされなければならない、
もしくは、通常より高く、または低く加重するべき、等の条件を指定する演算子も含むことができます。
「some」 や 「then」 のような一般的な単語はストップワードで、検索ストリングにあってもマッチしません。
IN BOOLEAN MODE 修飾子はブール検索を特定します。

* 自然言語の検索は、検索ストリングを人間の自然な言語でのフレーズ ( フリーテキストのフレーズ ) として解釈します。
これには特別な演算子はありません。ストップワード リストは適用されます。また、行の 50% 以上にある言葉は常用語と判断され、
検出はされません。全文検索は、IN NATURAL LANGUAGE MODE 修飾子が与えられている、または修飾子がまったくない場合は、
自然言語検索になります。

* クエリ拡張検索は、自然言語検索が改変されたものです。自然言語検索を行うには、
検索ストリングが使用されます。そして、検索によって返された最も関連性の強い行からの言葉が検索ストリングに加えられ、
再度検索されます。クエリは 2 度目の検索からの行を戻します。
IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION または WITH QUERY EXPANSION 修飾子は、クエリ拡張検索を特定します。

IN NATURAL LANGUAGE MODE および IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 修飾子は、MySQL 5.1.7 から追加されました。

CREATE TABLE `TABLE100` (
  id int UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  title   varchar(100) NOT NULL,
  body    varchar(45) NOT NULL,
  FULLTEXT (title,body)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;

INSERT INTO TABLE100 (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. MSSQL','In the following database comparison ...'),
('DBMS and MYSQL','MYSQL is Open Source database ...'),
('MySQL Security','When configured properly, MySQL ...');

fulltext

SELECT * FROM TABLE100
WHERE MATCH (title,body)
AGAINST ('DBMS' IN NATURAL LANGUAGE MODE);

SELECT LEFT(title,20),LEFT(body,20) FROM TABLE100
WHERE MATCH (title,body) AGAINST ('DBMS');

fulltext_2


PROCEDURE ANALYSE() と DESCRIBEでテーブルの妥当性を確認。


mysql> select * from TABLE911 PROCEDURE ANALYSE()\G
*************************** 1. row ***************************
Field_name: DB01.TABLE911.id
Min_value: 10
Max_value: 21
Min_length: 2
Max_length: 2
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 15.5000
Std: 3.4521
Optimal_fieldtype: ENUM('10','11','12','13','14','15','16','17','18','19','20','21') NOT NULL
*************************** 2. row ***************************
Field_name: DB01.TABLE911.comment
Min_value: AAAAAAAAAAAAAA
Max_value: LAAAAAAAAAAAAA
Min_length: 14
Max_length: 14
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 14.0000
Std: NULL
Optimal_fieldtype: ENUM('AAAAAAAAAAAAAA',,'LAAAAAA [HUP]
2 rows in set (0.00 sec)

mysql> desc TABLE911;
+---------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------------+------+-----+---------+----------------+
| id | int(4) unsigned | NO | PRI | NULL | auto_increment |
| comment | varchar(45) | NO | MUL | NULL | |
+---------+-----------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql>

【考察】
————————–
① COLUMNSはどちらもNOT NULLなのでOK

② MAX_LENGTH 14に対して、VARCHAR(45)は少し値が大きい
Field_name: DB01.TABLE911.comment
Min_value: AAAAAAAAAAAAAA
Max_value: LAAAAAAAAAAAAA
Min_length: 14
Max_length: 14
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 14.0000

③ Min_length: 14 とMax_length:14で固定長なのでvarcharの代わりにCharでも良いかも。
反対に差が多い時はvarcharで設定。

④ マイナスの値(Negative)を利用しない時は、UNSIGNEDオプションを付けてテーブルを作成すると
   パフォーマンス的に良いといわれてます。UNSIGNEDオプションを付けた場合には負の数は
使えませんが、floatとdoubleを除いて正ので利用できる数値は2倍に広がります。