goo blog サービス終了のお知らせ 

かけがえのない日々

なんややんや。にょろにょろ。

MySQLディレクトリ構成

2007年02月23日 | SQL
MySQL 3.23.XXより前まではデータファイルの形式に「ISAM」と呼ばれるものが使われていました。そのため、MySQLに用意されているコマンドの中には「ism」で始まるコマンドがいくつかあります。3.23.XX以降、データファイルは「MyISAM」に変更されており、データファイルの互換性や最大サイズが改善されています。少し前ならISAMからMyISAMへの変換方法も紹介する必要がありましたが、ほとんどの方は無意識のうちにMyISAMを使用していると思います。

 MyISAMはデータディレクトリ(/usr/local/varや/va/lib/mysqlなど)に次のようなファイルを作ります。

データベース名/
テーブル名.frm テーブル構造
テーブル名.MYD データファイル
テーブル名.MYI インデックスデータファイル

 データベース中にテーブルを1つ作るたびに、上記の3ファイルが1組になって増えていきます。

INDEX基本

2006年04月28日 | SQL
##インデックス管理
create index インデックス名 on テーブル名 (フィールド名);
create table テーブル名 (index インデックス名 (フィールド名));
alter table テーブル名 add index インデックス名 (フィールド名);
#先頭何文字かまでをインデックス化したいならば、フィールド名(数字)のように指定します。
create index title_index on bib_tb (title(5));
#通常のselect文の前にexplainと入力すると、select文がどのように実行されたのかを見ることができます
explain select * from bib_tb where title like ('日本%');
#削除
drop index インデックス名 on テーブル名;

インデックスについて(その1

2006年04月14日 | SQL
全文インデックスについて(日本語未対応

インデックスを使った検索が可能となるのは、基本的に完全一致のselect文です。
ただし、あいまい検索(部分一致)のlike演算子を使った場合、前方一致(keyword%)であれば問題ないのですが、中央一致(%keyword%)や後方一致(%keyword)の場合は、インデックスを使用することができません。
これは、レコードの前方から一文字ずつをインデックス化しているためです。
しかし、実際の検索では完全一致や前方一致で検索を行うことは少なく、特定のキーワードを含む検索を行うことの方が大半でしょう。
そのような場合は、全文インデックスを使用します。

※日本語を扱うことはできません。

全文インデックスはnot nullであるvarchar型かtext型のフィールドにしか適用できません。

基本構文は通常のindexを作成する場合と同じです。
create fulltext index インデックス名 on テーブル名 (フィールド名);
create table テーブル名 (fulltext インデックス名 (フィールド名));
alter table テーブル名 add fulltext インデックス名 (フィールド名);
など。

※create tableとalter tableでは、インデックス名を省略できます。

全文インデックスの検索方法は、通常の検索や通常のインデックスを用いた場合とは異なります。
基本構文は以下の通りです。
select フィールド名 from テーブル名 where match (フィールド名) against ('検索語');
したがって、title中にjapanを含むレコードを検索する場合、
select * from bib_tb where match (title) against ('japan');
となります。
≫全文検索の場合、基本的に適合度順出力を行うようです。
(詳しくはこちら)。

MySQLで日本語全文検索を行うには・・・
まず形態素解析やN-gramによって文字列をワードごとに分割し、
スペースで区切り、さらに16進数文字に変換したりしてあたかも日本語ではないかのように装う必要があるようです。


ROOTで動かしちゃえ

2006年03月28日 | SQL
**インストール

MySQL3.23.58をインストール


インストール前にユーザーの登録が必要。
# groupadd mysql
# useradd -g mysql -s /noexists -d /usr/local/mysql mysql

適当な場所にダウンロード
/usr/local/src

#tar zxvf mysql-3.23.56.tar.gz
# cd mysql-3.23.56-pc-linux-i686
# ./configure --prefix=/usr/local/mysql --with-charset=sjis --with-extra-charsets=all --with-mysqld-user=root --with-low-memory

#make
約10分

#make install


初期設定
初期化
# ./scripts/mysql_install_db

起動
# /usr/local/mysql/bin/safe_mysqld --user=root &

確認
# /usr/local/mysql/bin/mysqladmin ping
mysqld is alive

ディレクトリの所有者とグループを変更をする。
# chown -R root /usr/local/mysql/
# chgrp -R root /usr/local/mysql/

パスワード設定
# /usr/local/mysql/bin/mysqladmin -u root password "root"


**自動起動設定

# cd /usr/local/mysql/share/mysql
# cp mysql.server mysql
# chmod 755 mysql
# mv mysql /etc/rc.d/init.d


ランレベルシンボリックリンク

# cd /etc/rc.d/rc0.d/
# ln -s ..init.d/mysql K13mysql
# cd ../rc3.d/
# ln -s ..init.d/mysql S90mysql
# cd ../rc5.d/
# ln -s ..init.d/mysql S90mysql
これで完了。


/usr/local/mysqlにアクセス出来ないので

#chmod 755 /usr/local/mysql

**********
クライアントは「/tmp/mysql.sock」を見に行くので
my.cnfにて
[mysqld]
datadir=/var/lib/mysql
socket=/tmp/mysql.sock

php.iniにて
mysql.default_socket = /tmp/mysql.sock

に変更すると幸せ(* ´艸`)
**********

これがホントのインストール!?

2006年03月28日 | SQL
[mysql-3.23.58インストール]

% su
# /usr/sbin/useradd mysql
# mkdir /usr/local/mysql-3.23.58
# mkdir /usr/local/mysql-3.23.58/data
# chown -R mysql.mysql /usr/local/mysql-3.23.58
# su - mysql
% cd /usr/local/src
% tar zxvf mysql-3.23.58.tar.gz
% cd mysql-3.23.58
% env CC=gcc CXX=gcc ./configure \
--prefix=/usr/local/mysql-3.23.58 \
--localstatedir=/usr/local/mysql-3.23.58/data \
--with-charset=ujis \
--with-extra-charsets=all \
--with-unix-socket-path=/tmp/mysqld.32358.sock \
--with-low-memory \
--enable-local-infile \
--with-innodb

% make
% make install
% scripts/mysql_install_db
% su
# cd /usr/local
# ln -s mysql-3.23.58 mysql
# cd mysql-3.23.58/include
# ln -s mysql/* ./
# cd ../lib
# ln -s mysql/* ./
# exit

【MySQL】 InnoDBの特徴と注意点

2006年01月24日 | SQL
SHOW TABLE STATUS から返される InnoDB テーブルの統計情報は、テーブルが確保している物理サイズを除いて正確ではない。
レコードのカウントは、SQL の最適化で使用される大まかな推定値に過ぎない。

カラムの先頭の一部にユニークインデックスを張ろうとすると、エラーになる。
CREATE TABLE T (A CHAR(20), B INT, UNIQUE (A(5))) TYPE = InnoDB;
カラムの先頭の一部に非ユニークなインデックスを張ると、InnoDB はそのカラム全体にインデックスを作成する。

1 つのテーブルに作成できるカラムは 1,000個 までである。

最初の値を設定するには、1 を差し引いた値を持つダミーのレコードを挿入し、その後でダミーのレコードを削除する。