以下のテーブルはi1 char(10)の列に `i1` (`i1`(3))と文字数を3文字に制限したインデックスを
作成してある。最初の3文字でデータが比較出来るようなSELECT文を実行した場合
参照するIndexのデータ量も少なくパフォーマンスが向上する。
但し、対外は色々なアプリケーションから一つのテーブルを参照する事が殆どだと思いますので
あまり利用する頻度は高くありません。列にNOT NULLを常に設定するなどと心がけて対応
する方が実際の運用では全体的なパフォーマンスを向上してくれるかと思います。


CREATE TABLE `fastindex` (
`i1` char(10) NOT NULL default '',
`i2` char(10) NOT NULL default '',
KEY `i1` (`i1`(3)),
KEY `i2` (`i2`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

show_index_char

SELECT i1 FROM fastindex WHERE i1 LIKE 'abc%';
SELECT i2 FROM fastindex WHERE i2 LIKE 'abc%';

以下のEXPLAINではデータが殆ど入っていないので、PLANは変わりませんが
i1のインデックスは最初の3文字のみを利用して作成されているので、上記のSELECT
を実行した場合「WHERE i1 LIKE ‘abc%’;」の方が実行が早い。
index_fast

—————————————————————————————————————-
Indexing cannot only help speed up SELECT queries, but it can also improve
UPDATE and DELETE statements. This is because indexing can help the
server

    find the rows more quickly that should be updated or deleted

.
On the other hand, indexes will slow down UPDATE and DELETE statements because
not only the original data have to be updated but also the indexes.
—————————————————————————————————————-

WHERE, ORDER BY, GROUP BYを利用しない場合やデータの種類が少ない場合は
INDEXを付けてもパフォーマンスが向上する事は殆どありません。INSERT、DELETE、
UPDATEなどの処理でINDEXの更新も入るので遅くなる場合が考えられます。
インデックスが実際に利用されるかどうか常にイメージしながらINDEXを作成するように
心がけると良いかも知れません。

    以下のテーブルはName列に5文字を利用したIndexを付与してあります。


CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `idx_City_Name` (`Name`(5))
) ENGINE=MyISAM AUTO_INCREMENT=4083 DEFAULT CHARSET=utf8;

index_on_city

後からインデックスを追加する場合は、以下のようなコマンドを実行すれば良い。
——————————
mysql> CREATE INDEX Name ON City(Name(5));
mysql> ALTER TABLE City ADD INDEX(Name(5));

データのINSERT処理を早くするには?
————————————————————————————————————————-
You could use multiple-row inserts, rather than single-row inserts.
LOAD DATA INFILE will run even faster than any INSERT statement that inserts the
same amount of rows. For InnoDB tables, you could group inserts within a transaction
so that InnoDB will flush changes only when the transaction ends,
rather than after every single INSERT statement. If you’re planning to replace rows using
DELETE and INSERT, you could as well use the MySQL extension REPLACE that runs faster.

For a multiple-row INSERT statementでエラーが起きた場合………….
■ MyISAM では, エラーが起きるまでデータがINSERTされます。
■ InnoDBでは, Rolls backが起きてデータが一見もINSERTされずテーブルはEmptyのままになります。

Comments are closed.

Post Navigation