TagMySQL

MyAQL、重複レコード抽出

タグ: MySQL
こんな感じか。
SELECT * FROM table GROUP BY field HAVING count(*)>1;

PRIMARYキーを持たせないテーブルもありかなと思っていたけれど、重複してた場合に、片方だけ削除ということができなくなるのではなかろうか。

参照
http://perltips.twinkle.cc/mysql/dis...

UNION

タグ: MySQL
今覚えたSQL文、それがユニオン
SELECTを合体してソートして出力する。

SELECT t.field FROM table t WHERE t.field='ika'
UNION
SELECT t.field FROM table t WHERE t.field='tako'
UNION
SELECT t.field FROM table t WHERE t.field='ebi'
ORDER BY field LIMIT 7;

こんな感じか。

文脈ばらばらのテーブルから、同じフィールドを出力したい場合に使う。

行数の取得

タグ: MySQL | PHP
mysql_num_rows()
http://zapanet.info/phpdoc/function....

count(*) cnt
みたいので取得していたのだけれど、aliasをselect文内で使っていると行数を取得できなかったので調べた。

x86ってintelのことなのか

MySQLの本体ダウンロードでどれを選べばいいのかよく分かってなかったのだけれど(「Mac OS X 10.4 (PowerPC, 32-bit) 5.0.45 62.9M」を選んでた。べつに動くけど)、x86がintel mac用だという事を昨晩発見。

http://dev.mysql.com/downloads/mysql...
Mac OS X (package format) download > Mac OS X 10.4 (x86) 5.0.45 61.0M

で、なにも考えずアップグレード。

何も考えずにアップグレードしたものだから、バックアップなんか取ってない(まあテストサーバーだからよいのだけれど)。えーと、データは勝手に移行されないので、mysqldumpでバックアップファイルをつくっておいた方が無難です。
/usr/local/mysql/bin/mysql-5.0.41-osx10.4-powerpc/data
みたいな旧フォルダに生データは残っているので、コピーしてみようとトライしてみたけどよく分からなかった。

MySQLのマニュアルを読んでいたら、古いバージョンで立ち上げるようなこともできるみたいだけど追求しない。

あと、アップグレードするとパスワードも初期化されるみたいだから再設定が必要。

アクティビティモニタでmysqldを見ると、種類がIntelに変わってて少し満足。パフォーマンスが上がってるのかどうかは分かりません。

MySQLの文字列結合(concat)

タグ: MySQL
UPDATE table SET moji=concat('tako',moji) WHERE id=1;
とか。

lowerとかupperとかtrimもあるのか。
http://homepage2.nifty.com/sak/w_sak...

・・・
ぎゃー、大雨だ。帰れん。

大きなデータベースの移動

タグ: MySQL
逆ジオコーディングのデータベースは、300万件を超えるレコードを持っている。こいつを移動するのは、なかなか時間がかかる。いつもは、phpMyAdminでエクスポートしたファイルをインポート(「ウェブサーバ上のアップロードディレクトリ」から)。

で、昨日、BK1で立ち読みしたMySQLの本でLOAD DATAの方がINSERTより速いようなことが書いてあったので試してみた。

TerminalでMySQLを操作したことなんてなかったので、そいつも実験。
sudo /usr/local/mysql/bin/mysql -p db名
でパスワードを入れると mysql> に変わる。でクエリーを書いていけばいいみたい。

で、まず元のデータベースからファイルをつくる。
SELECT * INTO OUTFILE '/xxx/xxx/file.txt' FROM table名;
file.txtのディレクトリはパーミッションを777にでもしておく。
これはすぐ終了。

で、ロードする。
LOAD DATA INFILE '/xxx/xxx/file.txt' INTO TABLE table名;

途中でターミナルを閉じちゃったので時間はわからなかったけれど2時間ぐらいで無事終了。

これぐらい時間がかかるなら、phpMyAdminのconfigでタイムアウトの時間を長くしとけば、同じぐらいで終わりそうだ。タイムアウト時間がデフォルトでは300秒なので、100回ぐらい繰り返さないと終わらない。

ちょっと記憶に残ってるのが、ずいぶん前にこの300MBぐらいのデータをローカルでインポートして、わりとあっという間に終わらなかったっけということ。なんとなくインデックスがない状態にしとけば、速いのかもしれないとも思うけれど、検証はめんどくさいので保留。インポートがあっと言う間に終わってもインデックス作成で2時間かかるのかもしれないし・・・。

RAND()

タグ: MySQL
ポストマップトップの写真シャッフルがとても鈍い。
MySQLで「ORDER BY RAND() LIMIT 8」として、8枚を取得していたのだけれど、母数が13000枚ぐらいになって、ORDER BY RAND()では厳しい様子。1.8秒ぐらいかかかる。

で、方式を変えてみた。

ひとつ考えたのは、データベースに乱数フィールドを作って、それをcronで更新し、それをソートするみたいなやり方。
UPDATE table SET field = RAND()*10000;
で、乱数は更新。
なんとなく、乱数でのソートが少しネックになる感じ(0.7秒ぐらい)だったのでこれはやめた。

で、こうした。
1) 対象データベース数を取得
2) PHPでその範囲内(マイナス8)のスタート数字を決める。
3) そこからフィールドを100個取得して配列へ。
4) PHPで配列をシャッフルして、最初の8つを表示。

8枚は並びの100個(300個にしてもたいして変わらない)という範囲内からのランダムになるけれども、まあ良いかな。

それより、昨日の夜はサーバーが非常に重かった。急激にアクセスが増えた様子もなく原因はよく分からないのだけれど、やっぱりMySQL絡みのように思えたので、phpMyAdminでMySQLのランタイム情報というのを見ながら、my.cnfを少しチューニング。
tmp_table_size
というのを追加してみたり。

根本的にクエリを減らす方向で作り直さなきゃだめなのかもしれないな。直ぐに何万クエリが発生するというのは過多な気がする。

mysql_affected_rows()

タグ: MySQL | PHP
SQLの、DELETEとかUPDATEで削除(変更)した行数を取得できる関数あるといいなと以前から思っていたのですが、検索したら出てきました。
http://www.phppro.jp/qa/362?sort=des...

マニュアル
http://www.php.net/manual/ja/functio...

僕は検索が苦手なので、1000人ぐらいの小人のブレインが机の上で遊んでいてくれると嬉しいなあ。「ねえねえ、あれってなんだっけ」ってひとりごちるだけで、そこから質問を推察してズバッと回答を与えてくれるような。

それって、もしかしたら蚊なのかもしれないな。つぶしてる場合じゃないのかも。

BLOB型

タグ: ids | MySQL
移行したサーバーで、idsのデータが表示されない。
PHP5だからか? MySQL5だからか?

調べた。
http://questionbox.msn.co.jp/qa25673...

ん?BLOB型?

AES_ENCRYPT('文字列','secret_key')
AES_DECRYPT(field名,'secret_key')

暗号化されたデータはバイナリ(なにそれ?)なので、MySQLのフィールド形式をBLOB型にする必要があるらしい。
で、おそらく解決。

なんで、あっちではvarchar(255)で問題がなかったかについては追求しない。

LEFT JOINを使え

タグ: MySQL
なんとなくJOINという節があることは気がついていたが、まだ使ったことがない。で、そろそろ使おうと思って調べると、WHEREよりLEFT JOINの方が早いと書いてあるページがちらほら。

それは使わねば。
その前に理解せねば。

http://slashdot.jp/~Oliver/journal/2...
http://ma-bank.com/item/650
http://homepage2.nifty.com/sak/w_sak...
← | 1 | 2 |