SQLの高速化

データベースを高速化するにはさまざまな手法があります。

WHERE句の順序にもよります。簡単に言うと条件の厳しいものから先に行うというのがあります。
簡単に複数のテーブルを結合する場合
Aテーブル(マスタ)項目1,項目2,項目3
Bテーブル(サブ参照用1)コード,名称
上記テーブルよりデータを検索するとします。

このときマスタの抽出→マスタとBテーブルの結合とするほうが
SELECT A.項目1,A.項目2,A.項目3,B.名称
FROM A,B
WHERE
A.項目1 = 条件 AND
A.項目2 = B.コード(+)

マスタとBテーブルの結合→マスタの抽出よりも
SELECT A.項目1,A.項目2,A.項目3,B.名称
FROM A,B
WHERE
A.項目2 = B.コード(+) AND
A.項目1 = 条件

早く抽出が行われます。


インデックスキー(主キー)を有効に使用する。
テーブルの作成時にインデックスキーを作ってなかった場合には次のようにして追加できます。
MySQLの例
ALTER TABLE `テーブル名` ADD `フィールド名` INT( 8 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;


HAVING句を極力使わない。
WHERE句より明らかに遅いです。

インデックスキーを指定する。
インデックスの追加
ALTER TABLE `テーブル名` ADD INDEX ( `フィールド名` ) ;

インデックスの削除
ALTER TABLE `テーブル名` DROP INDEX `フィールド名` ;
MySQLの400万レコードで試すと6.0018秒が0.0004秒となります。
異なる値が多い、または結合条件に使用されるフィールドに使用するといいです。
インデックスを作成することでテーブルの容量は10〜30%大きくなります。
更新するときにインデックスも更新されるので少し更新は遅くなります。

あまりよい手法ではないと思いますが
SELECT文でORDER句を指定するより、テーブルのデフォルトで指定する。

SELECT *
FROM `テーブル名` ORDER BY `フィールド名` DESC
より
ALTER TABLE `テーブル名` ORDER BY `フィールド名` DESC
として
SELECT * FROM `テーブル名`
とするほうが断然早いです。
MySQLの400万レコードで試すとSELECTで指定したときは6.0018秒に比べ、標準で指定しておいたときは0.0010秒となり、結果も同じです。
ただしこれは1テーブルにつき1カラムにしか指定できません。
また標準で並び順を指定したものをSELECT文でさらに指定をすると、標準で指定してないときと同じ結果になります。


管理は面倒になりますがテーブルをいくつかに分ける。
同じ内容の400万レコードと60万レコードを比べただけでも6.0018秒と0.7561秒と当然のごとく違いがでます。


ぺんたん.info あかいひ.com IPくん.com 8枠.com - 競馬情報 galhime.com

PC Q&A|Linux|古い記事|雑学|ラーメン