トップページ⇒php
949コメント332KB

PHP + MySQL

■ このスレッドは過去ログ倉庫に格納されています
0001ECY NGNG
そろそろPHP + MySQLについても語ってほしい脳
0002echo NGNG
ソレハドウカナ?
0003初期不良 NGNG
my もほとんど扱い方としては pg と変わらないの?
両方インストール済んでこれから試そうってところなんだけど。
0004初期不良 NGNG
あ、Postgre の方はそこら辺に公開されてた掲示板 PHP スクリプトで
試してみたんですけど、重くて掲示板には向いてないと思ったので...
0005名無しさん@お腹いっぱい。 NGNG
myとかpgとか中途半端な略はやめようよ。
厨房くさくてかなわん。
0006名無しさん@お腹いっぱい。 NGNG
イヤ、わかりやすくていいよ。うん。
0007union使えないの? NGNG
とりあえず打倒pg??
0008名無しさん NGNG
打倒とか言うと荒れますよ。

女の子と話していて、他の女の話をすると異常に機嫌が悪くなることがある。
「なんで他の女の話を持ち出すの?」とかって。
それと同じ感じで、PostgreSQL の話をしている時に、Oracle などとの比較を
持ち出されると過剰反応する女々しい人が多いので気をつけましょう。
0009名無しさん@お腹いっぱい。 NGNG
>>8
DBの話をしているのに、なんで女の話を持ち出すの?
00108 NGNG
>>9
荒れるともったいないので。
と思ったけど、よけい荒れちゃいそうだね。ごめんね。
さぁ、続けて下さい。
0011名無しさん@お腹いっぱい。 NGNG
陰部陰部陰部陰部陰部陰部陰部陰部陰部陰部陰部陰部陰部
陰部陰部陰部陰部陰部陰部●部陰部陰部陰部陰部陰部陰部
陰部陰部陰部陰部陰部陰部●部陰部陰部陰部陰部陰部陰部
陰部陰●陰部陰部陰部陰部●部陰部陰部陰部陰●陰部陰部
陰部陰部●部陰部陰●●●●●●●陰部陰部●部陰部陰部
陰部陰部陰●陰●●部陰部●部陰部●●陰●陰部陰部陰部
陰部陰部陰部●部陰部陰部●部陰部陰●陰部陰部陰部陰部
陰部陰部陰●陰部陰部陰部●部陰部陰部●部陰部陰部陰部
陰部陰部陰●陰部陰部●●●●●部陰部陰●陰部陰部陰部
陰部陰部●部陰部陰●陰部●部陰●陰部陰部●部陰部陰部
陰部陰部●部陰部●部陰部●部陰部●部陰部●部陰部陰部
陰部陰部●部陰●陰部陰部●部陰部陰●陰部●部陰部陰部
陰部陰●陰部陰●陰部陰部●部陰部陰●陰部陰●●●陰部
陰●●●陰部陰●陰部陰部●部陰部陰●陰部陰●陰部陰部
陰部陰部●部陰●陰部陰部●部陰部陰●部陰●部陰部陰部
陰部陰部●部陰部●部陰部●部陰部●陰部陰●部陰部陰部
陰部陰部●部陰部陰●陰部●部陰●部陰部陰●部陰部陰部
陰部陰部陰●陰部陰部●●●●●陰部陰部●陰部陰部陰部
陰部陰部陰●陰部陰部陰部●部陰部陰部陰●陰部陰部陰部
陰部陰部陰部●部陰部陰部●部陰部陰部●部陰部陰部陰部
陰部陰部陰●陰●●部陰部●部陰部●●陰●陰部陰部陰部
陰部陰部●部陰部陰●●●●●●●陰部陰部●部陰部陰部
陰部陰●陰部陰部陰部陰部●部陰部陰部陰部陰●陰部陰部
陰部陰部陰部陰部陰部陰部●部陰部陰部陰部陰部陰部陰部
陰部陰部陰部陰部陰部陰部●部陰部陰部陰部陰部陰部陰部
陰部陰部陰部陰部陰部陰部陰部陰部陰部陰部陰部陰部陰部

0012名無しさん@お腹いっぱい。 NGNG
日本MySQLユーザ会
http://www.mysql.gr.jp/
0013名無しさん@お蝮いっぱい。 NGNG
MySQLユーザ会が何ヶ月か前に出した本をすごく期待して
買ったけど、なんかいまひとつでした。
「詳しくはマニュアル参照しろ」ばかりなんだもん。
だから今はマニュアル見てます。
0014名無しさん NGNG
最近買った本に「MySQLはデータを更新するユーザーが少ないところで
多くのデータを検索したい時にはベストの選択だが、多くのユーザーが
一度に登録を行うような場合は、他のRDBMSが向いてる」とありました。
2chのような掲示板をMySQLで作るのは向いてないのでしょうか?
0015名無しさん@お腹いっぱい。 NGNG
>>13
初心者むけだから...
>>14
ロックが弱いから...だがな、プログラマーの力量がそこで大きく試されるぞ。
0016名無しさん NGNG
例えばどういう点ですか?<力量
0017名無しさん@お腹いっぱい。 NGNG
工夫すればいいだけってこと。
あとは考えて。
0018名無しさん@お腹いっぱい。 NGNG
MySQLを./configureするときに、
変数のサイズをチェックするところでこけるんだけど、
対処法知らない?

ちなみに、同じ現象がIRIXとFreeBSDで発生した。
0019初期不良 NGNG
何でマンモス本にも日本語マニュアルとか
http://www.asakawa.ne.jp/doc/php/ja/sjis/ref.mysql.html
にも mysql_dbname() が載ってないの?
無いわけないだろうと思って検索かけてみて見つけたけど...
mysql_db_name() だったりして、まあどっちでも動くわけだけど
この辺ってどうなってるの?
0020電動ナナシ NGNG
PHP サイトがリニューアルしたね。ずいぶんすっきりした。

>>19
本家のページに出てないから仕方が無いんじゃない?
http://www.php.net/manual/en/ref.mysql.php
0021名無しさん@お腹いっぱい。 NGNG
>>16
わかりやすい一例ね。普通はさ
1.ロック
2.更新
3.アンロック
とやるわけでしょ。MySQLの場合は、このロックしてから放すまでの時間を最
小限に抑えないとダメ。あと、極力ロックしない努力も必要。
とりあえずロックしておけって方針だと、簡単に使い物にならなくなるよ
MySQLにはlast_insert_idとかreplaceとか、あるいはget_lockとかロック
しないための機能がいっぱいあるので、考えよう
002216 NGNG
PHP+MySQLを始めて間もないためよくわかりませんが
これまで明示的?なロックは使ったことがないです。
持ってる本には書いてなかったし。
last_insert_id、replace、get_lock を調べてみます。
002321 NGNG
>>16 >>22
おーい。だめじゃーん
MySQLはフツーのデータベースと違って明示的にロックしないと何もロックして
くれないよー

俺がさっき書いたget_lockとかは中級以上の知識だけれど、基本はちゃんと抑え
ないとダメ
基本はあくまで、更新されちゃ困るレコードはロックすることだよ。
MySQLの実際のロックはlock tablesで行うので、こいつを勉強しよう。
get_lockとは名前は似てても全然違うので注意。

それで、ロック中の処理をできるだけ短くするように心がけよう。よほど
アクセスの多い場合でなければ、これで対応できるはず。
002416 NGNG
ありがとうございます。
これまで、insert や update などがそれほどないものしか作った
ことがなかったので、偶然うまくいってただけだったようですね。
このままいってたら今後やばかったです。
勉強になりました。
0025名無しさん@お腹いっぱい。 NGNG
>>23
>俺がさっき書いたget_lockとかは中級以上の知識だけれど、基本はちゃんと抑え
>ないとダメ

別に煽るわけではないが、
ロックの知識なんて、基礎中の基礎だと思うが...
0026初期不良 NGNG
lock tables だとタイムアウト無しで延々と待つらしいけど
これが問題なのか?俺も MySQL 使い始めなり
0027初期不良 NGNG
って書いちゃったけどとりあえずこれ読みます
http://www.softagency.co.jp/mysql/Manual/html/manual.ja_Performance.html#Table_locking
002816 NGNG
>ロックの知識なんて、基礎中の基礎だと思うが...

本に載ってたサンプルとかしか見てなかったわけです。
で、ロックなんて書いてなかったので、MySQLがロックしてくれるんだ
と勝手に思ってました。
とりあえず、lock tables xxx write;と
unlock tables;入れて確認してます。
間にsleep()してテストしてますが、いいんですよね。
私もマニュアルちゃんと読もうかと思います。
ためになる煽りは歓迎です。よろしゅう。
002921 NGNG
>>25
そうなんだけれど、それを知らずに作っちまう奴もいる。俺が前に
あるサイトの運用を引き継いだときに、まるでロックのこと意識し
てないつくりになってて、データの不整合がおきまくりで、空いた
口が塞がらなかった。

>>26
問題としては、テーブルごとロックしか出来ないっていうのが第一
の問題。一人のユーザしか更新できないでしょ。
第二の問題がタイムアウトできないことだね。
mysql_pconnect()で接続して、ロックしている間に落ちるよう
なプログラムを書くとロックしっぱなし・・・これはPHP3の話だ
けどね。PHP4は使ってないのでわかんない
0030電動ナナシ NGNG
>>29
ロックがタイムアウトしないのか・・・そりゃひどいねえ。

マニュアル読むと、
・接続が閉じられるか、当該プロセスが Lock を発行しない限り Lock は有効
・他のプロセスの Lock 要求はタイムアウトなしで待たされる
みたいだね。ううむ。

プログラムが落ちて httpd も一緒に落ちていれば問題ないけど、そうじゃない
場合(エラーによる異常終了)とかは問題だよねえ。

当面の回避策としては、
・pConnect は使わない
・適当な(アプリケーションから使わない)テーブルをいくつか用意して、
 スクリプトの先頭で lock/unlock する(そうすれば直前のロックが解除される)
 # httpd のプロセス数だけテーブルを用意して、互いに lock するテーブルが
  重ならないようにランダムに割り当てる
という感じになるのかな。
0031名無しさん@お腹いっぱい。 NGNG
get_lock()はタイムアウトを設定できるよ
ただ、こいつは別にデータそのものをロックするわけじゃないという曲者
「こういうデータを更新するときには、こういう文字列でget_lock()を
かける」とかって、明確なルールを作る。
頻繁にかかる更新はget_lock()で、そうでない更新はlock tablesでなん
ていうのも面白いと思う
0032名無しさん NGNG
いまいちイメージが湧かないのですが、頻繁に更新するようなものって
例えばどのようなものがありますか?
サイトの例などあります?
0033名無しさん@お腹いっぱい。 NGNG
lock を使わなければいいのですよ。
これの本当の意味がわかる奴は少数だと思うけども、
わからない奴は1週間くらいじっくり考えてみな。
それでもわからない奴は、オラクル使った方がいいよ。金かかるけど。
0034名無しさん@お腹いっぱい。 NGNG
ヒントおくれ。
0035名無しさん@お腹いっぱい。 NGNG
ヒント1:ロックすると遅い
0036名無しさんX NGNG
約2日かかってlockの意味がわかった。
これでぼくも中級?
0037名無しさん@お腹いっぱい。 NGNG
>>32
Webに限った話をすると、頻繁にupdateと言うのは少ないかもね
例えば、会員サイトでの会員情報の更新とかはどう?
規模が大きければ、かなりの頻度だと思うが・・・

>>34
マニュアルにヒントっぽいことが書いてあったと思った
0038名無しさん@お腹いっぱい。 NGNG
PostgreSQLの方はロック処理いらないの?
0039電動ナナシ NGNG
>>37
これのこと?
http://www.mysql.gr.jp/jpdoc/3.23/manual.ja_Compatibility.html#Commit-rollback

今の MySQL には Transaction 機能あるから、ロックにこだわる必要性はあんまり
ないと思うんだけど、Transaction に何か問題があるの?

>>38
Transaction 機能 (begin/commit/rollback) 使えばよい。
0040名無しさん@お腹いっぱい。 NGNG
>>39
MySQLてトランザクションを有効にするとパフォーマンスが落ちるって
小耳に挟んだけど、どうなんだろ。
0041名無しさん@お腹いっぱい。 NGNG
自分はトランザクションを利用しないケースを逆に知らないので、
トランザクションなしで作れって言われたら怖いなぁ。
あと、トランザクションがあってもロック関係の知識はいるでしょ。
DBMSによってまちまちだと思うけど。
0042名無しさん@お腹いっぱい。 NGNG
トランザクション使う初心者はオラクル使え
0043名無しさん@お腹いっぱい。 NGNG
なんで、トランザクション使うのは初心者なのか意味不明
0044anonymous NGNG
春休み厨房の煽りだろ、どうせ。
0045名無しさん@お腹いっぱい。 NGNG
>>40
というか、もともと参照が中心だからテーブルロックしか
ないんじゃなかった?PostgreSQLは標準で行レベルロック
だから、頻繁に参照がある仕組みとかだと、意外と快適。
MySQLも最近トランザクションが取り入れられたみたいだけど、
やっぱり実績が無いのが不安だよね。
0046名無しさん@お腹いっぱい。 NGNG
MySQLのトランザクションって、参照の一貫性の機能はあるの?
Begin Tran した時点のデータのみを参照してくれるって機能。
参照の一貫性というのかどうかは知らないのだが。。。
0047電動ナナシ NGNG
MySQL の実装は分からないけど、用語についてだけ。

DirtyRead (Commit 前のデータが見えてしまう) や、Read Commited
(Commit 後のデータは見えるが、それ以前のは見えない) や、Serializable
(繰り返し Query をかけて同じ結果が得られる) といったやつだよね。
隔離度 (Degree of Isolation) というみたい。
『データベースチューニング 256 の鉄則・下巻』(日経 BP) p.335
 http://bpstore.nikkeibp.co.jp/item/main/148222805860.html
『トランザクション処理システム入門』(日経 BP)
 http://bpstore.nikkeibp.co.jp/item/main/148222802680.html
が参考になると思う。
0048電動ナナシ NGNG
>>45
MySQL の機能ってよりも、MySQL が依存している SleepyCat's Berkeley DB の
機能だよね。BerkeleyDB に Transaction 機能が入ったら MySQL で Transaction の
サポートが可能になったという表現のほうが正しいんじゃない?
http://www.sleepycat.com/docs/ref/txn/intro.html

以前 Zend か MySQL のサイトで MySQL のエンジンに Zend Engine 組み込んで
トランザクションとストアドプロシージャをサポートするってコメントを見たけど、
あれはどうなったんだろう。
0049名無しさん@お腹いっぱい。 NGNG
>>48
細かい話だけれど、MySQLがBerkley DBを使うようになったのは
トランザクションを実装したかったからじゃないんだっけ?
もとからBerkley DBを使ってたわけじゃないよね?
0050名無しさん@お腹いっぱい。 NGNG
>>40 >>45
ええと、トランザクションを使うためにはテーブル作成のときにはBDBという形式
を選択しないといけないんだけれど、このテーブル形式っていろいろとダメなとこ
ろも多いみたい。
MyISAM(デフォルトテーブル形式)よりは遅いですとマニュアルにはっきり書いて
あるし、痛いのがvarcharとかTEXTなどのカラムにインデックスを作れないことかな?
ちなみにMyISAMでvarcharのカラムにインデックス作って検索するとめちゃめちゃ速
いよ

個人的にはMySQLを使うのならBDBを使うのはあんまり賢くないように思う。
トランザクションが欲しいのならOracleなりSybaseなりがいいのでは?
0051名無しさん@お腹いっぱい。 NGNG
http://www.mysql.com/information/crash-me.php
の結果の最後のほうの
max table row length (without blobs)
table row length with nulls (without blobs)
ってなんでしょう?
0052電動ナナシ NGNG
>>51
max table row length ってのは、テーブルの各行(列数は任意)でサポート可能な
バイト長ってこと。例えば PostgreSQL 7.0 だと max table row length は
7949 ってなってるけど、これは例えば
CREATE TABLE hoge (aText VARCHAR(7950));
CREATE TABLE hoge (aText VARCHAR(4000), aText2 VARCHAR(3950));
というテーブルを定義して使えないということ。前者は一つのフィールドだけで
7949 バイト超えているし、後者は 2 つのフィールドを合計すると 7949 バイトを
超える。
CREATE TABLE hoge (aText TEXT);
ってのは作れるけど、いざ 7950 バイト以上のレコードを挿入しようとすると
エラーになる。

table row length with nulls ってのはよく分からん。
blob っては Binary Large Object のこと。画像とかファイルとかそういった
大きなものを想像して欲しい。通常 blob はレコード長の制限が大幅に緩和
されている。
0053名無しさん@お腹いっぱい。 NGNG
null 付きだろ、単に。
0054電動ナナシ NGNG
CREATE TABLE (hoge TEXT NOT NULL);
と
CREATE TABLE (hoge TEXT);
でレコード長が変わる実装ってことなの?

それともそういう意味じゃないのかな?
分からない。鬱だし脳。かぜで朦朧とする・・・。
005546 NGNG
>>47

そうそう。
電動ナナシさん、貴重な情報ありがとう。
■ このスレッドは過去ログ倉庫に格納されています