【この先一体】MySQL 総合 Part15【どうなるの】
パート16じゃぼけえ! mysqlの歴史は15で終わりじゃ・・・。
4 :
NAME IS NULL :2009/04/21(火) 16:04:44 ID:TwIH4wEs
>>1 乙
mySQLがOracleになっちゃった。泣
★ネガティブな考え方
もうmySQLはOracleの体験版とか実験版みたいな位置づけなのか。
しかもそのうち有料になるかも。
★ポジティブな考え方
これでアホ企業のOracle絶対主義のバカ共もmySQLを見直すかも。
これで完全にポストグレは終わった
逆だろ。 これでMysqlは終わった。 もっとも今の性能で良いのなら良いんだろうけど RDBはBDBM系程枯れていないからな。 開発リソースをじょじょに減らしていかれて、 終には挽回不能な差を付けるようにコントロールするのがOracleの戦術になるだろ。
オラクルのサン買収後の戦略を発表 ほとんどのフリー製品を有料化。 2009/04/21 サンを買収したオラクルは、買収後のサンのソフトウェア製品についての基本戦略を発表した。 これはSun が持つソフトウェア製品をオラクルデータベース製品体系に 組み込み、相乗効果による収益の拡大を狙うというものだ。 Java, Solaris はそれぞれ、OracleScript、OracleOS と名称を変更し、 今後オラクルデータベースに最適化、統合化されていく。 OpenSolaris は OracleOSLite として有料化する。 MySQL に関しては、OracleLite として有料化し、今後は、Oracle との下位互換性のための 更新のみを一年程度続けた後、開発を収束させる。 OracleLite 購入ユーザには、Oralce へのアップグレードを用意する。 これら有料化する製品に関しては、2009年7月までの猶予期間が設けられる。 現在のユーザは使用の停止か、製品版の購入のどちらかを選択することになる。 フリー版の使用は、商用私用を問わず、禁止されることになる。 「これらの戦略により、サンの収益体質を改善し、オラクルの製品体系を強化する。 システムソフトウェアやデーターベースの無償提供は、ビジネスとして成立しないことが サンの失敗により証明された。しかしながら、サンの持つこれらの製品群は、 ユーザにとって非常に有用なものであり多くの支持を集めている。 我々は健全な販売戦略によってこれらの製品を市場に提供しつづけることにより、 市場のニーズにより完全に応えていけるものと信じている。」 とオラクルのスポークスマンは昨晩夢をみた。
8 :
NAME IS NULL :2009/04/21(火) 17:39:23 ID:4/3o227t
前スレ
>>971 >なんだかマシンが重くなるし
起動時は重いけどね(mallocとemの起動。特に後者)
#emは起動後手動でもいいんじゃない?
>GUIはよくわからんし
emだったら、前提知識無いと使えないと思う
admin以外は、SQLDeveloper でいいんじゃない?
9 :
NAME IS NULL :2009/04/21(火) 17:41:38 ID:4/3o227t
項目が多いから、試行錯誤だと 大変かなという意味で・・・
つーことはMYSQLが有料化されたら MMORPGとか無料で提供していくのはきついのですね
ポスグレベンダーが儲かる
12 :
NAME IS NULL :2009/04/21(火) 23:25:03 ID:508JdpKb
さあ、Oracle Liteであなたもデータベースをはじめましょう! みたいな
当たり前だが、MySQLはOracle有利な開発になるだろーね それもMySQL自体は今のシェアを維持する形のね 生かさず殺さずって言った感じ?
MySQLとJavaが無料? ネット系企業は改修の嵐ですかね? >7 みたいな未来がくる??
MySQLとJavaはオープンソースだし、DrizzleやIcedTeaあるし、全然平気。
なんかどさくに紛れて(?)version5.4なるのが出てる(betaだけど)。
実際MySQLが使えなくなってPostgresに移行するとして、運用などで 困る事って具体的にどんな事があるのでしょうか? (SQLの互換性に関してはとりあえず無視で。元々標準SQLからほど遠い ところで好き勝手やっていたのはMySQLの方ですし)
この合併でデータベースの完全独占状態になるわけだけど独禁法は適用されないんですか?
19 :
NAME IS NULL :2009/04/22(水) 06:01:19 ID:wKTBWyJq
MSのWindows支配にくらべればまだまし。
20 :
NAME IS NULL :2009/04/22(水) 07:22:18 ID:bDgJ3bNf
AdobeのCS支配にくらべればまだまし
>>17 MyISAMべったりなアプリは移植に苦労するかも。
あとはMySQLのレプリケーションと同じことを他の製品でやろうとすると結構大変。
>>21 MySQLのPostgreSQLに対する大きなアドバンテージはレプリケーションだけ
だからねぇ。
PostgreSQLにもpgpool等いろいろな実装は出てきてはいるけど、決定版がない。
しっかし、今回の件で、海外ではMySQLからの代替がないという感じで混乱して
いるのを見て、PostgreSQLやFirebirdの扱いの軽さには驚いた。
24 :
NAME IS NULL :2009/04/22(水) 14:26:28 ID:1zCLPW15
>>23 過去、いろんなところで書かれていた
・海外では Oracle VS. MySQL であること
・Postgres は日本以外では、あまり使われていない
を実感って感じでしょうか?
レプリケーションも大きいんだろうけど
myisam で相度を稼ぐことができないこと
MySQLの手抜きなSQLのコンバージョンの工数がでかそうなこと
MySQLのみ対象としたプロダクトが多いこと(それ以外しらねーよ みたいな)
も影響があるのかな と
正直、MyISAMで済むのならSQLiteでもつかっていろって感じもするけど、 SQLiteのようなライブラリによるファイル操作ではなく、マネージメント システムが動いてそこで排他処理をしてくれるというのが重要なんだろうなぁ。 とはいえ、LDAPやらなんやらのバックエンドにMySQLってわけがわからんし、 他のアプリでもとりあえずMySQL使っとけというのが多すぎ。 これを機に、なんでもかんでもMySQLという流れが変わってほしいもんだ。
何でもバークレイDB
>>23-24 なんで海外でPostgreSQLがあまり使われてないのかが分からないな−。
ほとんどの用途なら、MySQLでもPostgreSQLでも機能も性能も大差ないっしょ。
ただ単にPostgreSQLという選択肢があると言うことが
広く知られてないだけなんじゃないだろうか。
PostgreSQLのメイン開発者って確かカナダと日本だから、
欧米でアピールする機会が極端に少なかったのかもしれない。
>>29 大昔のPostgreSQLの性能の低さも影響しているのも知れない。
そして、ある程度差がつくとサポートベンダの有無が効いてきて、
海外での圧倒的な差になったんじゃないかな。
日本ではSRAがあったけど、海外でPostgreSQLの商用サポート
受けようと思ったら…
MySQLってソースフォージで開発されてる? その場合、デュアルライセンスはどう処理されてるの? ソースフォージってデュアルライセンスって選べるの?
postgreって実はシェアかなり少なかったんだね
firebirdってMySQLの代わりになりません?
35 :
NAME IS NULL :2009/04/23(木) 17:44:21 ID:cXNPfnaF
>>33 Windowsネイティブ版が遅かったというのもあるかもしれない
cygwin環境でのインストールの記事はあるにはあったけどね
>>34 @ITのDBセクション見てみれば?
小規模な組み込み用途が多いような印象を受けてる
innodbの代替のfalconの開発者はFirebirdの中核っぽい人じゃなかったっけ?
ポストグレは完全に散ったな
>>36 > ポストグレは完全に散ったな
何故そういう結論になるのかしりたい
38 :
NAME IS NULL :2009/04/23(木) 21:33:24 ID:nqF0XbwY
>>37 禿同。
案件に合うか、合わないかじゃねーの
ポスグレ厨が居る限り存続しうる!安泰じゃ!
PostgreSQLは8が出るのが遅すぎた。 不人気の理由は他にないような。
MySQLのような尖った特長がなかった。
MySQLの尖ったところってどこだろう。
36みたいなショックで発狂しちゃった人を触るなよ
44 :
34 :2009/04/24(金) 11:02:51 ID:???
>>35 なんか微妙すね。当面はMySQL使ってDrizzleが使えるようになったら乗り換えるかな。
45 :
NAME IS NULL :2009/04/24(金) 12:40:50 ID:N4I7I0BX
儚くもポストグレが完全に散った。 もう今から始める奴はポストグレを選ばない。 MYSQLがOracleになったからIT系専門学校ではMYSQLを教え、 書店にはMYSQL関連の参考書がさらに並ぶ。 そういう利用者がネットでMYSQLを語り それを見た奴がMYSQLでデータベースを始める。 MYSQLとOracleに共通性が出れば就職にも有利。 完全にポストグレは蚊帳の外。 終わった。象は絶滅だ。
46 :
NAME IS NULL :2009/04/24(金) 13:49:39 ID:JUI0rWl8
>>45 多分DB触ったことがない奴が言ってもねーーーー
#触ったことがあるなら、そういう発言にはなりえないよ
#触っていってるなら、仕事やめたほうがいいよ
33=36=45はキチガイ荒らしでおそらく同一人物放置推奨。 そもそも、postgreとかポストグレとか言っている時点で…
両方使ってたし、二者択一ってわけでもないからなにがどうでもいいと思うがなー。 だがSQLserver貴様は別だ。オープン系メインでやってたら貴様の出る幕はないけんの。
>>46 激同
ただMySQLのシェアが更に広がるのは間違いない
>>49 そうかなぁ。日本国内ではPostgresが徐々に増えそうな気がする。
個人的には、MySQLはちょっと方言がきつくて、気に入らない。
海外ではMySQL以外では何が人気なんだろうね、Firebird?
今のうちにmysqlダウンロードしておいた方がいい? いきなり有料になったりするんじゃね
mysqlのデータフォルダを丸ごと定期的に別のドライブにコピーしてバックアップしてます。 これを他のPCに移した場合、ちゃんと機能する場合とmysqlがエラーになり立ち上がらない場合があるのですが これは本来よくない方法なのでしょうか? たまたま自分の別のPCでも読み込めるだけで 本来は動かなくて当然で推奨されないことなのでしょうか。 dumpより楽なのでこの様なコピーをしているのですが。
お前は何を言ってるんだ
MySQLが飼い殺されるどさくさに紛れてperconaが主流になったりして。
>>52 Linux 上で使っているなら lvm mysql スナップショット
あたりでググれ。
Windows の場合は VSS Writer がないので VSS 対応のバックアップ
ソフトでバックアップを開始する直前直後にLinux の場合と同じことをす
れば出来るかもね。 まあ面倒なので素直に dump だな。
57 :
NAME IS NULL :2009/04/25(土) 21:43:44 ID:zIrsT6ri
文字だけしか入っていないレコードから ランダムに一つ取り出すにはどうすればいい? やっぱり数字用のカラムを作るべき?
order by rand() limit 0, 1
国際情勢に例えると Oracle = アメリカ MYSQL = 日本 ポストグレ = 北朝鮮 OracleとMYSQLの同盟により ポストグレは完全に終わった
60 :
NAME IS NULL :2009/04/26(日) 00:39:50 ID:FjN1BGTg
>>59 なるほど。イエローモンキーと馬鹿にされているわけだ
Oracleのいいなりになるしかないから、その点では正しいなw
Postgresは危機感をあおってはいないが
昔は攻撃的だったのはMySQL側だったのだが(とMLで書いてた人がいたよ)
>>59 包茎くん乙。
お前にせめて自分が生きる悪臭公害と言われていることに気づけるぐらいの
知能があればよかったのにな。
どっちかというとMySQL飼い殺しor値上げにより PostgreSQLキター じゃないの? すくなくともうちの会社はそう。
63 :
NAME IS NULL :2009/04/26(日) 08:29:57 ID:FjN1BGTg
>>62 買収しようと思っていたコンペジターだから、これまでと同じ
というのはありえん気がする
free系使えるなら、Postgresな人だから、自分にはあまり関係ないが
暇なんでMySQLみたいだけど嫌Oracle民向きのRDBソフトつーのを作ってみるわ。 もちろんGPL2ライセンスな。少しまちなー。
ようするに象はイルカに負けたって事だろ?
ぶっちゃけポスグレの利点が分からないよな?
あつかましいのですが、どなたかツリー構造のサンプル作っていただけませんか? 親IDと子IDをどのように扱えばいいのか・・・ あぁ混乱します
ぐぐれば星の数ほど出てくるだろ
69 :
NAME IS NULL :2009/04/27(月) 00:54:30 ID:+QFX8mPI
BLOBのfieldにバイナリを入れた場合エラーになる原因として ●文字コードの違い ●データ量が大きすぎる 以外で何か考えられますか? いつも決まって特定のファイルが入らないのですが、文字コードは合わせてるしデータ量も少ないのですが。
●エラー文を読む
71 :
NAME IS NULL :2009/04/27(月) 06:31:00 ID:4KD78JzF
72 :
NAME IS NULL :2009/04/27(月) 07:50:04 ID:9YyqFg03
>>67 MySQLでWith〜 が使えるか探してみたら?
#ぱっとみ、なさなそうな感じだけど>マニュアル確認してくれいw
VBでリカーシブなコード書いて出したことはあるけど遅い(SQLのみに比べて)
ADO.NET使えるなら、DATAtableにつっこんで、リカーシブで探せば早いかな
#元データでかいと、ある意味嫌だけどw
joinで書いてるのは、階層数決め打ちだから案件によりけりだと思うよ
自分の場合は使えなかった
ライセンス形態はPostgresがいい
74 :
NAME IS NULL :2009/04/27(月) 10:01:04 ID:+QFX8mPI
いつからsunはOracleになるの?今年度中?
InnoDBのレコード累計をカウントするのを速くする改善をOracleスタッフに望む(切実)
そんなタダ働きするわけねーだろ するとしても有料版だけだ
じゃあもうMySQLの進化は止まるってこと?
オラクルのサイトのラインナップ (歴史博物館) に飾られて…
INSERTとDELETEにトリガでも仕掛けたらいいんじゃないの
80 :
NAME IS NULL :2009/04/27(月) 22:47:33 ID:Up4sYX/B
1000万件くらいのレコードの入ってる簡単なデータベースがあって、 メンバID(Int)、メンバデータ1(double)、メンバデータ1(double)、メンバデータ2(double)、メンバデータ3(double) というスキーマになってます。メンバIDをキーにして、 SELECT * FROM *** WHERE メンバID=12345; みたいな処理をよくやるんですが、INDEXを作っても作らなくても所要時間が差がありません。 (2〜3秒くらい) ここからもっと処理を速めようとすると、どうすればよいですか?
81 :
NAME IS NULL :2009/04/27(月) 23:02:50 ID:9YyqFg03
indexがきくのは、対象が5%位っていわれてなかったっけ? 1件だけだと、テーブルスキャンになってるんじゃないかなと・・・ #実行計画見てみたら mysql explain ぐぐれば見つかる
>>80 IDっていうくらいだから当然ユニークだよね?
あと、NOT NULL ならすこーし速くなる
あとはexplainの結果次第かな
83 :
NAME IS NULL :2009/04/28(火) 00:23:48 ID:aHnBfSXl
>>81-82 ありがとうです。
Index張ってExplainしてみました。
mysql> select * from shain_master where Code=8324;
<データ出力。省略>
2281 rows in set (2.65 sec)
mysql> explain select * from shain_master where Code=8324;
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
| 1 | SIMPLE | shain_master | ALL | NULL | NULL | NULL | NULL | 8222579 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> create index Code_Index on shain_master (Code);
Query OK, 8222579 rows affected (3 min 1.96 sec)
Records: 8222579 Duplicates: 0 Warnings: 0
mysql> explain select * from shain_master where Code=8324;
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
| 1 | SIMPLE | shain_master | ALL | Code_Index | NULL | NULL | NULL | 8222579 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> select * from shain_master where Code=8324;
<データ出力。省略>
2281 rows in set (2.47 sec)
結局2.65秒から2.47秒になったのですが、(7%ほど速くなった)
これ以上はできないと思いますか?
Code(メンバIDのことです)はユニークです(プライマリキーになってます)
NOT NULLについては、プライマリキーになってるなら、NOT NULLですよね?
アドバイス等もらえたら有難いです。
よろしくお願いします。
84 :
NAME IS NULL :2009/04/28(火) 01:09:06 ID:aHnBfSXl
すいません、Codeはユニークではありませんでした。 Codeとあと2つの数字をあわせて、ようやくプライマリーキーでした。 (なので、プライマリーキーは3個) 複合キーで試してみます。 失礼しました。
85 :
NAME IS NULL :2009/04/28(火) 01:47:12 ID:aHnBfSXl
3個の複合キーを張っても、単純な先のSelectはほとんど時間同じだったです。 ただ、サブクエリを含むSQLは速くなった。 3分まっても帰ってこなかったSQLが、1分以内で帰ってきたよ。 DBはデータのメンテが楽だから使ってるんだけど、SQLをどう書き換えたら性能が どうかわるのか分かりにくい。
>>83 は何も改善されてないね。
analyze table shain_master;
をしてもう一度試してみて。
それでだめなら以下のようにINDEXを強制。
select * from shain_master force index (Code_Index);
あと
>>85 のEXPLAIN結果と、
show create table shain_master\G
をみせてほしい
87 :
NAME IS NULL :2009/04/28(火) 21:17:53 ID:v5jCnHuN
ロックしてdumpしてる時はDBの更新ってできるのですか? サーバーを止めずに50GB位をdumpしたいのですが。
ZFSのsnapshotを使ったら良いんじゃないの
スナップショットだけで実現できるわけないだろw スナップショットは、コピーコマンドの代替に過ぎない。 DB側がきちんとオンラインバックアップの準備をしないと。
90 :
NAME IS NULL :2009/04/28(火) 22:24:41 ID:ZrsNSBAo
>>87 ロックしてるのに、どうして更新できるのかと・・・・
>>89 ファイルのスナップショットがとれても、メモリのスナップショットが取れる
わけではないからねぇ。
VMwareでメモリイメージをファイル化するようになっていて、それがZFSの上で
動いている場合なら話は別だけど。
ちょっとちょっと
アクセスが多いサーバーの場合MySQL一本でいくのと 他のDBソフトも入れてそれぞれで分担してさばくのとどっちが効率いい?
MySQLをたくさんいれればいいんじゃないの
>>89 >スナップショットは、コピーコマンドの代替に過ぎない。
厳密には違うよ。ZFSのスナップショットはアトミックに
データを複製出来るから、ストレージエンジンがデータ
ファイルの一貫性を保って書き込みしていれば問題無い。
これは
>>91 についても同じ。
マイエスキューエルなお兄さん達に質問があります。 MAX ALLOWED packetをPHPのスクリプト上で変更した場合の有効期限っていつまでですか? 大きなバイナリを入れる前にMAX ALLOWED packetをクエリを送り大きくしてるのですが 入れた後に再度小さく戻す必要があるのでしょうか?
>>95 スナップショット?ZFSってそんなこと出来るの
出来るよ。実際には即座にデータが複製される訳ではなく、 COWでそう見せているだけだけど、実用上は同じことです。
99 :
NAME IS NULL :2009/04/29(水) 17:54:05 ID:goBvMPts
すみません、お聞きしたいことがあります。 カタカナひらがなは同一視するけど、濁点と普通の文字は同一視しない照合順序って ありませんか? 現在utf8_general_ciでひらがなとカタカナを同一視させることはできたのですが、 濁点と普通の文字が同一視されて困っています。(「が」=「か」等)
↑少し間違えました。 utf8_general_ci→utf8_unicode_ci
MySQLのインデックスについて質問させてください。 例として「name」「type」という2つのカラムにインデックスを張る場合、 (name, type) のように2つセットでインデックスを張る場合と、 (name) (type) と2つに分けてインデックスを張る場合と、パフォーマンスに差は出てくるのでしょうか。 ちなみに検索は、「name」のみ、または「name」「type」2つセット、の2通りで検索します。 もしパフォーマンスがかわらないのであれば、今後仕様が変わっても「type」のみでも検索ができるので、 後者を選択したほうがよいと思っています。 よろしくお願いします。
>>95 はぁ?
データベースが論理的に一貫性保っていることと、データファイルが一貫性持っていることは別だろが。
そこになんらかの調停役をするものが必要だろ。
それについては、各DBによって仕様がまちまちだから、ZFS側だけで一貫性が保てるなんてことはあり得ない。
>>102 一貫性じゃなくて整合性だったな。クラッシュリカバリ出来る
ストレージエンジンなら
>>95 の通りだよ。例えば InnoDB を
使っているなら ZFS の恩恵をフルに享受出来る。Maria や
Falcon みたいな最近のストレージエンジンでも同じだと思う。
104 :
NAME IS NULL :2009/04/29(水) 21:09:28 ID:720E2UER
マルチカラムインデックスだと、(a,b,c)にインデックス作ったら bとcはインデックスにならないんだよね。
>>101 それぞれのシーンで有効なインデックスは、
「name」のみ・・・(name)または(name, type)
「name」「type」2つセット・・・(name, type)
「type」のみ・・・(type)
全てに対応したいなら、
(name, type)と(type)の2つのインデックスを付与。
Oracle検定があるんだからMySQL検定も作ってほしい
>>106 最近はインデックスマージで、同時に複数のインデックスを使用可能。
110 :
sage :2009/05/01(金) 14:27:19 ID:8dcd/ec9
>>109 インデックスマージ便利ですね。
「name」「type」2つセット・・・(name, type)
「name」「type」2つセット・・・(type) (name)
は速度差はあるんだろうか?
インデックスマージは複合インデックスよりは遅いよ
112 :
110 :2009/05/01(金) 16:10:08 ID:???
>>111 おぉ、ありがとうございます。
じゃあ
「name」のみ・「type」のみ・「name」「type」2つセット
のスピードアップには
(type) (name) (name, type)
の3つインデックス用意するのがいいんですね。
名前にsageしてた Orz
(name, type)があれば (name)はいらないよ
質問させて下さい sqlファイルをsshを使ってphpmyadminへインポートしたいのですが、 どのようにコマンドを書いてあげればいいでしょうか? アドバイスをお願いします
消えろ
116 :
NAME IS NULL :2009/05/02(土) 11:47:30 ID:sAcX2g2P
MYSQLに画像を1000枚位入れてブラウザに一覧表示にして ダウンロードソフトのirvineで一気に1000枚落とそうとしたら MYSQLが不安定になり接続できなくなりました 一応MYSQLは動いていまして再起動させたら元に戻りました。 こういう不具合は設定でなんとかできますか? ちなみにローカルのPC内でのテストです。
117 :
NAME IS NULL :2009/05/02(土) 14:04:33 ID:BrjlIbgF
そのあたりは、チューニング本見ながら調べないといかんのじゃない? #unix系なら、iostat,memstat,netstat とか見ながら、ボトルネック探すんだろうけどね 詳しい説明とかどう対処するかはパフォチュー本以外で説明してるのって中々ない気がする
118 :
NAME IS NULL :2009/05/02(土) 15:10:05 ID:1rG19lPd
超初心者的な質問で恐縮ですが、 MySQLには、Oracleのような表領域とか容量計算とかはあるのでしょうか? あと、主キーを2項目設定しようとすると『ERROR 1068 (42000) Multiple primary key defined』と出るのですが、どうしたらよいのでしょうか?
Oracleと同じ仕組みはない MyISAMなら1テーブル1ファイル InnoDBなら全部まとめて1ファイルか、1テーブル1ファイル 主キーは1個しかないから主キーなんだぞ これはOracleでも同じ
ファイルごとに別パーティションに置いたりすれば、 テーブル領域はかなり自由。
I/Oの最適化まで考えると、「全部まとめて1ファイル」「1テーブル1ファイル」のどっちも難しくなるな。 もっとも、ストレージまで含めると、表領域概念があっても複雑になるけど。
>>114 460 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2009/04/30(木) 00:27:39
mysql [ENT]
で、mysqlのコンソールが実行できることをまず確認
できないならmysqlが入ってない
できるのにそのエラーが出るなら、<以降のファイルの指定
123 :
NAME IS NULL :2009/05/03(日) 18:47:24 ID:IRQUoHF0
もうMySQLは終りだから別のDB勉強したほうがいいよ
max_allowed_packetについて質問です。 今、ローカルの環境で、画像等のバイナリを格納するDBを組もうとしているのですが、 一定以上のサイズ(1MB以上)のデータをINSERTする時に、例によって Got a packet bigger than 'max_allowed_packet' bytes のエラーが出力されて、格納出来ません。 そこで、max_allowed_packetの値を大きくするのですが、ちょっとよく分からない現象に遭遇してます。 まず接続して、show variables like 'max_a%'で読むとデフォルトの1MB、 set (session) max_allowed_packet = 4194304 で4MBにセットして、show variables でちゃんと4MBになっているのを確認し、バイナリのINSERTをかけても、 やはり’Got a packet・・’のエラーが出て、格納できず。(これは、php perlのスクリプト中からやってます。) 次に、接続中に set global max_allow・・・で同様に4MBにセット、show variables では1MBのまま(これは仕様どおり)、 一旦接続断してから再接続で、INSERTをかけるとINSERT成功。その後はGLOBAL設定が効いているので問題なく成功。
125 :
つづきです :2009/05/04(月) 05:41:14 ID:???
その次は、GLOBALが4MBの状態時に、スクリプト中で set session max_allow・・・=1048576(1MB) にセット、 show variablesで1MBを確認後、1MB以上の画像をINSERT実行で、成功してしまいます。 公式のマニュアルには、'globalは次回接続以後、sessionはその時点から、同じ変数に別の値をセットするか接続断まで' と書いてありますが、globalのほうはその通りなんですが、sessionでmax_allowed_packetを変更しても、 その時点で効いてないようです。 今はローカル環境で試していますので、my.cnf(my.ini)での設定や、rootでグローバル権限を持っているので なんとかなるのですが、じつはこれを外部のレンサバで動かすことを考えているので、 my.cnfやグローバル権限がない状態で、この変更は不可能なのでしょうか? ちなみに試した環境は、 WinXpsp3 + 5.0.78 5.0.79 Linux/CentOS + 5.0.79 5.0.80 ファイルサイズ約1.5MBの画像ファイルで、いずれも同様の結果となります。
126 :
追記です :2009/05/04(月) 07:51:55 ID:???
その後、色々ググったりPHPのマニュアル漁ったりしたところ、 mysqli関数でmax_allowed_packet越えのINSERTが出来るようになりました。 しかし、残念ながら稼動予定のレンサバのphpは、mysqli関数が未サポートのようで使用出来ません。 (phpinfoでも出てこないし、実際connectだけ書いたスクリプトもエラーになってしまいます) うーん、なんとかやる方法はないものか・・・。
127 :
NAME IS NULL :2009/05/04(月) 08:27:28 ID:7kTTuHSt
なんで企業はOracleを好むの? 高いのに。社長さんは自分でできないからサポートがあるOracleにしてるのかな? ってゆうかそれバカじゃん。無知。IT無知。 データベースの操作くらい今時チンパンジーでもできるよね。 チンパンジー以下だね。間違いなく包茎。 Oracle利用者は包茎。 短小包茎。 そんなバカ共と、何でも自分で解決する努力家のMYSQLユーザーが同じに扱われたくないよ。
いちど72CPU144コアのUNIXサーバでMySQL動かしてみたらいいよ このへんでまともに動くのはOracleとDB2だけ
129 :
NAME IS NULL :2009/05/04(月) 11:29:01 ID:L8iXHRu1
適材適所でいいんじゃね?
他を否定する奴って、実務経験ない奴なんだろうなぁ・・・
といつも思う
>>128 自分には縁がなさげな規模だw
>>128 PostgreSQLは試した?
8.1 8.2 でかなりマルチCPUへの対応を強化してるはずだけど。
12CPU以上でも性能伸びるってさ。
>そんなバカ共と、何でも自分で解決する努力家のMYSQLユーザーが同じに扱われたくないよ。 ぶっちゃけ、SybaseとかDB2とかHiRDBの方がMySQLより情報が少なくて エンジニアがスゲー努力していると思うけど。
さらにその後色々調べて見ましたが、どうやらmax_allowed_packetを
sessionレベルで変更することは無理なようだと結論付けることにしました。
このあたりを参考にしました。
http://bugs.mysql.com/bug.php?id=22891 http://bugs.mysql.com/bug.php?id=14180 ちなみに、
http://d.hatena.ne.jp/mir/20060201 ここによると、大きなサイズのクエリでも、max_allowed_packet以下のサイズに分割し、
何度も送信を繰り返すような実装があれば可能なようですが、
ここにある C/J や C APIを直接叩くような自前のコード以外には、
今のところphpのmysqli(拡張版のほう)関数以外には見つけられませんでした。
>>126 での通り、その鯖ではmysqli関数が利用できませんし、
perl-DBIのほうにはそれらしいことが出来ない(?)ようなので、
現状、システムのmy.cnfの編集や、root等グローバル(スーパー)権限を持たない
ユーザーしか使えない環境では、サイズ制限を1MBまでにすることにします。
なにか他の方策や、「こうやれば出来る」みたいなことをご存知の方がおられましたら、
是非ともお教え頂きたいと思います。
一括で入れられないなら、テーブル構成変えて分割で入れたら?
134 :
NAME IS NULL :2009/05/05(火) 01:42:40 ID:VyNefM6q
DBの話じゃなくてシステムとして考えた場合、 画像データをDBにつっこむ意味ってあるの? 画像データはファイルのまま適当なディレクトリにつっこんで、 ファイル名と保管ディレクトリだけDBにINSERTしておくのが合理的な気がするが。
135 :
132 :2009/05/05(火) 03:35:33 ID:???
ご意見ありがとうございます。
実は、あまり言いたくはなかったのですが、ある知人からの紹介で依頼を受けることになってしまって、
(正規のWeb作成業者等より)格安で請けることになったものでした。
私自身は、3,4年前からテキストベースの検索エンジン的なサイト等をいくつか運営しているのですが、
実はバイナリ(BLOB)型のデータを扱うのは今回が初めてでした。
その依頼者さんの希望として、
・アップローダ的な機能がほしい
・そのバイナリをDBに格納したい
・その閲覧やダウンの可否を制御したい
・Web領域にはバイナリを直接置きたくない
・依頼者さんが借りているレン鯖上で(しかもいくつかの複数の業者で同様に)動作するようにしたい
のような要望がありまして、とりあえずそのように作成しているところです。
特に閲覧制御については、会員登録やパスワードの設定等もDBの別カラムに格納し、
それをもって制御したいとのことです。あと領域に関しては、Web領域とDB領域が別になってるようなので、
Web領域を食わなくてもいいというような見地もあるようです。
私自身は、もし自前で運営するなら、
>>134 さんのおっしゃるようなシステム構成にすると思います。
前にそのようなことを提案したんですが、どうもDB内に格納することにこだわっているようです。
あと、恐らくはその依頼者さんが、管理の面で、連番になったidとファイル名などの照合などが面倒なのと、
削除する時(Web領域にはFTPで接続するようですが)間違って消したり、上書きされたりすることを
懸念されているのでは、と邪推しております。
>>133 !、確かにその手はありかもしれません。(視界が狭くなってました)
その依頼者さんが、どうしてももっと大きいサイズがほしいと希望するなら、
その方法でやってみます。どうもありがとうございます。
BLOB型をマジで使ったことないけど、たとえばセッションが10000個くらいあって ダウンするファイルが10MBだった場合、100GBくらいメモリ消費するイメージがあるんだけど。
137 :
NAME IS NULL :2009/05/05(火) 12:17:38 ID:VyNefM6q
DBに画像つっこむのは絶対アホだと思うが、 無理にやるならmy.cnfの設定変えればいいんじゃね? SETでちまちまやるより。 まさかmy.cnfも変更できないなんて話はないよな
>>136 現実的に考えて、135が作るようなコンテンツでセッションが
一万いくなんてありえると思ってるの?
100すらありえないだろう。
買収で盛り上がってきたのに再び過疎になったね
何でデータベースは検索が速いのかが疑問なんですが 仕組みについてやさしく書かれているサイトは無いでしょうか?
>>141 まずはB-treeについて勉強したらいいよ。
143 :
NAME IS NULL :2009/05/06(水) 17:37:32 ID:dE2L58df
ちょっと古いけど「RDBMS解剖学」を立ち読みしてみる とか
144 :
NAME IS NULL :2009/05/07(木) 15:23:38 ID:DlYqT5Bu
innoDBよりISAMの方が検索速いってマジ?
検索だけならMyISAMは早い。 GoogleがMyISAMの改造版を使ってるという記事を読んだことがあるな。
146 :
NAME IS NULL :2009/05/07(木) 16:44:48 ID:Olr/5NnF
ところでさMySQLはオプソなんだから、 クローンプロジェクトで管理していってもかまわんのじゃない? それともフリーなだけでオープンじゃなかったわけ。
147 :
NAME IS NULL :2009/05/07(木) 17:05:29 ID:3pzQ/ytL
forkはできるが、信頼できる組織か個人がやらないとダメだろう。 そこらの無名の人間がforkしても誰も使わないだろ。 MySQL創始者のmontyは会社はじめてるし、彼がやるならOKと思うが、innodbがOracleの物だからMyISAMしかダメなのはつらいかもな。もちろんforkしたらinnodbが使えないかどうかは知らんが ユーザーからすればあまりに危険なんでforkしたやつではinnodb使う奴はそうそういないだろう。 Falconはどうもダメっぽい。っていうかinnodbのかわりになるほど完成度があがるとは思えん。 ま、なんだ もともとinnodbがOracleに握られた段階でMySQLはキンタマつかまれてたわけで、その前のOracleによるMySQL買収交渉の時点でOracleの対MySQL戦略は決まってたはずだ。 つまりMySQLに先はない。forkに期待するのもいいが、別のDB使う検討をはじめるのが普通のエンジニアのリスク管理だと思うがな。
>>147 InnoDB も GPL だから、使いつづけることはできる。
149 :
NAME IS NULL :2009/05/07(木) 23:48:45 ID:3pzQ/ytL
>>148 それは知ってるが、forkしてOracleと対立しながらinnodb使い続けるのってリスキーだろ、て話し
以前まで動いていた、MySQLが動かなくなってしまったのですが、どうにも 解決しないので、どうかお力を貸してください。 OS:CentOS5 MySQL5 MySQLを開始しようとするとエラーがでてしまいます。 エラー内容: mysqld failed. The error was:MySQL データベースを初期化中: Neither host '自宅サーバーのホスト名' nor 'localhost' could be looked up with /usr/bin/resolveip Please configure the 'hostname' command to return a correct hostname. if you want to solve this at a later stage , restart this script with the --force option [失敗] どうか御教示ください。お願いします。
エラーメッセージも読まないのか。
>>149 それが実際に問題になるなら、Innoもフォークすることになる。
GPLの最大の特徴は、誰も排他的権利を持ち得ないことなんだから。
でも、結局はInnoDBからforkせずにFalconをスクラッチから書いたわけだしなぁ。
154 :
NAME IS NULL :2009/05/08(金) 21:15:35 ID:23A0Mz+F
InnoDBってなんて読むの? イノディービー? もう一つはマイイザム?
好きなように読めばw
MySQLにしても、InnoDBにしても、厳密にはGPLとはちょっと違うじゃん
デュアルライセンスなんだし、Oracleなり、MySQL ABなりに御布施すればGPL免除でしょ?
MySQL Enterpriseなんて、登場した時から既にGPL制限の無いアプリだし
これからはMySQL Community ServerとMySQL Enterpriseの差が、
どんどん開いてゆくだろう事は想像に難くない
でも一番の問題は、昔はGPL汚染に躊躇してMySQLが採用されない事例を回避する為に
「MySQL ABに寄付してくれればGPL回避出来ますよ」的な意味合いのデュアルライセンスだったのに
今では、というかMySQL Enterpriseが出た辺りからだんだんと、「おまえ(Community Server)のものは
俺(MySQL Enterprise)のもの、俺のものは俺のもの」的なジャイアニズム全開なデュアルライセンス
に意味が変わったことだね
とはいえ
>>147 も触れてるとおり、MySQLは創始者自身がforkしたし、
InnoDBも去年forkしたExtraDBってのがあるにはある
先行きは明るくないとは思うけど、MySQLを捨てるのはまだ早いと思うよ
データはインサートできても チンコはインサートできないんだなぁ みつを
161 :
NAME IS NULL :2009/05/11(月) 01:05:08 ID:HP0cpXb+
バックアップについてちょっと聞きたいんだけどここでいいのかな? サーバーAとBがあって、サーバーA(XP)は今まで使っていたサーバーで サーバーB(Fedora)はバックアップ専用で立てたサーバー サーバーAからSELECT * INTO OUTFILEしてデータを取り出して サーバーBにSELECT * INTO OUTFILEするとバックアップ完了であってる?
no
164 :
NAME IS NULL :2009/05/11(月) 14:29:49 ID:GmKXaVZf
ハッカーを刺激してフリー版のMYSQLが一段と強くなると思う gpg、ssl、appacheなどソフトはフリーのほうが優秀だよ。 それは当然であって、社内の限られた研究者が世界中のハッカーに 勝てるわけがないのね。数が違うから。
165 :
NAME IS NULL :2009/05/11(月) 16:28:44 ID:7jKYx7be
>>164 可能性としてはあるかもしれないけど、まぁないと思うよ
興味あることの実装と、それを安定して使えるようにする
というのは別物だし。
オプソの弱点のはそこだ ともいわれているしね
コアだった開発者がどこまで集まるかはじゃないかな
#アーキテクト含めて
>>164 そうだな、そうであればうれしいな。
でも、
>>165 の意見に賛同する部分が多いよ。
我侭なユーザーに怒らずに頑張れるのが金なんだよな。
MySQLも皆の為に頑張るよっていうすげぇ素晴らしい人
ばかりだったらSunすら買えなかっただろう。
2年くらい経ったらNetscape並の黒歴史入りかもな。
167 :
NAME IS NULL :2009/05/11(月) 22:37:42 ID:sWkB5gaT
>2年くらい経ったらNetscape並の黒歴史入りかもな。 Netscapeの血筋がthunderbirdとfirefoxをひっさげて ものすごい復活劇になってるね。
>>167 そうなったらいいね。
firefox並に復活してきたらいいなぁ。
でも、そん時はMySQLって名ではないのだなぁ。
サーベルタイガーあたりの名前で復活してくれ。
169 :
NAME IS NULL :2009/05/13(水) 02:02:16 ID:LXnOWi0q
久々に仕事でLAMPのシステムを納めることになったんだが、 ライセンスはMySQL Enterpriseてのを買わなきゃいかんのか。 これって年毎に買わなければいけない? 教えてエロイ人。
なくてもいい
172 :
169 :2009/05/13(水) 12:14:37 ID:oQtcNrJ7
>>170 そのへん詳しく書かれているソースとかあったら教えてもらえるとありがたいです。
ぐぐっていろんなとこ見ても、イマイチよくわからない・・・
>>171 仕事なのでムリっすねぇ。
仕事ならoracleでも使っとけ
ライセンスに悩むのならBSDLなPostgreSQLにすべきだろうな
175 :
NAME IS NULL :2009/05/13(水) 19:50:01 ID:raTYNme4
質問させてください。 複合インデックスを作成する際のキーの順番って関係ありますか? またその場合はカーディナリティの高い順にするべきでしょうか? よろしくお願いします
176 :
175 :2009/05/13(水) 21:13:27 ID:???
もしかしてスレ違いでしたか? 質疑高等スレで出直してきます。
177 :
NAME IS NULL :2009/05/14(木) 03:43:58 ID:0wBwjegy
MySQLでCREATE TABLEする際に、CONSTRAINT CHECK(条件);って効かないのですか? 主キー制約と外部キー制約は効いているのですが。
178 :
NAME IS NULL :2009/05/14(木) 11:51:18 ID:IkGVegOI
>>177 バージョンは?
って、MySQLはCHECK実装してないけどなw
こんな変なDB使ってるやつは馬鹿だぞ、別のDBにしとけ
外部キーよりチェックの方が使う機会多いと思うのにな。
180 :
NAME IS NULL :2009/05/14(木) 14:05:21 ID:pUvkUN/J
早くこのDB無くならないかなぁ
181 :
NAME IS NULL :2009/05/14(木) 22:46:20 ID:IkGVegOI
>>179 その外部キーだってInnoDBだけだからな
MyISAMでは使えない
>>180 それをわざわざこのスレに言いに来る意味があんのか?
俺としては、買収前にOracle社そのものがなくなって欲しかったわ。
Oracleを盲信してるやつらがうざい。
SUNの株主がOracleへの売り渡しに抵抗しているみたいだから、 もしかしたらSunの買収話は消えるかもよ MySQLだけOracleに譲渡とかなw
MyISAM+fulltextインデックスを使用して全文検索を行っているのですが、 レコードの量が増えるにつれInsertがどんどん、遅くなっていきます。 ある程度は、覚悟していたのですが、あまりにも遅く…。 今後もレコードは増え続けるのですが、どう対応してよいのやら…。 ある程度のところで、新しい全く同じレイアウトのテーブルを 作成し、そのテーブルにデータを追加していき、selectするときは、 既存のテーブルと元のテーブルをunion? しかし、テーブルを分けてしまうと、重複レコードが…。 通常、こういった場合、どのように対応するのでしょうか? ご教授していただけないでしょうか。 よろしくお願いします。m(_ _)m
更新はときどきまとめて行うことにして 1) fulltextインデックス削除 2) INSERT 3) fulltextインデックス作成 とか? いろいろ制限はついてしまうけど。
単純に定期的に最適化してないってわけじゃなくて?
189 :
NAME IS NULL :2009/05/16(土) 17:30:52 ID:qEI7Vk1N
190 :
NAME IS NULL :2009/05/16(土) 21:15:26 ID:zYBZo2FJ
>>189 firebirdの例もあるけどね
#使ったことはないけどw
>>186 MySQLの思いつきみたいな機能追加と変更はまともな技術者のなせる技ではない。
MySQLはmontyしかforkできないが、montyの技術力じゃ維持しつづけるのは無理。
よって終了
前半は同意
10年くらい、今のバージョンのままでいいよ
機能追加は無しで、バグフィックス程度はね。
196 :
NAME IS NULL :2009/05/17(日) 15:49:44 ID:IAxxUei2
でもストアドは弱すぎない? 5.xの見てる感じだけど
MySQLを生かすも殺すもOracleの思いのままになった時点でMySQLは終了だ。 Oracleには期待するな。OracleがMySQLを生かそうとするならそれはローエンドのユーザから金をむしり取る場合だけだ。 無料という意味でのフリーウエアとしてはMySQLは終わったんだ。 モンティがforkするMariaSQLはだめだ。マイナーバージョンアップですらゴタゴタする思いつき開発しかできない奴に、 ここまでひろまってしまったプロダクトの舵取りさせたら混乱するだけ。 しかし、モンティに逆らって別プロジェクト立ち上げる人間も、それについていく人間もいないだろう。 強いてあげればGoogleくらいか。GoogleSQLとしてforkすれば移行する人間も多いだろう。しかしGoogleがMySQLを使い続けるだろうが、 それをオープンにしてメンテしつづける意味はまったくない。よってGoogleSQLはない。 つまりMySQLは終わったんだ。
198 :
NAME IS NULL :2009/05/17(日) 17:19:54 ID:IAxxUei2
>>197 IBMのwebsphereのfree版の方は買収した奴だと思った
他の流れるくらいならと、少しはメンテはあるかもしれんかなと
199 :
NAME IS NULL :2009/05/17(日) 23:32:38 ID:2v0ewY/l
トリガを使ってテーブルの更新をWEB画面に反映させることは可能でしょうか
>>199 トリガとWEBについて1から勉強しなおし
>>197 >モンティがforkするMariaSQLはだめだ。マイナーバージョンアップですらゴタゴタする思いつき開発しかできない奴に、
>ここまでひろまってしまったプロダクトの舵取りさせたら混乱するだけ。
こういう思い込みなところが多いから、お前の言うことは説得力に欠ける
>レコードの量が増えるにつれInsertがどんどん、遅くなっていきます。 インサートはオーバフローに一旦入るから遅いよ。 適当な件数でコミットすべし。 途中でしんだらバックアウトすべし、または手作業バックアウトすべし。
CentOS5 の mysql 5.0.45 を利用してます。 他のサーバから、/var/lib/mysql 以下のデータベース実体ファイルをコピーして来ました。 mysqlで、コピーして来たデータベースを use するところまでは問題無いのですが、 適当な検索文を走らせると mysql> select * from hogehoge where no = 123123; ERROR 1017 (HY000): Can't find file: './hogehoge/aaa.frm' (errno: 13) というエラーが出てしまいます。 パスの指定などを行わなければ行けないのでしょうか?
203です。 mysqld_safe で起動すると読み込めますが、 service mysqld start から起動すると依然としてNGです。この差はなんなのでしょうか・・ パーミッションなどは問題無いようです。
問題無いと思っているところが問題なんだろうな。
206 :
NAME IS NULL :2009/05/19(火) 11:51:50 ID:xhLm6cZW
203です コピーして来た物でないデータベースは、現在も問題無く認識できていて、 それと同じパーミッション・所有者としているので問題無いと思います。
mysql> select * from hogehoge where no = 123123; ERROR 1017 (HY000): Can't find file: './hogehoge/aaa.frm' (errno: 13) hogehogeデータベースなのかhogehogeテーブルなのかわからん エラーメッセージはそのままかこう
208 :
NAME IS NULL :2009/05/19(火) 13:08:05 ID:xhLm6cZW
紛らわしくて済みません。 mysql> select * from hogehoge where no = 123123; ERROR 1017 (HY000): Can't find file: './test/aaa.frm' (errno: 13) test : データベース hogehoge : テーブル です。
mysql> select * from hogehoge where no = 123123; ERROR 1017 (HY000): Can't find file: './test/hogehoge.frm' (errno: 13) ですね・・すみません。
my.iniを修正してサービスを再起動すると、エラーが出て起動できない 修正前のmy.iniに戻すとサービス起動できる これは一体どういうことなんでしょう? バージョンは5.1.34です
はい、次。
GPLのMySQLとPHPを使ってるんだけど、GPLだから何も問題ないよな。
214 :
NAME IS NULL :2009/05/20(水) 23:55:36 ID:XwWNlez2
ちょっと相談に乗ってもらいたい。 WEBシステムでMySQL使ってて、 1日に1回、他システムからCSV形式でデータが送られてくる。 CSVは約10テーブル分。 WEBとは別のバックグラウンド処理で取り込んでる。 WEB側(PHP)からは、これらのテーブルに対する更新はない。 10テーブルのうち、delete&insertの全件入替えと、 replaceによる差分入れ替えが混在している。 こういう場合、テーブルのエンジンはMyISAMとInnoDBのどっちがよいだろうか?
215 :
214 :2009/05/20(水) 23:58:19 ID:???
ちょっと補足。 全件入替えのテーブルは、件数が多いもので約10万件です。 差分の場合、対象テーブルには多いもので数百万件のレコードがあり、 差分で入ってくるものは大体100件程度です。
>>214-215 どうも頭が高いな。
トランザクションが要るか要らないかでどちらのストレージエンジンを使うかを
判断すればいいと思うが。
>>212 >>213 PHPで書いたソースをどうするかが
キモになるかと思ってたんだが、違うのかな?
>>214 更新しないならMyISAMでいいと思うよ。
InnoDBが有利になるとしたら、主キーによる範囲検索を頻繁に行う場合ぐらいか?
つうか もしも更新失敗したらとか考えないのかMySQL使ってる奴らは バッチ処理の最中になんらかのトラブルがおこったらどうすんの
業務的な使い方でバッチ処理云々を言うなら、失敗したらやりなおしだろ。
>>214 と同じような事をしているがISAMではタイミングによっては更新がされない等の問題が出たからInnoにしている
replaceを使っているならいざという時でもISAMで大丈夫かもしれないが…
確実な更新が必要だったらトランザクションがあるInnoが安心だと思う
最近、サーバーが重くなってプロセスを調べてみたら mysql 2437 12.6 0.9 117408 20248 ? S May15 1354:21 /usr/sbin/mysqld --basedir=/ --data こういうのがCPUを喰っていました。 mysqldのリロードや再起動を試みたのですが消えません。 これはなんなのでしょうか? phpMyAdminのプロセスを見ても該当するのはないようです・・・。
??? MySQLサーバの本体でしょ? あなたの作ったアプリケーションが遅いか 大人気でアクセスが多いんでしょう
いや、そうなんですけど、アクセスがほとんどないと思われる時間帯でも同じぐらいCPUを喰ってるんですよね・・・
>アクセスがほとんどないと思われる いや実際にアクセスがあったのか確認するとか、 アクセス遮断しても同様なのかとか
220 :NAME IS NULL:2009/05/22(金) 07:25:11 ID:??? 業務的な使い方でバッチ処理云々を言うなら、失敗したらやりなおしだろ。 馬鹿発見 ほんとにMySQLしか知らんやつらはw 業務系でDB使う意味っつか DBが開発された意味すら分かってないんだなw
ホストで動いているDBとかは、バッチが失敗したら素でやり直してるな。 つか業務系とか単語出すヤツは現実に無職なヤツだろ。
MySQLってWEB系でしか 使われてないの?
MySQLを学習するに当たって、有用な参考書や、参考サイトがあったら、教えてください。 学校で、MySQLを学習するのですが、何分触るのが初めてなもので、どのように学習を進めていけばいいのかわかりません・・・。
230 :
NAME IS NULL :2009/05/25(月) 20:39:00 ID:+IuRrIp9
SQLのみなのか、管理面も含めてやるのかによって違うと思う どんな教科書使う予定なのか まず書くことが先決だと思う
>>229 個人的なお薦めは公式サイトにあるマニュアルを読む事。
あれはよく出来ていると思う。
長く使うのならどうせいずれ何度も見る事になる物だし、
読んで損する事は無いと思うよ。
MySQL 5.1 MyISAM @レンタル鯖で、 i-mode用にデータを指定件数毎にページ分けして表示させようとしてまつ。 データテーブル: d_datas 設定テーブル: m_setting (code, par_page) primary key(code) SELECT * FROM d_datas WHERE foo=xxx ORDER BY order_key LIMIT (SELECT par_page FROM m_setting WHERE code=1) * 何ページ目 , (SELECT par_page FROM m_setting WHERE code=1); の様にサブクエリを使ってみたのですがエラーで動きませんでした。 何が悪いのかさっぱり分からんとです。 LIMITにはサブクエリは使えないとですか?
rollbackがないmyisamは怖くて使えない
>>233 サブクエリじゃなくてプレースホルダで埋め込め。
>>233 つーかmyisamにサブクエリって重いから使わない方がいいかと
MySQL6終了のお知らせが来たね 今後は5.4を発展させるそうでつ Oracleに近づこうとする新機能は抹殺w
238 :
NAME IS NULL :2009/05/28(木) 11:19:43 ID:55S4kKZW
今DBにSJISとEUCで格納してますがこれをUTF-8にしたい 既に入っているデータの文字コードを全部一度に変換するSQL文ってある?
ダンプして入れる、でいいじゃない
240 :
NAME IS NULL :2009/05/28(木) 13:00:25 ID:55S4kKZW
>>239 それだとDBがたくさんありすぎて大変なので
SQL文だけでなんとか変換できませんか?
SQLでもしできても、そっちのが工数多いと思うが・・・ 変換失敗したときのためにダンプしておくのは同じだし。
>>238 ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
245 :
NAME IS NULL :2009/05/28(木) 22:44:02 ID:z1ctR8/+
246 :
238 :2009/05/29(金) 00:50:27 ID:Tc3W7H//
>>244 ありがとうございます。
これならPHPのループでテーブル名だけ入れ替えれば簡単に終わりそうです。
これ
ALTER TABLE じゃなくて
ALTER DATABASE とかでDB丸ごと変換できませんか?
247 :
NAME IS NULL :2009/05/29(金) 02:51:06 ID:wLSuWYoV
mysql5.0.45です。
update `regist` set `loginId`='
[email protected] ', `loginPass`='xxxx', `day1`='2009-05-28' where `uId`=3
というクエリをPHP5で実行したら、
#1054 - Unknown column 'day1' in 'field list'
と言われました、カラムday1は存在していて、型も問題ありません。
自分なりに調べたら、leftJOINをするときに起こりがちな問題ということですが、見ての通りjoinしてません
何が原因なのでしょうか。お手数おかけしますがアドバイスお願いします。
248 :
233 :2009/05/29(金) 03:07:40 ID:???
>247 そのday1っていう名前を予約語っぽくないものに変更してみたらどうなんの?
250 :
NAME IS NULL :2009/05/29(金) 07:58:11 ID:l0KxXPVG
`無しで"update〜3" じゃ駄目?
251 :
242 :2009/05/29(金) 09:31:08 ID:???
データベースをいくつか用意し、データを分散、必要なデータを適時読み取るってことできますか?
253 :
NAME IS NULL :2009/05/29(金) 12:15:08 ID:wLSuWYoV
>>249 ありがとうございます
日本語をまじえた名前に変えてみたんですが上手く行かないんです
なんでだろ… バージョンあげたら良いのかなぁ
primary keyとunique keyをはっているidを見たのですが、これってprimarykeyのみと比べて検索速度に違いは出ますか? primarykeyはuniquekeyをかねると記憶していたので検証された方いらっしゃいましたらご教示ください。
気になるなら自分で試せばいいのに
256 :
254 :2009/05/31(日) 21:26:17 ID:???
試してみたいですが差を認識できるほど大規模な検証は時間がかかるので試したかたがいればとおもいました 一般的にはprimaryのみという認識であってますか?
INDEXなんてもし同じものに2つ以上ついていても 1つしか使われないんだから一緒だろう。 そもそも制約と索引の違いもわかってないのにそこを気にするのは間違ってるな。
258 :
NAME IS NULL :2009/06/02(火) 16:33:55 ID:kUrXdzVL
質問なのですが シフトJISのwebページで半角の¥をデータベースに入れると取り出す時に全角のバックスラッシュになって表示されます。 ソとか表とかで終わる文も文字コードの関係で入りません。 ですのでwebページに他の文字コードを使えば解決する問題ですが 2chはシフトJISですよね。 データベースは何使ってるか分かりませんが シフトJISでも実は問題なくできるという事だと思います。 で、こういう問題はどの様に対処するのが正しいのでしょうか? どうすればシフトJISでソとか表とか半角の¥とか入りますか?
>>258 フォームで受け取る時、ウェブに表示するときに変換汁。
>>258 データベースの文字コードをシフトJISにする。
何で接続しているか知らんが、たとえば、JDBCとかだとユニコードに一旦変換されたりするんじゃね?
262 :
NAME IS NULL :2009/06/03(水) 00:43:19 ID:t6kRRUCU
>>237 もう俺は移行済み。むしろMySQLは早く無くなってほしいくらいw
263 :
258 :2009/06/03(水) 02:13:29 ID:maHUNQLQ
>>259-261 レスありがとうございます。
2chの場合を考えると、シフトJISで投稿されて、文末に「ソ」とかある文章でも投稿できてDBに入りますよね。
という事は、CGIスクリプトでDBに入れる前に別の文字コードに変換して入れてるのでしょうか?
それともDBやテーブルの文字コードのデフォルトをシフトJISにすれば
問題なく入るのでしょうか。
でもDBにinsertする直前にSET NAMES SJISのクエリを送れば
デフォルトでシフトJISなのと同じ事ではないのですか?
それでもinsertできません。
>>263 escapeだとか、prepareステートメントとか分かってる?
なんの言語つこてるか知らんけど、たいがいの言語のDB-driverには
それらの機能あるはずなんで、そこらへんちゃんと勉強しましょう。
265 :
NAME IS NULL :2009/06/03(水) 12:32:56 ID:maHUNQLQ
テーブルを作るときにデフォルトの文字コードをEUCに決めて insertの時にset mame sjisとした場合 insertされる文字はEUCとsjisのどっちで保存されるんですか?
サーバ(DB)の文字コードとクライアントの文字コードの違いをよく考えよう
267 :
NAME IS NULL :2009/06/03(水) 13:48:16 ID:maHUNQLQ
ということは set names sjis送ってもそれはクライアント側からsjisで受け取りますっていうだけで 保存はテーブルのデフォルトコードが採用されるって事?
テーブルの文字コードっていったい何だと思っているのか
2chの掲示板がMySQLつかってるとは思えない
271 :
NAME IS NULL :2009/06/04(木) 22:56:19 ID:TuMdbt3U
character_set_connectionの意味が理解できないのでわかる方いましたら教えてください. クライアントからサーバにinsertなどでデータを渡した後に, データの文字コードはcharacter_set_clientからcharacter_set_connectionに 変換されるのでしょうか? とすれば文字コードの自動変換とは,このことを言うんでしょうか? また,character_set_connectionとcharacter_set_databaseが異なる場合, ある文字コードで設定されたデータベースに文字コードの異なるデータが 入るということになるんでしょうか?
character_set_connectionは、 データベースにデータを格納しないSQLで使われるキャラクタセット。 mysql> set character_set_connection = cp932; Query OK, 0 rows affected (0.00 sec) mysql> select length('あ'); +---------------+ | length('あ') | +---------------+ | 2 | +---------------+ 1 row in set (0.04 sec) mysql> set character_set_connection = utf8; Query OK, 0 rows affected (0.00 sec) mysql> select length('あ'); +---------------+ | length('あ') | +---------------+ | 3 | +---------------+ 1 row in set (0.00 sec)
> また,character_set_connectionとcharacter_set_databaseが異なる場合, > ある文字コードで設定されたデータベースに文字コードの異なるデータが > 入るということになるんでしょうか? (1) character_set_database (2) show create databaseで出てくるcharacter set (3) show create tableで出てくるdefault charset (4) show create tableで出てくるカラムごとに設定したcharset まずこの(1)、(2)、(3)、(4)は個別に設定できるので注意。 (1)は(2)で上書きされる。 (2)は(3)で上書きされる。 (3)は(4)で上書きされる。 格納時はcharacter_set_connectionが何だろうと、 (4)で格納される。(4)が設定してなければ(3)で格納される。 一度テーブルを作ってから(1)や(2)を変更して再起動しても すでに格納したデータは変わらない。
274 :
271 :2009/06/05(金) 02:11:41 ID:???
>>272-273 ありがとうございました!!リファレンスマニュアルに
「クライアントから送られたステートメントをcharacter_set_client からcharacter_set_connection に変換します(ただし_latin1 あるいは_utf8のようなイントロデューサのある文字列リテラルは除く).」
と書かれていて混乱していました.
>>272 のバイト長の例がわかりやすかったです.
>>273 は文字コードが(4)(設定されてなければ(3),(2),(1))に変換されて格納されるということですよね.
275 :
NAME IS NULL :2009/06/05(金) 20:39:52 ID:oLyVZQ1P
ダンプをしたりするのをコマンドプロンプトでやってるのですが オプション指定とかいろいろ知識も必要で手間もかかるので ダンプとかダンプしたデータを戻したりができるフリーソフトってないですか? Windowsです。
>>258 2ちゃんねるはデーターベースは使ってない。
ファイルで管理している。
278 :
NAME IS NULL :2009/06/06(土) 16:58:59 ID:9rrlV8Y0
2chってファイルで管理してたらサーバーがファイルだらけになるんじゃないの? DB使わずにファイルで管理するメリットあるの?
ファイルだらけで何か問題? ファイルシステムで済む事にDBを使うメリットは無いでしょ。
>>276 はいって何だよ。出来んのかよ。さっきから何度も。何がはいなんだよ。
出来もしねえ奴が軽々しくはいなんて言うんじゃねえよ。
わかってんのかよ。はいって言う事の責任の重さを。
社会勉強のつもりでやってんだったら辞めろおまえ。
2chの場合は明らかにファイルシステムの方が向いているだろ。 と言うか2chをデータベースで管理していると考えたり、例えてたり する方が正直どうか?と思うが。
その明らかな理由を教えてください
1スレッド最大1000コメントで、順次アクセスと追記だけ。 コメント間のリンクの管理もやらない。 これのどこにDBが必要になるんだよ。
285 :
NAME IS NULL :2009/06/07(日) 10:02:44 ID:H5yYzBMm
書き込みが多い(激しい)スレだと、ファイルロックじゃ持たないでしょ? 昔から、カウンタなんかでよく出た話 #落ちてもたいしたデータじゃないと言えばそれまでw スレ一覧の更新順に表記なんかは、DBの方が楽だという発想がないの?
>書き込みが多い(激しい)スレだと、ファイルロックじゃ持たないでしょ?
現に2chが持っている事実について
>スレ一覧の更新順に表記なんかは、DBの方が楽だという発想がないの?
現実にはファイルシステムの方が楽な点について
正直
>>285 みたいな発想できるほうがエンジニアとしては致命的だと思うが。
まあエラーが出たら書き込む側がリトライするし、その程度の信頼性でいいからな。
2chならむしろファイルシステムのが向いてるんじゃね
2chならむしろ存在しない方がいいわけで
>まあエラーが出たら書き込む側がリトライするし、その程度の信頼性でいいからな。 MySQLスレでこんな発言を聞くと凄くマヌケに感じる。 RDBMSを使ってトランザクション制御しようが、2chの仕様の「追記オンリー、1スレッド1000コメント」 の前にはRDBMS使う必然がないだろ。 つか、RDBMSで最新50取得とか次100とか全部読むをSQLを発行して結果セット取得しながら HTMLに変換とかやるくらいなら、ファイルシステムを読みながら変換したほうが効率いい。
RDBMS覚えたてだと何でもDBに突っ込みたくなる物さ わざわざDBを使って同期書き込みしたら、それこそ持たないと思うけどね
>>285 中の人じゃないので「今」の仕様は知らないけど。
数年前は mmap() してた。
(だからdatサイズ制限とか{ある|あった})
最近はRAMDISK上に置いてるので、鯖落ちするとdatは
電子の藻屑になるケースが多い。
※↑は書き込みの多い実況系の設定
※普通の板はファイルキャッシュで間に合うらしい
2chはRDBMSの方が向いていると主張するヤツは試しに 実況鯖とかをMySQLで実装してみればいいんじゃね。 おそらく、マッハで鯖が落ちる。
>>290 一斉に書き込むとタイムアウトするし、たまに1000超えてるときあるだろ?
銀行の預金じゃないんだからその程度でいいんだよ。
>>293 がしょぼいプログラムを書くから落ちるんだよ。
296 :
NAME IS NULL :2009/06/08(月) 19:34:29 ID:GzH14Amh
カウンターの数字を ファイルに書き込むのとデータベースに書き込むのは どっちが速いですか?
>>296 ・カウンターってウェブページに表示するアクセスカウンターの事?
・データベースはプレーンな InnoDB を使うと考えて良いの?
・ファイルシステムは何を使っても良いの?
・どんなサイトで、可用性はどの程度まで担保すれば良いの?
・サーバの実装は単発の CGI なの? それとも永続的なプロセス?
プロセスのメモリ上に置いておいてどこにも書き出さないのが一番速いよ。
でサーバーのプロセスに障害が発生するとカウンターが飛ぶワケだな。 ロックを判断しながらOSのファイルシステムに読み書きするのと、 RDBMSでトランザクション使いながら読み書きするのとだと、 当然だけど前者の方が速い。
耐障害性能の要件が無いからそれで十分。 プロセス障害が気になるならマルチプロセスにしてデータを共有しておけ。 それでも心配なら 10 分に一回 tmpfs に書き込んでおけ。 まだ不安なら 1 時間に一回 tmpfs からローカルディスクにコピーしろ。 どうしても安心出来ないなら 1 日に一回リモートマシンにバックアップしろ。
300 :
NAME IS NULL :2009/06/08(月) 23:31:51 ID:zsXNZrVF
MySQLの応答が突然遅くなりました。 MySQLとやりとりするプロセスが通常数秒で終了するところ何十分もかかっています。 mysqlクライアントのログインに数十秒かかります。 topで見てもmysqldのCPU使用率、メモリ使用率も高くありません。 show processlistでも長時間かかっているQueryはありません。 どのような原因が考えられるでしょうか?
>>300 それだけじゃ何とも…
単純な SELECT 文でも時間が掛かるの?
telnet や ssh は遅くなってない?
ローカルホストから接続しても遅いの?
ファイルシステムはいっぱいになってない?
I/O はきちんと処理出来てる?
mysqld 以外に何かプロセスが動いてない?
応答が遅くなる前に何か操作しなかった?
OS は Linux 系?
etc.
302 :
NAME IS NULL :2009/06/09(火) 00:01:42 ID:I15GJ2dD
>>301 申し訳ないです。
1件のSELECTとINSERTをしてみましたがいつもは一瞬のところが数秒かかります。
sshでmysqldが動いているホストにログインしてmysqlクライアントで操作していますが
mysql以外のコマンドは全く遅くなっていません。
ファイルシステムの空きは十分ありIOに問題はありません。
mysqld以外にもプロセスは動いていますがtopで確認しても負荷の高いものはありません。
突然と書きましたが、応答が遅くなる前に大量の更新処理をしていました。
MySQL単体の問題みたいだけど、エラーも出ない、ログイン時間が掛かる というのは不思議ですね…
DNSで名前がひけなくなるとそうなるかなー skip-name-resolveとか
>>302 エラーログに何も出ていないなら、テーブルスペースフルとかでもないんだよね。
単純に件数が増えて遅くなっているならexplainとかを使ってクエリの中身とか
インデックスの張り方を工夫してみると良いと思う。ファイルソートになってる
とか、インデックスを使えてない可能性もあるから。
MySQL 5 を使い始めました。 PostgreSQL には vacuum がありますが、 MySQL には同様のものはありますか?
そんなものはいらないない。
309 :
307 :2009/06/09(火) 14:36:49 ID:???
あれ? 2chはファイルシステム有利とか言ってた約1名は逃げた? 2chがDB使ってないのは、元々の仕様でそうなっていたからだろ? 要するにDB管理の掲示板じゃなかったから。 DB版掲示板の無料レンタルなんて当時ほぼ無いだろうが スレ内検索なんかにはDBの方が有利だな。CPUに負荷もかからんし。
それで思い出したけど、カウンタの質問してた人は質問投げっ放しか。 疑問は解けたのかな。
ってゆうか2ちゃんってひろゆきが作ったんじゃないの? ひろゆきプログラマー?
お手軽ででかいシステムだとファイルシステムがいい 金かけまくってとことん突きつめるとDBになるがコストパフォーマンスが…
>スレ内検索なんかにはDBの方が有利だな。CPUに負荷もかからんし。 真性のヴァカ発見 つかRDBMS覚えたて厨房はさっさと2chをMySQLで構築してみりゃいいじゃねーか。
>>310 本気でそう思っているなら運営板にでもいって鯖管理でもやらせてもらえば。
UNIX板あたりの住人に「バカ発見」と言われるのがオチだろうけど。
DBに入れると魔法の力で計算量が激減すると思ってるのかもね。 元々の仕様がなんでそうなったのかとか、検索用のインデックスを 張るコストとか、深く考えてないんじゃないかな。
その理由は?
>>314 RDBMS相当の機能を自前で実装しようとすると、もっとお金が掛かるよ〜
2chの書き込みをわざわざSQLを使って格納するのは無駄だし、ACID特性も
必要無いし、RDBMSを使う意味は無いよね。
mixiはデータベース管理だお
2chはファイルシステム管理だお 技術要件が違うんだから適材適所
ファイルシステム管理とか変だろ。 ただのベタファイルだろ。
たいていのブログもDBじゃね? ファイルで管理とか初心者すぎだろ
そのベタファイルをファイルシステムで管理してるんだよ。 ディレクトリとかキャッシュとかタイムスタンプとかアクセス権減とか、 その他のメタデータとか、実装をきちんと理解していれば変ではない。
ファイルでの管理の問題点は、ファイル内を検索する速度の速い遅いではなく 同じディレクトリ内に大量のファイルを置くとそのファイルを探すのに時間がかかる事。
>>319 ?2chでもACID特性は重要だろ。
でなきゃ同時に書き込みしたらレスが混じるとか、行数制限を越えた
書き込みをした時にレスが半分だけ書かれるなどということが
起きかねない。
>>325 板毎にディレクトリは分かれてると思うけど、読み書き可能なスレッドだけ
なら大量というほどの事は無いでしょ。ファイル名のキャッシュもあるし。
もしファイル数が問題なら、ある程度のスレッド数毎にディレクトリを
分ければいいだけだし。
>>326 程度の問題だけど、2chはレスを書き込む度にいちいちfsync()しないと
いけないサイトではないでしょ。永続性は限定的で十分。
楽観的ロックという考え方もあるしな。
>>327 なぜその文脈でfsyncだの永続性だのといった単語が出てくる?
>>319 だから、同等の機能はそもそもアキラメル
ちなみにとことん突きつめると全データオンメモリとか そんなもんw
>>327 だからファイルで管理する場合ディレクトリを分けなきゃいけないって事でしょ
スレ内検索は、全文検索だから 転地インデックスにするか、grepみたいに全部見るしかないんじゃね?
>>330 理解出来なかったのならACIDのDについて調べてみよう。
>>333 2chのスレ数なら
>>325 の問題はそもそも気にしなくて良いという事。
そういえば「したらば」もデータベースって聞いた事あるよ。
掲示板にDBを使う主な理由はこのどちらかだけど、 ・データを連携させて高度な機能を実現したい ・性能を多少犠牲にしても、データの管理を丸投げしたい 「2ch」はどちらにも当て嵌まらないんだよね。
>>336 何処で聞いたんだ?したらばも2chとほぼ同じ仕掛けだったと思うが。
まあ、今話しているのはスレッドの管理のことで、
板自体の管理にDBを使ってる可能性は否定しない。
2chブラウザの仕組みを知ってるならスレッドの管理にDBを使ってないのは明白だろ。
2chがどうとか言う話になってるから便乗して質問したいのだが sennaってどうなの? 仕組みがよく分からないのだが、効率よく分かち書きしてくれるって事?
N-GRAMかMeCabつかった分かち書きだから、Sennaの肝は転置インデックスでの検索でしょう
2ちゃんがデータベースだろうが何だろうがかまわないが FOX★がハゲすぎてるのが気になる
InnoDBってどうやって読むのでしょうか? インノデービーで合ってます? MyISAMはマイアイサムで合ってますよね?
マィイサム
猪野出武威
えー、イノデブイとマイイサムなんですか‥‥。
イノデービーとマイイザム
mysql+phpで、例えばmysqlに A123A456A789 って文字が格納されてるローがあって、 これからA456てのを削除して、A123A789を残したいってときには、 まずselectして、そこのローをみて、str_replaceしてupdate set する方法しかないかな? sql文だけで便利なものありませんか
と思って調べたらREPLACE関数ってのがあった お騒がせしました
解決できずモヤモヤしてます。 初心者すぎてめっちゃ恥ずかしいですが、よろしくお願いします。 バージョンは 5.1.22-rc です。 TESTテーブルにある、SUUJIというカラムの構造を変更する文を書いてみました。 ALTER TABLE `TEST` CHANGE `SUUJI` `SUUJI` INT( 4 ) INT型は4byte必要と知ったので、INT(4) としてはみたものの、INT(1)でもINT(5)でもエラーが出ません。 INT(1)にしたあと、試しに数字を保存(999999.....と大きめな数を入力)してみたのですが 通常の最大値2147483647まで保存可能なようです。 INT( xx ) の指定には意味があるのでしょうか。そして、本来どう指定するのが正しいのでしょうか?
そりゃおめぇ、()の中はいくつの箱を用意するかの指定だからw
つまり、そのデータをいじったり、保管したりするには、メモリ及びディスク上に、INTであれば、(非圧縮で)4×n byte分のスペースが必要になるってことだ。
>>353 みなさま
表示幅の設定だったとは。根本的に間違ってたんですね。
自分の場合は小さい数字をPHPで取り出す目的だったので
あまり意識しなくてもよさそうです。
ありがとうございました!
サーバに多数のコネクションを張ってupdateかけるデーモン書いたら lock wait timeout exceededって怒られるようになりました。 ググったら "他のスレッドが保持しているロックをinnodb_lock_wait_timeout秒間待っても獲得出来なかった場合に発生する。 " と出てきました。 ここの"スレッドが保持しているロック"というのを調べる方法はないでしょうか? webサービスなので今のところタイムアウトの秒数を増やすといった解決方法は考えていません。 また、もし似たような場面に遭遇したといったことがあればヒントをいただけませんか? 対象となるテーブルはInnoDB、テーブルのロックは見たところ無いように見えてしまっています。
show engine innodb statusで、待たされている様子はわかる 誰がどのロックをつかんでいるかは MySQL 5.1+InnoDB Pluginを入れるとわかる かなり難しいけどね
357 :
NAME IS NULL :2009/06/15(月) 23:19:48 ID:2p3b4L8V
dumpする時ロックをかけるけど、webサーバーだとそんな事してる余裕無い そうするとwebサーバーってそもそもdumpしないのか?RAIDだけ?
>>357 バックアップの話なら、サイトによって様々でしょ。
例えばレプリケーションしてその先でダンプするとか、
ボリューム管理ソフトやストレージのスナップショット
機能を使うとか、色々。
WinXPにApacheとMySQL5.1.35を入れてphpMyAdmin起動して、 テーブル作成するため参考書CDに入ってたダンプと思われるtxtインポートしたら --で始まるコメントの行がSyntax Errorになりますた。 試行錯誤の末、コメント行を全部消して食わせたらちゃんと食ってくれました。 最近のバージョンではコメントの書き方が変わってたりするんでしょうか?
追記 --のコメント行が全部エラーになっているのではないようで、 一行だけ ------------------------------------------ みたいになっている行があって、その行を消すとインポートできました。 そういう行があるとエラーになるようになったのでしょうか?
361 :
355 :2009/06/16(火) 08:02:31 ID:???
>>356 情報ありがとうございます、難航しそうでがーんですがちょっと調べてきます。
>>359 普通のsqlも----------を突っ込んだらコメントに扱ってくれなかったよ。
今まで気にしてなかったけど--の後にスペースが必要なのかな。
362 :
NAME IS NULL :2009/06/16(火) 12:25:54 ID:r17qwjCX
MySQL3.23で質問です。 掲示板の書き込みで、スレ用のテーブル「thre」、レス用のテーブル「res」があります。 resには、所属スレIDを表す「tid」、投稿日付を表す「d」がDATETIME型で入っています。 ここで、最新のレス書き込みから30日以上放置されてしまったスレ(thre)を取得したいと思っています。 スレは重複がないように取り出したいです。 30日以上放置されたレスは 3456000 < UNIX_TIMESTAMP() - UNIX_TIMESTAMP(res.d) という条件で取得可能かと思いますが、1つのクエリでスレ(thre)のリストを取得するにはどう書けば良いのでしょうか? サブクエリが使えないので、MAX()が絞込み条件に使えず困っています。
363 :
NAME IS NULL :2009/06/16(火) 18:24:59 ID:FL2y7ITV
複数のテーブルからの検索で質問です。ググってみましたがJOINとちょっと違うような 気がするので、ここで質問させて頂きます。 以下の構成が同じ2つのテーブルがあるとします。 hoge id name 1 one 2 two 3 three moge id name 4 fore 5 five で、それそれ nameがtwoのid値を取得したい場合 select id,name from hoge where name='two' select id.name from moge where name='two' と2回検索しているものを1回にまとめるにはどするのでしょうか? select id from hoge join moge where name='two' だとエラーになりました。
select id,name from hoge where name='two' union all select id,name from moge where name='two'
365 :
NAME IS NULL :2009/06/17(水) 16:48:50 ID:dEbjvI4y
show table status\G 縦型表示。
367 :
NAME IS NULL :2009/06/18(木) 00:30:58 ID:JwU+upJr
MySQLタイムマシンの開発はどうなった?
368 :
356 :2009/06/18(木) 14:45:22 ID:???
>>368 wow わざわざすんません。右も左もわかってませんのでいろいろ漁って勉強させてもらいます!
ちなみに先の問題はレプリケーションの遊びしてた鯖でロックするようなselect出させるようにしてひとまず回避しました。
370 :
NAME IS NULL :2009/06/18(木) 21:23:14 ID:JwU+upJr
一つのテーブルからselectじゃなくて、そのDBの全てのテーブルからselectするのはできますか? 今はPHPで全テーブル名取得→ループで各テーブルをselectしてます。 これをSQL文だけでやってみたいです。
中カテゴリ、小カテゴリの一覧が入ったテーブルがあります。 ここから、中カテゴリが変わるまでitemのみを出すSQLを作りたいのですが、 PHPやPerlの中であえて行わずにMySQL用のクエリだけで実現できるのでしょうか? 識者の方、教えて頂けますと幸いです。 テーブル例) |category|item|(列名) |果物|りんご| |果物|スイカ| |動物|うし| |草花|あじさい| |草花|つばき| |草花|ひまわり| 出力例) ・果物 りんご スイカ ・動物 うし ・草花 あじさい つばき ひまわり
372 :
356 :2009/06/19(金) 02:09:19 ID:???
mysql> set @job = ''; Query OK, 0 rows affected (0.00 sec) mysql> select concat(if (@job = job, '', @job := job), ',', ename) from emp orde r by job, ename; +------------------------------------------------------+ | concat(if (@job = job, '', @job := job), ',', ename) | +------------------------------------------------------+ | analyst,ford | | ,scott | | clerk,adams | | ,james | | ,miller | | ,smith | | manager,blake | | ,clark | | ,jones | | president,king | | salesman,allen | | ,martin | | ,turner | | ,ward | +------------------------------------------------------+ 14 rows in set (0.00 sec) PHPやPerlでやったほうがいいと思います!
名前消し忘れた
>>370 1つのselectにするなら全テーブルが同じカラム構成じゃないといけない。
で、あらかじめテーブル一覧がわかってたらビューを作ればできるかも
create view v as
select * from t1
union
select * from t2
…
で、mySQLで掲示板作るとローパフォーマンスだとか主張していたヴァカはどうした?
そんなのお前だけじゃね?
377 :
NAME IS NULL :2009/06/19(金) 17:54:46 ID:ig7lHck0
最近MySQLを触り始めたばかりの初心者です。 mysqlimportを使ってDBのバックアップとデータ移行を行いたいと思います。 マニュアルによればタブ区切りテキストを読み込むことができるそうですが、 このmysqlimportで読み込める形式を出力するには、どのような方法が簡単でしょうか? とりあえず、自分が試したのは以下の通りです。 (1) mysqldump --no-data でテーブル構造をテキストに出力 (2) テーブル構造を移行先DBに読み込ませる (3) mysql -D database_name -B -N -e 'SELECT * FROM table_name;' でTSVテキストを出力 (4) mysqlimportでTSVを読み込み しかしこの方法では、 (4)の際に一部レコード(1万件以上)がスキップされるなど、上手くいきませんでした。 なお、元のDBはMySQL3.23、移行先のDBは5.0です。
379 :
377 :2009/06/19(金) 20:20:43 ID:???
最初はmysqldumpでクエリ生成しようかと思ったんですが、
文字化けやら文法エラーに悩まされ、他の方法でもいけるかな?と。
>>378 ではどんな方法が良いでしょうか。
MySQL Migration Toolkitはどうだろう
>>377 dump時に出力後の文字コードを指定できる。
そのdumpした物をそのまま新しいDBに入れればいいだけ。
文字コードがおかしいから文法エラーになってるものだと思われるので
文字コードが正しければ解決。
>380 こんなものがあるんですね。GUIっぽいですが。 使えそうか調べてみます。 >381 --default-character-set ですか? dumpするときに色々試してみたんですが、何度やっても出来なくて、諦めちゃってました。
非力なポストグレが終わりそうなのでmysqlへ移行を考えています。 SQL文の違いはあまりなくすぐに移行できるでしょうか?
ポスグレ終わりなん? MySQLの勉強が終わったらポスグレを勉強しようと思ってたのに… 移行する時の注意ですが、MySQLもそれなりに個性の強いRDBMSだと思います。 SQL モードやストレージエンジンの違いは注意が必要だと思います。 ドキュメントもそこそこありますし、見通しは良いので、別の RDBMS を 使っていた経験があるなら、そんなに難しい事は無いと思います。
いま面倒みているシステムでPostgreSQLの調子が悪いって話じゃないの? PostgreSQL自体はもうすぐ8.4も出るし、いたって堅調。 SQLの文法はかなり違うからすぐには移行できないよ。
システム移行の話ですか。それなら大変ですね… ストアドとかサブクエリーとかバックアップとか いろいろ悩ましいでしょうね。
どっちかっつーとMySQLが終わるかもしれないって感じだけどな。
終らくるの?
PostgreSQLもMySQLも直ぐに無くなったりはしないと思うが。
390 :
NAME IS NULL :2009/06/20(土) 22:38:09 ID:Uihx1bYm
サーバーPC一台でドライブ別にレプリケーションできないんですか? MYSQLのデータだけを常にCドライブとDドライブに書き込みたい。
↑アホ
394 :
371 :2009/06/23(火) 00:22:31 ID:???
>>372 さん、ありがとうございます!
これでテストしてみようと思います。
order BY RAND()がクソ遅いんだが 他に方法ないんか?
最終的には実測してくれとしか言えないが データを受け取ったプログラム側で調整することも視野に入れてみてはどうか。 ランダムで全レコードの中から1つだけ抽出する…という処理なら、 先にランダムな値を決めておいて、 SELECT * FROM table_name WHERE id = $random_id ; みたいな感じにするとか。
397 :
NAME IS NULL :2009/06/25(木) 12:17:44 ID:Qv13kLE3
MySQLをアクセスできる状態のままdumpすることはできるのでしょうか? サーバを2台用意できないのでレプリケーションはできません 稼働したままバックアップ取るなら最低でもロックをして、 一時的にでもリードできないようにする必要はありますか?
>>397 >MySQLをアクセスできる状態のままdumpすることはできるのでしょうか?
出来るけど、お金を掛けずに整合性を保ってダンプしたいなら
ロックをする必要があります。
お金があるなら InnoDB Hot Backup を使うという手も。
>サーバを2台用意できないのでレプリケーションはできません
レプリケーションはサーバ一台でも出来る筈。
マスターとスレーブでポートを分ければ良いだけじゃない?
>稼働したままバックアップ取るなら最低でもロックをして、
>一時的にでもリードできないようにする必要はありますか?
InnoDB みたいなクラッシュリカバリを備えているストレージ
エンジンならディスクの側でスナップショットを取るという
方法もあります。これは使っている OS やストレージに依ります。
間違えてたらごめんね。
399 :
NAME IS NULL :2009/06/26(金) 11:38:19 ID:6Q9NAgpu
InnoDBしかつかってないシステムなら mysqldump --single-transactionで オンラインバックアップ取れる
最近必要に迫られDBをいじっています。 で、使用しているのはwindows版のmysql4.2です。 現在100万レコードでTELNO char(11)にNORMAL インデックスを張っています。 この中から連続する6桁の数字で終るデータを探すとき (A) TELNO Like '%000000' or TELNO Like '%111111' or 〜略〜 TELNO Like '%999999' (B) REGEXP (000000$|111111$|〜略〜|999999$) (A)の方がかなり早いようなんですが、チューニングが悪いんでしょうか? それとも正規表現は処理速度が遅いんでしょうか?
>>399 こんなのが公表されてんだ、あいつらにとっちゃ好都合なもんだよな。探す媒体を増やすのは分かるが、どうなんかねえ
403 :
NAME IS NULL :2009/06/27(土) 00:58:12 ID:mPR9r3bl
パフォーマンスが悪くなってshow processlistしてみたら 数十秒かかってるLockedなプロセス(INSERT文、UPDATE文)がいくつもあるんですが どのような原因が考えられr、どう対処したらよいでしょうか? なるべくKILLはしたくないです
>>401 インデックスが効くのは完全一致か前方一致検索だけ。
つまり LIKE '000000%' ならインデックスが効くけど
LIKE '%000000' はインデックスが効かない。
末尾6桁だけからなる新しいカラムを追加しよう。
>>403 UPDATE文が効率が悪くなっている可能性がある。
UPDATE文をSELECT文に書き換えてEXPLAINを取ってみる。
405 :
403 :2009/06/27(土) 12:59:01 ID:mPR9r3bl
>>404 EXPLAINしてみました。
UPDATEは単純で対象は1テーブルのいつも同じカラムで
タプルの特定はPRIMARY KEYしか使っていないのですが
急に効率がわるくなることはあるのでしょうか?
ただしレコード数は数千万と大きいです。
>>403 全然つかっていないのに無意味にINDEX張っているとかいう可能性は?
408 :
403 :2009/06/27(土) 17:33:08 ID:mPR9r3bl
インデックスはカラムA B C D Eに対して PRIMARY A B C INDEX1 A D INDEX2 A E という感じで必要で張っています。 考えてみたら、普段はほとんどINSERTしかしてないところを パフォーマンスが落ちる前に大量のUPDATEを開始したので それが原因かもしれません。
409 :
NAME IS NULL :2009/06/28(日) 13:14:47 ID:6HSkCWFH
my.iniでdataのdirを複数記述してみたけどエラーはでませんでした。 でも後に記述した方にしか書き込まれていません。 複数のドライブに並列に書き込ませたいのですがそれはMYSQLだけでできますか?
411 :
NAME IS NULL :2009/06/28(日) 15:37:55 ID:6HSkCWFH
>>410 パーティションしてます。
一つのドライブをCとDに分けても
別々のドライブCとEに指定しても
並列して書き込めませんでした。
エラーが出ないならできるのかと思ったのですが。
412 :
401 :2009/06/29(月) 22:12:20 ID:???
>>404 週末留守にしていたので大変遅れました。
後方一致ってインデックス効かないんですね。
別切り出ししてやってみたいと思います。
>>403 Locked じゃなくて、長時間かかっているクエリが原因
datadirは一つだけど、その中のサブディレクトリを 別のドライブに移動することができるよ
MySQLの本いろいろ見たんですが、解らん事あるのでお知恵をください。 データをインポートする場合です。 csv形式固定長で1レコード毎に改行コードが入る場合はすんなり行くのですが、これ が、未改行の場合のインポートの仕方が解らないのです。 別会社のシステムで吐き出すため、改行入れてくれとも言えず、仕方ないので自前で 改行挿入するプログラムを噛ませて取り込んでいるのですが、そのまま出来ないもの かと思いまして。 こう定義すれば出来るとか、それは出来ないとか教えてもらえれば幸いです。
>>415 レコードの区切り文字が改行コードでない?
じゃあレコードは何で区切られてるの?
だからカラム数で区切られてないんじゃないの?
なんで、だからなのかな。 汎用機からエクスポートされたデータでパディング付きの固定レコード長だったり、 単に LF 以外の文字を改行マークとしている事を改行コードが無いと言ってるだけかもよ。 後者なら LINES TERMINATED BY で済むかもしれないけど、前者なら…
419 :
NAME IS NULL :2009/07/01(水) 10:52:22 ID:nypSdZ/x
唐突にすみません。 MySQLで質問です。 ありがちなLAMP構成でMySQLは4.1.22、MASTER-SLAVEで構成されてます。 PHPからスレーブにSELECT文を投げつけたんですが、あるプロセス一つだけ 消せずに困ってます。 プロセスリストを見ると、件のプロセスはpreparingのまま動いていないようで それ自体をKILLしてもまた新たにプロセスが再開され、またpreparingで止まって しまいます。 この場合、プロセス自体を完全に停止させる方法ってあるんでしょうか?
420 :
NAME IS NULL :2009/07/01(水) 19:37:11 ID:x7PEdshB
MySQLはindexを同時に1つしか使わないと聞いたのですが、たとえば 「where a=? && b=?」 なら index(a,b) でいいと思うのですが、 「where (a=?||b=?)」 といった場合にindexを効率的に付けるにはどのようにしたらよいのでしょうか? index(a), index(b) とするのがいいのでしょうか? よろしくお願いします。
421 :
415 :2009/07/01(水) 23:11:09 ID:???
>>416-418 舌足らずで申し訳ないです。
例えば、以下のような感じです。
項目A char(10)
項目B char(15)
項目C char(05)
項目D char(40)
だとすると
ホスト出力ファイルは全ての項目が固定長で
項目A,項目B,項目C,項目D,項目A,項目B,項目C,項目D,〜略〜項目A,項目B,項目C,項目D[EOF]
コレを自前で
項目A,項目B,項目C,項目D\n
項目A,項目B,項目C,項目D\n
項目A,項目B,項目C,項目D\n
と変換して取り込んでいるんです。
これでイメージつかめますか?
>>420 うまくいけばindex mergeするかもしれないけど
aとbにそれぞれindexつけて
select ... where a = ?
union
select ... where b = ?
とするのはどう。
OracleでもPostgreSQLでもこの手のクエリは苦手
423 :
NAME IS NULL :2009/07/02(木) 18:54:37 ID:R3n1Iv0v
質問です。 MySQLのストアドプロシージャで 下記のようなクエリを実行しようと思っております。 DECLARE _tblName VARCHAR(12); SET _tblName = "testtbl"; SELECT `hoge` INTO @res FROM _tblName WHERE `hogeid` = 1; INSERT INTO `resulttbl`(res) VALUES (@res); このようにした場合、ストアド自体はCREATEされるのですが _tblName自体をテーブルの名前として認識してしまい、 実行時に「_tblNameというテーブルが無い」というエラーで停止します。 SET @tblName = "testtbl"; SELECT `hoge` INTO @res FROM @tblName WHERE `hogeid` = 1; INSERT INTO `resulttbl`(res) VALUES (@res); このようにした場合 「' WHERE `hogeid` = 1; ' の周辺でsyntax error」のエラーが出て ストアド自体がCREATEできません。 要は変数にテーブル名を定義し、それをクエリで使いたいということなのですが 他に何か方法はありますでしょうか?
424 :
NAME IS NULL :2009/07/02(木) 23:59:25 ID:zf5eYLXR
>>422 ありがとうございます。なかなか難しいですね。
unionという手もあるんですね。有難う御座います。試してみます。
425 :
NAME IS NULL :2009/07/03(金) 08:58:52 ID:bnHp31se
>>422 PostgreSQLはbitmap scanが実装されたんでORでも速い。
試してみ。MySQLよりRDBとしてかなり良いぞ。
MySQL4.1-->5.0にして戸惑ったんで質問です。 テーブルaにカラム1〜9があると仮定します。 MySQL4.1では、カラム1〜7のみデータをinport出来ていたのですが、 5.0だとカラム8〜9も追加したカラム1〜9からなるデータでないとinport できませんでした。 仕様変わったんですか? まぁ正確なデータを作成していないのが悪いんですが、ファイル作成 プログラム作り直したりと、かなり不便ですねぇ。
>>426 カラム名を1..7だけ指定してimportすれば済む話じゃね?
>>426 カラム名指定でインポートなんて出来るんですか(知らんかったです
web徘徊してやり方覚えてきます。
レス番、間違った。
>>427 だった、自分にresしてどうするw
キーがユニークキーがひとつのとき、 fld1 char(10) uniqueと書くのと、 primary key(fld1)と書くので 何か性能面等で違いは出ますか?
上でカラム指定インポートの質問したものですが、追加でまた御教示ください。 邪道かもしれませんが、各カラムが日本語名となっております。 上記のインポートの際、 LOAD DATA INFILE "sample.txt" INTO TABLE sample_table (`カラム1`,`カラム2`,〜略〜,`カラム7`) FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; としてもエラーになります。 カラム指定の場合、日本語表記カラムはNGなんでしょうか?
my.cnfでメモリ周りのチューニングを行おうと思ってます。 現在InnoDBのみ利用しています。 この場合key_buffer_sizeの項目はInnoDBでは全く利用していないということで最小値に設定してまってもいいのでしょうか。 他の部分で少しでも利用分を増やしたいと思っています。 よろしくお願いします。
>>432 エラー内容とか、テーブルのカラムのデータ型とか書いた方がいいと思うよ。
「エラーになった」だけじゃ情報不足かと。
>>433 クエリで内部的にMyISAMのテーブルを作ることがある
1MBぐらいは残しておいたほうがいいよ
ある意味どうでもいい事かもしれませんが、ユニークな項目としてauto incrementを使う事ってあるのでしょうか? 個人的にauto incrementは好きではないのですが・・・。
>>436 >auto incrementは好きではない
気持ちはわかる。
勝手に数字をふられるのが嫌なんだろ。
オレも最初はそうだった。
しかし、今では望んで使う。
レコード固有の一意な識別子としては
とても便利だからだ。
理由や理想じゃない。
我慢してちょっと使ってみろ。
明示的に nextval か auto increment か、という話じゃないのけ? 俺はinsertした後に「さっきの値」を取得するという操作がなんとなく 気に入らない。
sequenceも欲しい
>>435 ありがとうございます!
予期せぬときに影響出そうですね。
多少多めに残しておくことにします。
ようじょ
>>434 内容無さ杉ですね、すみません。
以下のようなテストをしてみました。
使用DBはwindows版の5.0.83-community-nt MySQL Community Editionです。
「test_001」dbに、以下のコマンドでテーブルを作成。
CREATE TABLE `test_tbl` (
`基準日` int(8) NOT NULL default '0',
`業営所コード` int(3) NOT NULL default '0',
`営業所名` varchar(10) default NULL,
PRIMARY KEY (`基準日`,`業営所コード`)
) ENGINE=InnoDB DEFAULT CHARSET=sjis;
dドライブ直下に、以下の内容のtest.csv(基準日、営業所コードのみであり、営業所名はないデータで3レコード)を作成。
20080601,101
20080602,102
20080603,101
以下のコマンドにてインポート処理実施
LOAD DATA INFILE 'd:/test.csv' INTO TABLE test_tbl (`基準日`,`営業所コード`)
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';
で以下のエラーが発生。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'' at line 2
という具合です。
MySQLのHPを見るとSQL文は良い様に思えるのですが、どこか間違っているのでしょうか?
>>442 テーブルのカラム名が"業営所コード"になってるのはタイプミス?
CSVインポートのSQLは"営業所コード"になってるみたいだけど。
444 :
443 :2009/07/11(土) 06:49:21 ID:???
>>442 以下のSQLで行けましたよ。ちなみに環境はwindowsの5.0.82。
LOAD DATA INFILE 'D:/test.csv'
INTO TABLE test_tbl
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
(`基準日`,`営業所コード`)
どうタイプミスをしたら業営所になるんだろ(*´д`*)
447 :
442 :2009/07/11(土) 22:54:02 ID:???
大変申し訳ないです、全く気付きませんでした。 月曜会社行ったら確認してみます(大汗
448 :
NAME IS NULL :2009/07/13(月) 12:39:24 ID:5irjkhq8
REPAIR TABLE してる間に更新していいの?
writeロックかかってるから、待たされるだけだろ。
450 :
442 :2009/07/13(月) 22:21:37 ID:???
無事やりたい事が出来ました。
カラム指定って一番最後でないと駄目みたいですね、
>>443 さんありがとう。
あ、カラム名が"業営所コード"って具合になってた原因は、navicat for mysql使ってるんですが、
これでテーブル定義すると結構な確立でなるんですよね。
普段はエディタでゴリゴリ書いちゃうんであまり気にしてませんでした(汗
451 :
NAME IS NULL :2009/07/13(月) 23:54:48 ID:pM3FPDeT
MySQLの文字コードの事なんですが『\(全角のバックスラッシュ)』の表示が正しくできません。 EUCのサイトのフォームからMySQLに入れ、 これをEUCで取り出すと半角の\になってしまいます。 MySQLのデフォルト文字コードはUTF8で、UTF8で取り出しても同様です。 ただコマンドプロンプト上でSJISで取り出した時はちゃんとバックスラッシュになるので、これをEUCでバックスラッシュにできないですか? 入出力時はちゃんとset names ujisは使ってますし、入れるときもエスケープ処理してます。
452 :
NAME IS NULL :2009/07/14(火) 00:43:12 ID:L0cdOLHt
すみません、他愛無い質問なんですが 日記のプログラムを書くとして、画像のアップロードも各日ごとに1つファイルをアップできるとします そのとき、登録情報を入れるテーブルに fileUpload みたいなカラムを作って ファイルのアップがあれば1入れる、みたいにした方が良いでしょうか? 現状はスクリプト側で file_exists($file) みたいにして格納済みファイルのパスを確認してますが、、 汎用性を考えたら専用のカラムに明示した方が良いんでしょうか
>>451-452 ここの住人はプログラムに関してはド素人なので他で聞いた方がいいと思います。
アップロードファイルのテーブルを作って、 日記のID, パスとかにすれば、 1日1ファイルじゃなくても大丈夫だぞ。 そのテーブルに、特定の日記に紐付くレコードがあれば アップロードされたファイルがあるってことになる。
455 :
NAME IS NULL :2009/07/14(火) 10:54:56 ID:L0cdOLHt
>>454 その場合、
日記の本文を登録するテーブルへのinsert処理と
uploadファイルの情報を専用のテーブルに登録する処理をトランザクションで
まとめて実行する、って考えで良いですか?
本文の登録のmysql_insert_id();を途中で取得して、画像情報テーブルに紐付け要素として
入れる感じ?
>>453 マジで?プログラム使わずにMySQLだけだと出来る事が限られない?
>>456 データ出し入れするだけなら初級程度のプログラムで十分ですから。
MySQLが5.1になったらしいからインストールしてみたらイルカの写真が入ってただけだったわ。
459 :
451 :2009/07/14(火) 15:29:51 ID:Luc8mMqT
解決しました。 テーブルのコードをutf8からEUCに変更しただけで\が\にならなくなりました。 つまりクライアント側の文字コードとDBの文字コードは同じにしなければいけないってことだと思うのですが ネット上だと必ずしもDB側のコードと同じコードでPOSTされるわけではないので困ります。 ■以前の流れ■ EUCでPOST→set names ujis→utf8のDBに格納 クエリ(select)→set names ujis→EUCでprint ↑これだと\が\になる(他の文字は問題ない) utf8で保存すると平仮名で検索してカタカナも表示できたり便利だったのですが、やっぱり全てのテーブルをEUCにするのが一番良いのでしょうか? 他に解決方法があれば教えて下さい。
460 :
451 :2009/07/14(火) 16:40:28 ID:???
さらに実験してみました。 UTF8のページでpost → set names utf8 → UTF8のDBに格納 select → set names utf8 → UTF8のページでprint ↑上記においても\が\に変換される事はありませんでした。 文字コードが同じだから当然といえば当然ですが、 SJISとutf8、SJISとujisとの変換も問題ありませんでした。 よってこれはutf8とEUCの間における変換のバグなのでは? バグでないとしても利便性が悪いので改善してほしいです。 この様な要望はどこに出せばいいのでしょうか? 参考までに UTF8のページでpost → set names utf8 → UTF8のDBに格納 select → set names ujis → EUCのページでprint だと\は?になりました。 それ以外の文字は全く問題ありませんので普段DBに\を入れない人は気が付かないのではないですか? 試しに自分のDBに\をぶち込んでみて下さい。 ※使用したDBは5.0と5.1です。
相変わらずバグだらけだなww 遠慮無くポスグレ使えよ
確かにポストグレはバグ少ないよな
なんで PostgreSQL 人気がないのか分からない。 速度も MySQL に勝つくらいになったし、いい本もあるし。
っていうかポストグレだってきっと潜在バグあるだろーか。 mysqlだけが悪いように書くなや。
お金払えばサポートしてくれるよw
わかったからウンコグレ厨は氏ねよ。
>>453 文字コードの話をプログラミングだと思い込むようなド素人はそんなにいないから安心しれ。
これWindowsの話だよね? 俺もさっきやってみたら確かに同じ現象が出たw バグかどうか知らんがユーザーの会のQ&Aにも無い事象だから 今まで誰も気が付かなかったんだろうねw 多分MySQL側がWindowsに配慮して文字コードを変える時にわざわざ\にしてるんだと思うけど。
MYSQL撃沈決定!
470 :
NAME IS NULL :2009/07/14(火) 23:16:59 ID:f5HzR+ae
神様お助けを。。 トップページを表示する際に、mysqlを使用してユーザー情報の「挿入」「更新」 をしているんだけど、アクセス数がふえるとタイムアウトしてしまう。 MySQLのログを調べたところ、 +--------+----------------------+-----------------+-------------+---------+------+----------+-------------------------------------------------------------------------------------------------------------- | Id | User | Host | db | Command | Time | State | Info +--------+----------------------+-----------------+-------------+---------+------+----------+-------------------------------------------------------------------------------------------------------------- | 256912 | ****** | localhost | *********** | Query | 33 | Locked | insert into **** .... | 256913 | ****** | localhost | *********** | Query | 33 | Locked | update ..... のような感じで、どうやらSQL文がロックされていることが原因。 しかし、 $query="LOCK TABLES ほにゃらら WRITE"; mysql_query($query,$dh); とかいう記述で、データベースをロックはしていない。 だれか解決策をお願いします。 神様
↑アホ
リファレンスより > LOCK TABLES は、現在のスレッドに対してベース テーブル (ビュー以外) をロックします。
↑アホ死ね
474 :
NAME IS NULL :2009/07/14(火) 23:33:36 ID:f5HzR+ae
>>471 アホ何でここで聞いてます。
解決策がわかるのなら、教えていただけると非常にうれしい。
>>472 ありがとう。
LOCK TABLES は使用してません。
どなたか分かりやすく教えて下さると非常に助かるm(_ _)m
475 :
NAME IS NULL :2009/07/14(火) 23:34:18 ID:f5HzR+ae
↑氏ねボケ
477 :
NAME IS NULL :2009/07/15(水) 00:02:05 ID:kLERGQuj
>>476 氏んでほしいんですね。
神様お助けを。。
トップページを表示する際に、mysqlを使用してユーザー情報の「挿入」「更新」
をしているんだけど、アクセス数がふえるとタイムアウトしてしまう。
MySQLのログを調べたところ、
+--------+----------------------+-----------------+-------------+---------+------+----------+--------------------------------------------------------------------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+--------+----------------------+-----------------+-------------+---------+------+----------+--------------------------------------------------------------------------------------------------------------
| 256912 | ****** | localhost | *********** | Query | 33 | Locked | insert into **** ....
| 256913 | ****** | localhost | *********** | Query | 33 | Locked | update .....
のような感じで、どうやらSQL文がロックされていることが原因。
しかし、
$query="LOCK TABLES ほにゃらら WRITE";
mysql_query($query,$dh);
とかいう記述で、データベースをロックはしていない。
だれか解決策をお願いします。
神様
連投すいません。
>>477 情報小出しがよくない。
・対象のテーブルについてshow create table XXX\G
・例示しているshow processlist;を省略しないで全部書く
・my.cnfもさらす
話はそれから。
だからポスグレ使えばいいじゃん。こんなクソみたいなDBにいつまでもしがみつくなって。
481 :
NAME IS NULL :2009/07/15(水) 01:10:17 ID:DEAJvIl0
バカ共晒し上げ
>>477 情報があまりにも小出しで憶測でしか回答できないんだけど
要するにユーザーエージェントとかIPアドレスとかリファラを取得してそれをDBに入れたいって事だよね。
この流れの中に著しく遅くなる原因があるとすれば
思い当たるのはIPアドレスからホスト名を得る場合に若干遅くなるので
それが溜まって遅延するのかも。
それにしてもPHPがタイムアウトする程遅いというのは若干異常。
マイクロタイム関数とかでどの処理に時間がかかってるのかを調べた方がいい。
MYSQL側は、一つのスクリプトで不必要にコネクトやクローズ繰り返したりせず
テーブル設計も不必要に大きくせず、不必要なクエリを送ったりしなければ
デフォルトで十分速いので大丈夫。
483 :
NAME IS NULL :2009/07/15(水) 05:41:32 ID:kZc9K5py
>>479 有難うございます。
+--------+----------------------+-----------------+-------------+---------+------+----------+---------------------------------------------------------------------------------------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+--------+----------------------+-----------------+-------------+---------+------+----------+----------------------------------------------------------------------------------------------------------------------------------
| 256912 | ****** | localhost | *********** | Query | 33 | Locked | insert into user (個体識別,初めての時間,最新の時間,UA,訪問履歴,どこから来たか) values ('XXXX','1247543954','1247543954','DoCoMo....','1247543954idx,','5')
| 256913 | ****** | localhost | *********** | Query | 33 | Locked | insert into user (個体識別,初めての時間,最新の時間,UA,訪問履歴,どこから来たか) values ('YYYY','1247543954','1247543954','DoCoMo....','1247543954idx,','5')
| 256914 | ****** | localhost | *********** | Query | 33 | Locked | update user set 最新の時間='1247543954',comedate='1247543914idx,1247543945idx,' where 個体識別'xxxxxxx'
| 256915 | ****** | localhost | *********** | Query | 33 | Locked | update user set 最新の時間='1247543954',comedate='1247543914idx,1247543945idx,' where 個体識別'yyyyyyy'
そのほかは用意できしだい、載せます。
>>482 有難うございます。
>要するにユーザーエージェントとかIPアドレスとかリファラを取得してそれをDBに入れたいって事だよね。
そのとおりです。
携帯サイトなんですけど、ユーザー情報の種類は情報は
・個体識別番号
・機種名(UA)
・初めて訪問したUNIX時間
・最新のindexに訪問したUNIX時間
・訪問履歴、いつどこのページに訪問したか(時間index.php,時間main.php、時間out.php......)
・どこからきたユーザーか
です。ですからトップページへアクセスすると必ず
select->insert
もしくは
select->update
という流れが発生します。
>思い当たるのはIPアドレスからホスト名を得る場合に若干遅くなるので
それが溜まって遅延するのかも。
htacssessでIP制限をかけたうえで、UAでDoCoMoなどは判断しております。
よってIPアドレスからホスト名得るような記述はありません。
>それにしてもPHPがタイムアウトする程遅いというのは若干異常。 マイクロタイム関数とかでどの処理に時間がかかってるのかを調べた方がいい。
自分も異常だと思います。
マイクロタイム関数ではないんですけど、やはりSQL履歴をみると、
多数の処理がロックされてしまっているのが原因のようです。
解決策がわかりません。。。。。
たしかにそこそこアクセスはあるんですけど、
感覚的にタイムアウトしてしまうほどの処理の量はありえないと思うんですが。。。。
・
>>483 insertもupdateも原則爆速なのでselectの方法に問題があるのかも。
PHP側の処理で時間がかかりDBがその間待たされてる可能性もあるのでどっちに原因があるのかは調べた方がいいけど。
485 :
NAME IS NULL :2009/07/15(水) 10:13:38 ID:mKEXFaxl
>>484 selectに関しては、
select 初めての訪問時間,最新の訪問時間,訪問履歴 from user where 個体識別='そのアクセスの個体識別'
というように毎回発行し、
結果行数が一行(訪問したことがある)の場合はupdate,
結果行数が0行(初めての訪問)の場合はinsert
というようにSQL文を発行しています。
SQLクエリ自体がロックされている(待たされている)ので、
SQL文を受ける側、DB側、に問題があるかと思います。
486 :
NAME IS NULL :2009/07/15(水) 10:20:26 ID:mKEXFaxl
補足情報です。 現在テーブル「user」は約2万行のデータが入っております。 しかしインデックスは作成していません。(特に何もしてません) それが原因でしょうか?? ランタイム情報 を見たところ、 Handler_read_rnd_next 1,526 M データファイルの次の行を読み込んだリクエストの数。この値が高いのはテーブルスキャンを大量に実行しているためです。一般にこれはテーブルのインデックスが不適切か、クエリがインデックスを利用するように書かれていないことを意味します と記述があります。 1,526 Mというのは多い方なのでしょうか??
多いね。 このスレのみんなが質問に答える気がなくなるぐらい多いよ!
>>486 Σ(゜д゜;)
はっきり言うと「お前がデータベース触るのはヤメロ」と言いたくなる数字
489 :
NAME IS NULL :2009/07/15(水) 10:43:50 ID:mKEXFaxl
インデックスを作成したところ、あっさりと解決できました。 お騒がせしました、感謝します^^
時期が時期だし米ではMyQL(マイクェル)みたいな新DB立ち上がったりしてないのかね。 正直選択に困る時代になったなあ… ポスグレはレンサバが対応してないことも多いし。
MySQL に ISAM や InnoDB のように PostgreSQL があれば…
>>478 ついでに言っとくと、文字コード指定で、
sjisとujisは使わないほうがいい。
かわりに、cp932とeucjpmsを使うべき。
ちなみに、そうなった原因は、ユニコード
コンソーシアムが非常識だったせい。
MySQL ABはあんまり悪くない。
で、まだMySQLはsun製って事になってるけどいつ頃にOracle製って表記されるようになる予定なの?
>>455 そうだね。トランザクションでやることになると思う。
ただ、日記のIDを通番とかじゃなくて、先にIDがわかる方法(日付/時間ベースで振るとか)なら、
先にuploadファイルの方をINSERTしてから、日記INSERTでも良さそうだけど、
途中でエラーが起こることを考えたら、やっぱりトランザクションにした方がいいと思う。
バカの一つ覚えみたいにトランザクションを連呼する奴多いよな
>>489 ポスグレは賢いからインデックス使わなくても速い
乗り換えるなら今だよ
498 :
NAME IS NULL :2009/07/16(木) 09:54:56 ID:Vmzny5Cb
select * from sampleTBL where (`name1` like '%山田%' or `name2` like '%山田%') and `hobby` like '%野球%' and `loginLevel` = '1' 上記のクエリ文がうまく動きません ・名前(山田)がカラムname1,name2のいずれかに含まれる ・趣味(野球)がカラムhobbyの中に含まれる。「草野球」でもOK ・loginLevelは必ず1 という抽出条件で書いたつもりなんですが… ご意見よろしくお願いします
ポスグレ?ポストグレ?
504 :
NAME IS NULL :2009/07/16(木) 15:42:09 ID:Vmzny5Cb
>>500 ,503
どうもありがとうございます
select * from sampleTBL where (`name1` like '%山田%' or `name2` like '%山田%') and (`hobby` like '%野球%') and `loginLevel` = '1'
としたら正常に動きました
複数条件で使う場合のlike節は()でくくらなきゃだめみたい?です
もうすこし勉強します。ありがとうございました
スレ読んでて疑問に思ったんだが、NECやIBMの拡張文字を導入した際 UJISをバージョンアップするわけではなく eucjpmsとして別に作りUJISを残した理由って何なんだ?
>>505 文字を追加しただけじゃないから。
変換表も一部変更されてるはず。
あのsjis/ujisで満足するやつはいないと
思うが、それでもリリースしたからには
後方互換性が必要なんだろ。
utf8で満足してる私はひよっこですか
ひょっとこ
日本語使うならutf8が一番バグが少ない オススメ
utf8 だと「名前」や「一言メッセージ」に何バイト入れるか、が難しいよね。 euc-jp だといわゆる全角が 2byte だから、800 文字なら 1600byte でよかったけど。 みんなはどうしてるの?
ユーザにバイト数を数えさせるのが間違いなんだと思う EUC-JPには3バイト文字だってあるんだし 今後は全部文字数で。
Twitterも140バイトじゃなくて140文字になってる
varchar
515 :
511 :2009/07/17(金) 13:05:15 ID:???
ありがと。そうですね。文字数ですね。 varchar のバイト指定はどうしているの? text を使うということ?
varcharって文字数指定になってなかったっけ?
varcharも文字数だよ。MySQL4.1以降。
そうだったのか!ありがとうございます。
少し余裕あるくらいのバイト数にしてる<varchar
utf8は1文字あたり3バイト必要。 また、いずれ4バイトに修正される予定。
Windowsのエクスプローラで、MySQLを止めずにdatadirのファイルを全部別のドライブにコピーしたいんだけど コピー中もDBが更新されてても、コピー完了時に双方のファイルは完全に一致する?
>>521 だめ
一致しないどころかコピー先のDBは壊れてるぞ
聞かなきゃわからんことか?
まあ確かに
MySQLのパスワードを忘れた時はもう一度インストールしなおせばいいんだよね?
mysqlデータベースが残ったままだとインストールしなおしてもだめ skip-grant-tablesでぐぐれ
527 :
NAME IS NULL :2009/07/18(土) 11:33:43 ID:kUbe0jQy
教えてください。 SELECT * FROM table where column1 = '$a' AND column2 = '$b' PHPで検索する時に$bに文字が入っていたらcolumn1とcolumn2から探し 入っていなければcolumn1だけから探したいのですが ANDじゃなくORだと検索結果が変わってしまいます。 かといってselectの文を$bが入っている時用といない時用で2つも書くのもごちゃごちゃするので 一行で書く方法って無いですか?
>>527 何もクエリ全体を二つ書く必要はないだろ。
WHERE句のAND条件の部分だけ、PHPのIF文か何かで判断して
追加させるかどうか分岐させればいい話。
... AND (column2 = '$b' OR '$b' IS NULL)
引数bが空文字だったらどうする気なの?
なに言ってんの? それは空文字を探すという意味だろう?
それだと
>>527 の要件を満たさないだろ。
そもそもウェブアプリなら、プログラム側で何かしない限り、
入力がNULLという事はあり得ないのでは?
すみません, mysqlでlike検索してるんですが, 時間がかかりすぎて困ってます. CPU使用率を見たらIdle Processが90%以上あるのに mysqldの使用率は5%未満... もっとCPU使えばいいのにと思うのですが, これはFileIOで時間食ってるだけで 検索自体はもう早くならない感じでしょうか?
mysqlのデータファイルがあるドライブがCRCエラーなんだけど、少したりとももう救えないのかな(。・_・。) マメにバックアップとっとくんだった…
>>533 1つのSQLはどんなにがんばってもCPUコア1個しか使わないぞ
536 :
533 :2009/07/19(日) 04:37:04 ID:???
>>536 InnoDBならinnodb_buffer_pool_sizeも見直さないとダメだぞ。
そっちは見た?
>537 うぉおおおお ありがとうございます 256M->512MB ですごい高速化がされました 各種修正魔に比べてメモリ倍くらい食ってるけど これでいってみます.
すごいエスパーだ
540 :
NAME IS NULL :2009/07/21(火) 15:42:38 ID:yYCdTavm
MySQL の動いていたサーバをバックアップしたとき, ダンプじゃなくて /var/lib/mysql (MyISAMとかInnoDBのファイルがここに) をそのまま(ただし MySQL は停止した状態)コピー しておいたんだけど,これって再び MySQL に食べさせないと 中身を取り出すことできませんか? ファイルから直接 mysqldump で SQL 取り出したい・・・
>>540 無理。
でもオープンソースだから
自分でそういうツールを作るというならとめない
それ一回食べさせて吐かせてもう一回元のやつ食べさせればいいだけじゃん
543 :
NAME IS NULL :2009/07/23(木) 01:38:42 ID:t2nNTgSy
そのプログラム、1000万くらいでつくってもいいけど
俺なら200万で作ってやる
545 :
NAME IS NULL :2009/07/23(木) 04:31:08 ID:/6vymUJv
データベースの設計で便利でフリーなツール教えてくれませんか? テーブルが増えていくとややこしくなるので^^;
OOo Base
最近、DB始めました。よろしくです^^ とりあえず、マニュアルは5.1の読めばおkですかね?
マニュアルとか必要ないんじゃないかな?sel,up,ins,delの基本だけ使って、あとは随時やりたいことがあった時にググレばいいんでない?
一行当たり100〜5000文字(平均1000文字)の文字列が入ったフィールドに対して Like '%文字列%' の部分一致検索を行う必要があるのですが、 これが750万行あるため、実用に耐えうるスピードで処理できません。 なんとか高速化を図りたいのですが、どういうところに手を入れたらいいと思いますでしょうか? どうかお願いします。
検索エンジンを使った方がいいのでは
554 :
552 :2009/07/27(月) 11:29:47 ID:???
>>553 検索エンジンですか?
WEBサイトではなく、MySqlのフィールドを検索エンジンに食わせることってできるのでしょうか?
できるのであれば、参考になるサイトなど教えていただけませんでしょうか。
とりあえずレスポンスをいただけるまでは自分で探してみます。
手法としてデータベースを使うのではなくて、検索エンジンを使ったらということです。
557 :
552 :2009/07/27(月) 13:01:52 ID:???
>>555 なんどもどうもです。
いまいち把握できていないのです・・・
おっしゃっているのは、750万ファイルのページファイルを作成し、
Googleなどに読み込ませ、
キーワード site:hostname
で検索して結果を得よということでしょうか?
秘密文書が多いので、できればクローズに検索を行いたいのですが、
それは可能なのでしょうか?
また、質問ばかりで申し訳ないのですが、
Tritonnはどうなのでしょうか?
先ほど検索して見つけたばかりなのですが、
悪いうわさがないのならば一度試してみようと思います。
Tritonnのような全文検索用ソフトウェアを使うのが
>>553 のいう「検索エンジンを使う」ってことですよ
559 :
552 :2009/07/27(月) 14:35:27 ID:???
>553、555、556、558 ちぐはぐな掛け合いに合ってしまい申し訳ありません。 (556は見落としてました、すみません) 皆さんありがとうございます。 提示していただいたように「検索エンジン」を用いて実装してみます。
560 :
NAME IS NULL :2009/07/28(火) 01:43:08 ID:E3dl42nt
ある1つのテーブル内のデータをmysqldumpでダンプして DROP TABLE文とCREATE TABLE文を消して INSERT文以下のデータを、同じ定義のテーブルに入れたいのですが このテーブルにはすでにデータが入っています。 キーが重複しているレコードを無視して重複していないレコードだけを 入れる簡単な方法はありますか?
ggrる内容じゃねーか。常夏野郎が
asp経由で日本語文字列入れようとしたらエラーが出たんだが、MySQLって日本語使えないの?
>>563 残念ながらエラー文は英語だけなんだ。がんばって解読してくれ!
>>563 今日は良いことがあったから、今日だけ俺が訳してやるよ。
なんてエラー?
文字コードがおかしいとか
568 :
NAME IS NULL :2009/07/29(水) 23:17:15 ID:GbEs/oP6
一度に大量に削除する時ってロックかかるから テンポラリテーブル使って少しずつ削除したりする?
どっちにしろ、一度で消すか条件を絞って複数回に分けるかしかないと思うが? テンポラリテーブルを使うって、どうやろうとしてるの?
削除でテンポラリは利用したことないな
実行が若干重い検索結果にjoinしていくつかのテーブルを削除するから テンポラリにいったんidを入れてjoinに使おうと思ったの 言われてみれば、テンポラリテーブルの利用は本質的な問題じゃなかった やっぱり段階的に削除していくしかないすなー
お知恵をお貸しください。 レンタルサーバー(さくらインターネット)上の、MySQL4.0を使った容量3GBのデータベースを バックアップしたいのですが、 mysqldump-4.0 でバックアップしようとすると、 mysqldump-4.0: Out of memory (Needed 3151304 bytes) mysqldump-4.0: Got error: 2008: MySQL client run out of memory when retrieving data from server とメモリ不足のエラーが出て途中までしかバックアップできません。 mysqldump だとエラー(Error: You have an error in your SQL syntax.)は出るものの、 一応最後までバックアップ出来るようですが、mysql、mysql-4.0 のどちらも、 ERROR 1193 at line 18: Unknown system variable 'character_set_client' とエラーが出て、リストアできません。 MySQL4.0と5.0のバージョンが違うことが原因ではないかと思うのですが、 なにかバックアップとリストアをする方法はないでしょうか? よろしくお願いします。
読んで書き込むみたいなかんたんなバッチ作ってみれば?
574 :
NAME IS NULL :2009/07/31(金) 01:30:44 ID:hLmzxvAT
はじめまして。質問です。 MySQLの5.0.58を使用しています。 SQLを組んでいて、知り合いから「SUMで集計するときはWHERE句の条件で必ずGROUP BYしたほうがいい。」と言われました。 理由を聞いたのですが、「お約束だから」とはぐらかされました。 (WHEREで絞り込んでいるのだから、GROUP BYの追加は無駄な構文解析が発生するだけだと思ったのですが、。) 例えば、 SELECT SUM(money) FROM receipt WHERE id = 1 ; というSQLがある場合、 SELECT SUM(money) FROM receipt WHERE id = 1 GROUP BY id ; というように、GROUP BY を追加したほうがいいというのです。 根拠となるようなものを探したのですが見つかりませんでした、。 どなたか理由を教えて下さい。
根拠が見つからないのは根拠がないからだなー
>>574 sumって、group byがなくても使えることを初めて知った。
ありがとう。
べつにグループ集計いらなければ必要ないでしょ。
578 :
574 :2009/07/31(金) 12:15:53 ID:???
あらためて聞いてみたところ、 「昔ORACLEで、SUMを使う際にGROUP BYを指定しないとエラーになった。」 ということでした。 不要だと説明して追加しないことにしました。
Oracleでもいらないよ SQL> select sum(sal) from emp where deptno = 10; SUM(SAL) ---------- 8750
580 :
NAME IS NULL :2009/07/31(金) 21:58:52 ID:GDYMXdu6
table1とtable2に共通のカラムUSERIDがあるのですが、 left joinで結合させようとすると同じ名前のカラムが2つあるとエラーが出てしまいます。 table1.USERIDとtable2.USERIDじゃだめなのでしょうか? どうすればいいのでしょうか?
select句にもtable1.USERIDと書く
582 :
NAME IS NULL :2009/07/31(金) 23:12:11 ID:GDYMXdu6
*じゃだめなんですか?
そりゃダメだろうw
ん?なんで*じゃだめなんだ?
型が違うって事はないよねえ
586 :
NAME IS NULL :2009/08/01(土) 08:15:23 ID:mT+dvTBE
>>585 それはないです
リレーションシップとかやらないといけないんでしょうか?
毎度毎度、エスパー募集かよ。 投げたクエリとエラーメッセージくらい書けば?
初質です。 会社のDBなのですが、現在、Accessで25人が同時に使用している現状です。 重い、データが壊れる、エラーが出る、接続できなくなるなど様々な弊害が出ています。 そもそも、Accessを多人数用途で使用していること自体が問題なのですが、 今後を考えるとAccessでの運用は厳しい状況です。 そのDBについてのおもりを個人使用のAccessなら心得がある自分が引き受けている状態です。 質問したいのは以下の点です。 ・MySQLは導入にコストがどのくらいかかるか。 会社内使用ならCommunity Licenseで構わないようですがそれで大丈夫でしょうか。 また、サーバーを必ず置く必要があるか、将来、有料になってしまうのかなど。 ・Access個人使用ならVBAを組める程度のレベルの私が 一からMySQLを始めて、すぐに実用レベルで対応できるようになるでしょうか。 よろしくお願いいたします。
>>589 お前がバカなのは理解してあげたので、消えろ
一点目 コストってのがよくわからないが,DBの金額という意味なら0円 時間的コストという意味ならそう時間かからん Access->mysql環境移行のサイトなんか結構ある サーバが必要かどうかというのも何とも言えない, 現在どういう方法で運用されているのかもよくわからなければ それを変えたいのか維持したいのかも分かんない. 運用にサーバがいるかどうかじゃなくて,運用にあった設置をすべき で,将来有料になるかについてはMySQLのGPLしらべてみ (1点目の中に質問いくつあるねん...) 二点目 条件があいまいでで論点もあやふや, まぁできんじゃね?としか返せない
>>590 かまってちゃん乙
いちいち出てこなくていいから精神科でボダの診断もらって来い
きっといやなことがあったんだろうね。 だけど、他人に当たり散らすのはよくないね。
いつものことじゃないか
595 :
589 :2009/08/01(土) 21:20:27 ID:???
>>591 回答ありがとうございました。
不明瞭な質問で申し訳ありませんでした。
それにもかかわらず、大まかな方針を頂けました。
ありがとうございます。いろいろと調べてみます。
596 :
NAME IS NULL :2009/08/02(日) 00:13:49 ID:Q4MhiB1r
コミュニティ版は実験版。 よって、リスク覚悟で。
コネクタのドライバってダウンロードするときメールとか入力しないといけないっぽいけど 再配布不可能なの?
598 :
NAME IS NULL :2009/08/02(日) 09:56:00 ID:JR4H8zPC
aspでnbtstatをして帰ってきた結果をMySQLにぶちこもうとしているんですが、 直接ぶちこもうとすると漢字混じりのものは文字コードの違いからエラーになります。 デフォルトutf-8のままutf-8でない文字列をMySQLに保存するにはどうしたらいいでしょうか?
MySQLは列ごとにキャラクタセットを変えられる mysql> create table test (id int primary key, -> data1 varchar(100) character set utf8, -> data2 varchar(100) character set cp932, -> data3 varchar(100) character set eucjpms);
600 :
NAME IS NULL :2009/08/02(日) 10:27:53 ID:JR4H8zPC
なんと! ありがとうございました
601 :
NAME IS NULL :2009/08/02(日) 19:54:52 ID:jeLofuXy
table1(元データ),table2(フラグ定義),table3(table1の各項目にフラグをぶら下げる)があって、 table1の一部の項目にフラグがついた状態になっています。 これを結合して、フラグの有無にかかわらず全項目を表にしたいと考えています。 select (略) from table1 left join (table2 inner join table3 on table2.id=table3.id) on table1.flag=table3.flag; とすると、フラグがNULLのものが表に出てきません。 どうしたらいいでしょうか?
602 :
NAME IS NULL :2009/08/02(日) 20:48:28 ID:J20WEjYY
テーブル名とかフィールド名って、何文字くらいを上限にしてますか?
mysqlの設定中に手詰まりしたので助けてくれ 状況:WindowsからMysqlAdministratorを使用してログインしようとしたらエラー Mysql Error Number 2003(Can't Connect to MySQL server on 'IPアドレス' サーバー OS:Centos5(x64) Xenにて仮想化 Domein FILESERVER DATABASE WEB Enforceは全てDISABLEDにしてある ローカルからデータベースへの接続は可能なんだがリモートでの接続がエラーが 出て上手くいかない ぐぐってみたら /etc/my.conf の bind-addressが127.0.0.1 をコメントアウトしろとか書いてあるが… うちの設定にはそもそも無かったw あと考えられる部分って何だろう? 数日悩んでいて多分単純な事に気づいていないだけだと思うんだが
604 :
NAME IS NULL :2009/08/03(月) 17:58:37 ID:77U0plNm
考えられること:お前がバカだということ
SELinux iptables ping mysqladmin ping
>>603 接続に使用しようとしているMYSQLユーザのホストはどうなってる?
localhostや127.0.0.1だったら繋がらない。
MySQLの日付型はyyyy-mm-dd hh:nn:ss形式のようですが、 面倒な変換なしにyyyy/mm/ss hh:nn:ss型を使えないでしょうか?
>>607 そのまま格納は無理だろう。
表示はdate_format使え。
>>607 update や insert で更新する値としてなら使える。
select で取り出す値は date_format() でも使わないと無理。
610 :
603 :2009/08/04(火) 08:44:28 ID:???
>>604-606 アドバイスサンクス!
その辺りの事を全て確認してみたがダメだった
原因の切り分けが出来ないから一度仮想化せずに設定して問題なければ
仮想化してチャレンジしてみるよ
612 :
603 :2009/08/04(火) 12:36:22 ID:???
>>611 それも当然確認したw
馬鹿で間違いないw
613 :
NAME IS NULL :2009/08/04(火) 20:05:58 ID:CvqNEHZq
mysqladminで文字コードをutf8からsjisに変えたのに、 status;をみると何種類もあるうちの1つしかsjisになっておらず、残りはutf8のまま。 全部変えたいときはどこいじればいいの?
またまたかまってちゃん登場
616 :
NAME IS NULL :2009/08/05(水) 00:36:41 ID:dQ/gDRRx
3.28くらいから5.0にmyisamのファイルをバイナリレベルのコピーで持ってきたんだけど、 varcharの解釈がバイトレベルから文字数レベルになったから、 そのままだと途中で切れちゃう。 そこで一旦3.28側でvarcharを2倍にしてから持ってきたら問題なかった。 一応これで動いてるけど、本当に問題ないのかな?
617 :
NAME IS NULL :2009/08/05(水) 04:06:22 ID:AIBVsZem
素直にダンプ&ロードした方がすっきりするが・・
618 :
NAME IS NULL :2009/08/05(水) 21:15:27 ID:9eWVh/Lf
select * from user WHERE id = $user この時$userに1jとか入れてもid1を抽出してくるのなぜですか?
仕様に決まってんだろカス
複素数入力しても整数に暗黙のキャストされるんだよ。 MySQLの開発者は電気系な。
621 :
NAME IS NULL :2009/08/06(木) 00:11:24 ID:4Rgx9kKE
MySQL WorkbenchでER図書いているんだけど、 ひょっとしてテーブル作った後に、テーブルのスキーマ変更できない・・・?
622 :
NAME IS NULL :2009/08/06(木) 18:48:04 ID:XYQGPPAG
できるわけねーだろボケ
いやできるだろ ALTER TABLE で. 内部的には全部作り直しているみたいだけど.
全文検索を早くしたいと思って、上で出ていたTritonn(windows版)を導入したんですが、ちょっと動作的な質問です。 TelNo varchar(11) fulltext index using ngram, normalize (TelNo) の中に、以下のようなデータがはいってたとします。 0123-45-6789 1234-56-7890 234-567-7890 1234567890 0123-556789 これを select count(*) from sample where match(TelNo) against("7890"); とすると 1234-56-7890 234-567-7890 は抽出するけど 1234567890 は非抽出なんです。 ちなみに fulltext index using ngram,no normalize (TelNo) とすれば抽出するようです。 正規化機能って数字羅列は無理なんですか?
625 :
621 :2009/08/06(木) 23:04:39 ID:4Rgx9kKE
>>622 >>623 すまん、テーブル作った後にという表現が悪かった。
既に複数のテーブルを定義してあるんだけど、
ER図の上での定義としてスキーマを変更したいんだけど
やり方が分からない。
ERWinとかERStudioならテーブルのプロパティに、スキーマの
定義があって変更すれば済む。
ちなみに1テーブルづつなら、コピーしたテーブルをスキーマタブに
ペーストする事で実現できたんだけど、本来は複数テーブルと
それに紐づくリレーションをまとめてスキーマ移動したいのです。
Windows2003環境で OSからメモリ不足エラー(Got Error 12)が頻発するんだけど、 設定ファイルのどの項目のメモリ量減らせば解決できますか? ただ、タスクマネージャ見ても搭載メモリの半分も使ってないのに このエラーが出るので何かほかのところが間違っている気もするんですが... どなたかわかる方教えてください。
具体的におこなった操作とエラーの内容を書け
629 :
627 :2009/08/07(金) 18:39:51 ID:???
>628
そうだよな、すまない
基本的にInsertとSelectしかしてないです。
大きめのテキストファイルを解析して投げているので、
Insertはものによっては100kb以上なってると思う。
登録されているデータは12GBほど@Mysql\dataフォルダの容量なのでアバウト
登録データが増えるほど頻発するようになった。
表示されたエラーは(たぶんSelect発行時)
「Got error 12 from storage engine」
これが出るとサービス再起動しか復帰できない...
設定はVineとかに入ってる設定サンプルを参考に文字コードとかかを変更したもの
ttp://vine-linux.ddo.jp/linux/sql/mycnf.php こういうの
メモリは2G積んでるから
初めはhugeでやってたけどmediumでも同じ症状が出るから
今はsmallでなんとか安定してうごいてる。
MySQLのバージョンは5.0とすこし古めです
うざくて読む気がしない
631 :
624 :2009/08/07(金) 22:02:24 ID:???
>>626 ありがとうございました。
やりたい事ができました。
>>629 2GBじゃ足りないってことだろう。つーかselectでコケてるのわかってんなら
クエリかインデックスを見直すべきじゃないかなぁ。
>>629 たぶん、mysqld が必要とするメモリを確保できない。
my.cnf のパラメータみなおして、メモリ使用量少なめになるように調整してみては?
634 :
633 :2009/08/07(金) 23:16:04 ID:???
>>629 ああ、small で安定してるのか。ゴミレスごめん。
ごみレスは629
636 :
NAME IS NULL :2009/08/10(月) 00:55:17 ID:WJlH4sRX
運用中のdbのカラム変更ってどういう手順でしてますか? 外部から接続してこないようにポート塞いでから変更→ポート開けるとか?
637 :
NAME IS NULL :2009/08/10(月) 12:30:26 ID:xYYENRj3
Handler_read_rnd_nextが赤文字になるのは仕様? リセットかけても直ぐに赤文字になるんだけど。。
638 :
NAME IS NULL :2009/08/10(月) 17:51:56 ID:umkbwiYM
しようがない
質問です。 2つのテーブルを比較して、指定したカラムのデータが完全に一致することを チェックするには、どうするのがいいでしょうか。
2つのテーブルを比較して、指定したカラムのデータが完全に一致することをチェックすればいいんじゃないかな
うん、そうだね
642 :
NAME IS NULL :2009/08/14(金) 23:19:48 ID:QWmtJHHL
MySQLで複数テーブルを一気にcreate tableしたいのですが マクロとかありますか?
>>642 同じ構造のテーブルをたくさん作りたいのかな。
シェルスクリプトでもperlでもVBAでもいいので、自分で書いちゃダメ?
>>643 システムの初期導入設定時に複数のcrate tableのSQLを一括で
実行してDB本番環境をすばやく構築したいのです。
一個一個のテーブルを手でcreate tableするのは出来ますが
テーブル数が多いのでマクロかなんかで一括で実行出来たら良いなと。
個々のcreate tableのsqlファイルは既にあります。
OracleだとPL/SQLとかでやってると思いますがMySQLではどうしてるのかなと。
645 :
644 :2009/08/15(土) 00:20:46 ID:???
>>644 ファイルがあるのなら、
cat *.sql | mysql
でいいんじゃね?
と思ったら、解決したのか。
サーバAにmysqlが入っていて、サーバBから接続したい場合は どれをインスコするの? サーバB自体にはDBを持たず、接続するだけの場合。 例) mysql testdb -h サーバA -u test -p < test.sql > out.txt MySQL-client-communityだけ? MySQL-develも必要?
mysqlコマンド使うだけならclientのみ。 PerlとかCから繋ぐならsharedも必要、 繋ぐものをソースからビルドするならdevelも必要
649 :
NAME IS NULL :2009/08/19(水) 03:47:47 ID:dChAbBgf
MYIファイルが肥大化してきたので整理しようと思うのですが 行を削除した段階ではMYIファイルは縮まないですよね? 削除後MYIファイルを縮めるには、myisqmchkでsort-indexするでOKですか? あるいは他に方法があれば教えてください
optimize tableでもできたはず
651 :
647 :2009/08/19(水) 13:00:14 ID:???
652 :
NAME IS NULL :2009/08/19(水) 13:00:53 ID:7XUHkeqC
質問です、長くなりますがお願いします。 スケジューラをphp5とmysql5で作っています。関連するテーブルは2つあって、 【sche_info_tb 基本的な情報用】 id, day, eventName 【sche_player_tb 各イベントの参加者用、evIdはsche_info_tbのidです】 id, evId, player こんな感じです。(それぞれもっとカラムありますが省略してます。参加者は不定数なので、テーブル分離必須?です) これで、スケジュール一覧のカレンダーを作るときどうやってクエリしたら良いのか迷っています。 カレンダーの構成要素は開催日(sche_info_tb.day)、イベント名(sche_info_tb.eventName)、 参加者名(sche_player_tb.player)です。 自分の考えでは、 1)SELECT * FROM `sche_info_tb` を実行 2)返ってきた結果に対してforeachをまわして一つずつidを取得 3)それをつかって SELECT * FROM `sche_player_tb` WHERE `evId`=$id を実行 という感じです。 しかし、これじゃクエリの実行回数が多過ぎる気がします。ひと月30日として、30回。 1日に複数イベント登録したらもっと増えます。 何か、賢いやり方ないでしょうか? スケジューラアプリはいろんなサイトにありますが、全部こんなやり方してるんでしょうか? これが普通ですか? 初心者なりに考えて作ってるつもりですが、不出来なところがあれば教えていただけると幸いです。 よろしくお願いします。
テーブルのJOINをしたことありませんか? select i.day, i.eventName, p.player from sche_info_tb i, sche_player_tb p where i.id = p.evId and i.day between '2009-08-01' and '2009-08-31' ;
オレはLEFT JOINを多用しているけど、知人はINNER JOINを多用していると言われた。 INNER JOINのほうが使いやすいのかな・・・ もちろん状況にもよるだろうけど。
655 :
NAME IS NULL :2009/08/19(水) 16:03:34 ID:7XUHkeqC
>>653 ,654
うわー、すごい!
聴いたことはあったんですが理解できなくて手を付けていませんでした。>JOIN
こういう状況で使うんですね。 自分でもう一度確認し直します、ありがとうございました!
ほんとにJOINしたことなかったんだw がんばってください
>>654 オレは、LEFT OUTER JOINばっかり。
それだけといっても過言ではない。
INNERとかCROSSとかいろいろあるけど、
使うべきケースがまったくわかんね。orz
JOINとかサブクエリーとか覚えると世界が広がるからガンガレ
659 :
NAME IS NULL :2009/08/19(水) 20:57:38 ID:fdU1p2ON
ストアドプロシージャでのエラー処理で教えてください。 プロシージャ内で、 insert into hoge (id, name) values(_id, _name); といったクエリを発行し、データを登録しています。 このときに、insertの結果(正否)を取得するにはどうしたらいいでしょうか? sybaseとかだと、@@sql_statusとかで直前のクエリのステータスを取得できたと思います。 mysqlの場合はどのようにしたらいいでしょう。 5.0.45-log MYISAM です。よろしくお願いします。
660 :
652 :2009/08/20(木) 20:15:50 ID:W0DXzN4C
>>653 さんのクエリでjoinを教えてもらってお世話になったものです。
自分で、
select t1.*, t2.* from table1 t1, table2 t2 where~~
としてクエリを実行したところ、返り値の中にidが2つある状態になりました
echo $rs[0]['id']とやると、一つ目のidを出力します。
明示的に「一つ目の重複カラムを表示する」あるいは、
クエリ発行時に出力対象から特定のカラムを除外する方法はないでしょうか?
すみませんがアドバイスお願いします。
>>658 サブクエリ教えてくれてありがとうございました
これは便利ですね!
アスタリスクで書いたらそうなるね。 手抜きしないで select t1.id, t1.hoge, t1.fuga, t2.foo, t2.bar と必要な列だけ書きましょう。 ちなみにうちの会社では「select *」はコーディング規約で禁止されてます。
662 :
652 :2009/08/20(木) 20:56:57 ID:???
>>661 それしかないんですか…
全部で50個くらいカラムがあるんだけどそれでも個別に書いてくってことですよね?
大変だなぁ。。
とりあえずそうします、ありがとうございました。
663 :
NAME IS NULL :2009/08/20(木) 20:57:29 ID:oS//lB2K
>>659 どうも調べてみたら、declare handlerで例外処理をキャッチで着るみたいね。
これでインサートエラーをトラップできそう。
664 :
NAME IS NULL :2009/08/20(木) 21:00:12 ID:oS//lB2K
>>662 そんなもん、クラス化(ライブラリか)しておいたらいいでしょう。
また、最初の一発目も、desc テーブル名とかでカラムリストとって、
整形すればさほど難しくはない。
なにより、*で手抜きだけはするなと言うこと。それをやったら許さんぞ。
665 :
652 :2009/08/20(木) 21:10:59 ID:???
>>664 クラス化っていうのはphpとかのプログラム側で関数化するってことですよね?(mysqlの用語ではなくて)
>最初の一発目も、desc テーブル名とかでカラムリストとって
ってなんですか?
クラス内のクエリ文を手作業で、t1.col1,t1.col2,t1.col3,t1.col4,…って書いていく時に、
テーブル構造を出力して見ながらやろうっていう事ですよね?
>>665 見ながらやるんじゃなくて、テーブル構造をコピペしてテキストエディタかなんかでマクロを使うか、
sed等で置換するかして機械的な処理で整形してください。
という意味です。がんばってね。ここで手を抜かないことが大事だよ。
667 :
652 :2009/08/20(木) 21:58:17 ID:???
>>666 あー、なるほど! よくわかりました、ありがとう!
あちゃー オレも面倒なときはつい * を使ってしまうわw * と 個別にカラムを指定するのって速度的に違いはあるのかな? 感覚的に * のほうが処理速度は速そうだけど・・・。
select対象列がすべてインデックスの中に入っていると、 テーブルアクセスをスキップできるのでとても速い。 select *してしまうと実テーブルを読まざるを得ない。 カバーリングインデックスというテクニックです
>>669 へえー、そう言う事情があるんですか
今試してみたら両方のやり方で速度の差なかったけど、何十万件になると違いが出るんでしょうか。。
どうもありがとう
テーブルがメモリに入りきらなくなるあたりから差が出るよ
MySQL 5.1 にて CREATE TABLE `word_count` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `word` varchar(12) NOT NULL, `count` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `word` (`word`) ) と言うテーブルで、 select * from word_count where instr('ここに文章が入ります',word); を実行すると、key が使われなくて速度が出ません。 もっと効率よくできる書き方はありませんか?
>>673 全文検索とは逆のことがしたいのですよ。
instr('words',word) を早くしたいのです。
全部見るしかないからむりじゃね
TRIEとか使えないの?
質問です MySQL5.4の機能であるBKAを使用したのだが 併せてsennaの日本語全文検索機能も使いたいと思っています。 5.4にはsennnaのパッチが当てられないので困っていますが 対応方法ほか良い案などありますでしょうか。 現在はTorittonの5.0,67を使ってますが外部結合が遅い・・・
679 :
NAME IS NULL :2009/08/29(土) 19:06:41 ID:odCioAfi
MySQL Clusterって使ってる人いる? これってDB鯖を複数立ち上げて外側では1つに見せるってものだよね 家で試験するとして 最低3台PCいるかな DB 1号 DB 2号 クラスタ管理 1号
トリガーについて教えてください MySQL 5.1.35 Windows を使って勉強中なんですけど table shouhin_master ←マスターテーブル code int name varchar(20) 〜 delete_flg tinyint table data_tbl ←データテーブル code int data1 〜 外部制約でshouhin_masterからcodeを消した時 data_tblの該当するcodeデータを消すようにはしているのですが。 マスターテーブルのdelete_flg に9を立てた時にトリガーを使って data_tblの該当するcodeのデータを削除する事出来ますか? 出来るとしたら、どういうトリガーを書けば良い?
>>679 パフォーマンス試験じゃなければ、そういう構築例は仮想マシンでやればいいから1台あればいいんじゃね?
>>680 NewとかOldとか使え
begin
if new.delete_flg = 9 then
delete from data_tbl where code = new.code;
end if;
end
684 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 08:59:50 ID:8Tmsiy4Z
テーブルを4つjoinする方法がわかりません。アドバイスお願いします。 eventTbl id/kaijouId/eventName sankashaTbl id/eventId/userId/comment kaijouTbl id/kaijouName userTbl id/userName 条件は以下です。 eventTbl.id = sankashaTbl.eventId eventTbl.kaijouId = kaijouTbl.id sankashaTbl = userTbl.id この状況の時にそれぞれのカラムを全て引き出したいです どう書いたら良いんでしょうか? userTbl以外の3つまでは以下のようにして出来たんですが。。 SELECT eventTbl.eventName, sankashaTbl.comment, kaijouTbl.kaijouName FROM (eventTbl LEFT JOIN sankashaTbl ON eventTbl.id=sankashaTbl.eventId) LEFT JOIN kaijouTbl ON eventTbl.kaijouId=kaijouTbl.id これからさらにどうしたら良いでしょうか? FROM ((eventTbl LEFT JOIN sankashaTbl ON eventTbl.id=sankashaTbl.eventId) LEFT JOIN kaijouTbl ON eventTbl.kaijouId=kaijouTbl.id) LEFT JOIN sanashaTbl ON sankashaTbl.userId=userTbl.id としたらエラーしました
? userTblをJOINしてなきゃ、そりゃエラーになるだろう
686 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 09:47:03 ID:8Tmsiy4Z
どこでJOINしたら良いんでしょうか? 3つまでの解説はよく見かけるんですが、4つ以上は見つけられなくて困ってます
687 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 09:47:43 ID:8Tmsiy4Z
お礼書き忘れた。
>>685 ありがとうございます
どこでも何も、そのまま続けて書けばいい。 FROM 〜 JOIN 〜 JOIN 〜 JOIN 〜 解説以前に、まずはマニュアル読むべき。
689 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 13:14:43 ID:8Tmsiy4Z
>>688 ありがとうございます
ずっとマニュアルは読んでるんですが、どうも理解できなくて。。
すみません、教えてください お願いします
690 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 13:46:04 ID:LriVeEv0
phpからmysqlのテーブルに格納されている文字列をmysql_fetch_rowだとかmysql_fetch_assocだとかで読み出したときに、 「ソースの表示」をやってみると 「NULL文字を含むファイルです。半角スペースに変換してから表示します」 ってなって読みだした文字列の後に大量の半角スぺース(きっと元はNULL文字)が含まれているのが確認できるんですけど、 コレを無くすにはどうすればいいですかね。 AJAXで読み込んだときにNULL文字以下が表示されんくなってしまって困ってます。 誰か心当たりあったら解決策お願いします。
691 :
690 :2009/08/30(日) 14:56:51 ID:LriVeEv0
コレってむしろphp側の問題ですねorz スレ違いでした。 phpのスレで訊いてきます。
これが新手のマルチ投稿か
ランタイム情報の Slave_runningの値「ON」か「OFF」をmysqlで求めるには、 どのようなクエリを渡せばいいのでしょうか?
show status like 'Slave_running'; を、それぞれのプログラミング言語で select文と同じように実行すれば取れるよ。
695 :
693 :2009/08/31(月) 22:39:04 ID:???
>>694 あ、ありがとうございます。
とりあえずphpからクエリを投げてみることにします。
phpmyadminばっかり使ってるとダメですね・・。
相談です。 16桁の数字からなる商品番号を格納するカラムのデータ型は何がいいでしょうか? (1) BIGINT型で、16桁の整数として格納する (2) CHAR(16)型で、16個の文字からなる文字列として格納する (1)と(2)と、どちらが検索が速いでしょうか? データ件数は、10万〜100万件程度です。 アドバイスよろしくお願いします。
>>696 64bitならもちろん、32bitでも、bigint のほうが早いはずだぜ。
まぁ、やってみたら?
698 :
696 :2009/09/01(火) 21:00:44 ID:???
>>697 アドバイス、ありがとうございます。
16桁の商品番号の格納は、BIGINT型で行ってみます!(・∀・)
一応ベンチマークも測ってみようと思って、今100万個のテストデータを作成中ですが、
MySQL5のストアドプロシージャとかで、乱数を一気に100万個ぐらい作る方法ありますかね?
=とりあえずPHPスクリプトで、5000個ずつINSERTしてます><
Tritonn使ってるんだけど Where ColName Like '%検索ワード%' と Where match(ColName) against('検索ワード') って結果が違います これって正常なこと? 何か根本的に間違ってたりしますか?
700 :
699 :2009/09/02(水) 15:45:21 ID:???
すまん、 書き込んだ直前以降はちゃんと同じ値になってました。 なんか構文間違ってたんだと思います。
5.0だけど、INTに2147483647以上の値がINSERTされると DB Error: unknown error で止まっちゃうんだけど、これは正しい動作なの? 4.0のマニュアルには2147483647に丸められると書いてあるんだけど。 5.0のマニュアルにはどうなるか何も書いてない。
>>701 5.0でも2147483647に丸められるし、でてくる警告は
Out of range value adjusted for column 'a' at row 1
になる。
unknown errorを出しているのはMySQLじゃなくて
その上で動いている言語かツールじゃない?
>>702 PHPからPEAR::DBを通してアクセスしていたので、コマンドから打って試してみました。
ERROR 1264 (22003): Out of range value for column 'aaaa' at row 1
になりました。最大値に丸めて追加はされません。
ちなみに5.0じゃなくて5.1.35でした。
とりあえず最大値超えのチェックをPHPのプログラム側に入れることにします。
>>703 ちょっと関係ないかもしれないんだけど、
うちの環境で、5.1.35からMyTHTVがエラーを出すようになったんだよ。
5.1.34だと、正しく動いたりしない?
ここで何か変わったのかな。
705 :
NAME IS NULL :2009/09/03(木) 10:04:24 ID:PDF3RFA2
すみません、多分基礎的な質問なんですが 一つのテーブルに、for文で連続して10回くらいクエリするようなとき、 他のユーザからも同じテーブルにアクセスがあると問題にならないか気になります (例えば、insertごとにlast_insert_id()を取る時など、PHPで) そんなの気にする必要ないんでしょうか? それとも他ユーザのアクセスから保護する方法はあるでしょうか?あったら教えてください。 よろしくお願いします
間違えた LOCK TABLES だった
708 :
NAME IS NULL :2009/09/03(木) 10:27:13 ID:PDF3RFA2
>>707 ありがとうございます! 調べてみます
707さんは上のような条件の時、必ずLOCK TABLESやってますか?
>>705 > last_insert_id()を取る時
これは複数アクセスに関しても安全。
on key duplicate update id=LAST_UPDATE_ID()
かなにかやっとけば完璧。ググって。
710 :
NAME IS NULL :2009/09/03(木) 10:59:55 ID:PDF3RFA2
変なテクニック覚える前に、トランザクション分離について ちゃんと勉強したほうがいいぞ?
>>711 もちろんそうだけど、MySQL(MyISAM)は、
小手先のテクニックでなんとかするDBじゃないかな。
少なくとも、insert idをユニークにするだけなら、トランザクションは要らないし。
713 :
NAME IS NULL :2009/09/04(金) 12:32:18 ID:uLJTuQvZ
今スケジューラーを作っています。 画面構成としては当日のイベント詳細があって、その下に当月のカレンダーがつきます。 ここで、イベント詳細部分のデータ引き出しがどうしたらいいかわかりません。 条件として 1)当日のイベントがあれば当日のイベントを出力 2)当日のイベントが複数あれば、全てを出力する 3)もし当日イベントがなければ、次にイベントがある日のイベント全てを出力する 4)scheduleTblのカラムは、 ID<id>、2009-09-04(date型)<evDate>、イベント名<evName>、詳細テキスト<text> です。 当日の日付をプログラムで生成して、whereの条件にして当日データを取るくらいできますが、 当日イベントがなかった場合というのがどうしたらいいかわかりません。 日付に1日ずつ足してその都度クエリ、なんて非効率だし、 日付カラムに対して `evDate`>$today かなと思ったんですが、where, limitの指定方法がわかりません
サブクエリの基礎 where evDate = (select min(evDate) from schedule where evDate > '2009-09-04')
>>714 ありがとうございます!
本当に助かりました
「東京 神奈川」みたいにスペースで分けた複数の文字で検索かけることがありますが、 これの検索のロジックって 東京・神奈川それぞれを個別に %東京% みたいにlike検索のキーワードとして、合計2回クエリしてるんでしょうか? select * from `tbl` where `text` like %東京% select * from `tbl` where `text` like %神奈川% みたいに。 sqlスレで聞いた方が良いのかな? 良かったら教えてください、もっと効率的な方法があれば知りたいです。 PHP5.2.8 mysql5です プログラム板のPHPスレで聞いたんですが、スレ違いということでこちらに来ました 良ければご意見お願いします
717 :
NAME IS NULL :2009/09/06(日) 15:25:50 ID:sqLNCpnT
聞くとしたらSQLスレ 聞く前にググレ
718 :
NAME IS NULL :2009/09/07(月) 07:00:19 ID:UJq67Uhj
すみません、初歩的な質問です。 データベース(MySQLなど)を構築する場合は、それ専用のマシンを 用意しないといけないのでしょうか? たとえばWebサーバとして使っているマシンに構築するのは不可能でしょうか。 よろしくお願いします。
>>718 やってみないの?たいした手間じゃないとおもうけど。
>>718 できるよ。
それに、WebサーバーとMySQLは、同じマシン内で動かしたほうが
セキュリティ的にもDBとWebアプリの通信内容が外に漏れず安心、
という面もある。(パフォーマンス的には別のもののほうがいいけど、
それはまぁ規模によりけり。)
大抵のLinuxサーバーなら、MySQL入るからやってみればいい。
もちろん、httpdとの相乗りも可能だよ。
>>718 それだけの情報だと言える事は
ソフトウェア的には同居は可能
722 :
718 :2009/09/07(月) 12:22:13 ID:UJq67Uhj
>>719-721 どうやら大丈夫そうなので同一マシンで構築してみたいと思います。
ありがとうございました。本当に助かりました。
723 :
NAME IS NULL :2009/09/07(月) 17:17:40 ID:1gVIiixw
Mysqlに入っているデータをSQLのみで正規表現を使って 置換したいのですが方法が思いつきません 他の言語(PHPとか)を使って置き換えれたら楽なのですがそのサーバーにはMysql しか乗っておらずなんとかSQL上だけでやりたいのですが どのようにすればいいのでしょうか? やりたいことは以下のようなことです(PHP) preg_replace("/^(.*) $/","\\1","abc efg ");
sedとかawkもあるぞ。
教えてもらえないでしょうか MySQLをWindiwsServer2003r2にmsiインストーラでインストールすると 直ぐに終了してしまい [後でもう一度トライして下さい]の様なメッセージが出て イベントログにも [早すぎる終了]のようなメッセージがありました インストールは可能ですよね? 何が駄目か検討つきません 助けて下さい!
>>726 > Windiws
> 検討
何か、インストール時にも読み違いや書き間違いがあるんじゃないのか?
728 :
726 :2009/09/07(月) 22:55:07 ID:???
すんません! はずかしい! やはりやり方が悪いんでしょうか...
ダウンロードしたのが壊れていたとか あるいはPCの方で何か異常が生じているとか
インストール権限がないとかだったりして
SQLSever以外のDBインストールすると おかしくなるんだろ。 M$トラップが発動したと思われ
732 :
726 :2009/09/08(火) 07:58:25 ID:???
ローカルのアドミニストレーターで リモートではないコンソール画面からも いく度か別のバージョンのインストーラでも試しましたが結果は同じでした 詳細のエラー調べてみます!
733 :
NAME IS NULL :2009/09/08(火) 09:03:57 ID:m49/nbrV
>>724 Perlすらはいっていません
純粋にOSとMySQLのみだけで動作してます
別マシンに入れたPerlやPHPからやればいいじゃん。
>>732 >詳細のエラー調べてみます!
最初にやれ!w
736 :
NAME IS NULL :2009/09/08(火) 13:55:01 ID:m49/nbrV
>>734 単順にSQL上で処理することは無理ということでしょうか?
ローカルサーバーと自分のPC以外からのアクセスを管理者に制限されているので
やろうとしたら環境整えなきゃいけなかったので方法があるなら
SQLだけでやりたかったのです
でも駄目そうなので環境作る方向でいきます
ありがとうございました
Windows MySQL 5.1 接続しているデータベースによって動作を変えたい場合がある (具体的に言うとテスト系なのか本番系なのか)のですが、 現在接続しているデータベースが何なのかをSQLで知る方法という のはあるのしょうか?
738 :
726 :2009/09/08(火) 22:17:29 ID:???
>735
もうしわけございません。
確認致しました。
以前にもWeb上で情報検索したのですが、解決策がわかりませんでした。
ダウンロード元(9/8現在):
http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.38-win32.msi/from/pick インストーラメッセージ
-----------------------------------------------------
MySQL Server 5.1 Setup Wizard ended
prematurely
The wizard was interrupted before MySQL Server 5.1 could be
completely installed.
Your system has not been modifiled. To complete installation at
another time, please run setup again.
------------------------------------------
イベントログ情報↓
-------------------------------------------------
イベントの種類: 情報
イベント ソース: MsiInstaller
イベント カテゴリ: なし
イベント ID: 11708
日付: 2009/09/08
時刻: 8:40:09
ユーザー: ********
コンピュータ: ********
説明:
Product: MySQL Server 5.1 -- Installation operation failed.
詳細な情報は、
http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。
データ:
-----------------------------------------------
Web上での調査は行ったのですが、、、
どうぞご存知の方いらっしゃいましたらご教授ください。
よろしくお願いいたします。
739 :
726 :2009/09/08(火) 22:21:33 ID:???
あっ、補足ですが 他のサーバ(Winserver2003R2)で試みた結果も同様でした。 基本的にはローカルAdminをRDP接続で作業しています。 ドメイン環境(上位に別のドメイン有)、 SQLserverは稼働中です。 (その他Apache,rubyの環境です。) 不足あれば追記します。 よろしくお願いします。
>>737 関数DATABASE()の戻り値。
ただ、セッション変数を明示的に使用した
ほうがいいのでは。
>>740 まだセッション変数って何?というレベルなんで w これからも勉強します。
有難うございました。
742 :
NAME IS NULL :2009/09/09(水) 19:18:41 ID:dvog8naf
phpMyAdmin で csv データをインポートしようとすると CSV 入力の書式が不正です (行: 607) みたいなエラーメッセージがでて止まってしまいます。 そこまでは取り込めているんですが、これってダメな行があったら、そこを無視して次を取り込むみたいな設定がないんでしょうか。 一つ一つエラーが出る行をつぶしていくのは膨大すぎて……。
スレ違いだな
744 :
NAME IS NULL :2009/09/11(金) 00:04:21 ID:MS7jWmW9
文字列を2gramにしてfulltextのインデックスを使って検索をかけると, ・や.等の全角記号が無視されるようなのですが回避方法はありますか?
レプリケーションに関しての質問です
既存のマスタ-スレーブのレプリケーションに新しくスレーブを追加しようと思いました。
幸いマスタ側でバイナリログをすべて取っていたので空っぽなスレーブをつないですべてbinlogで読ませようと思いました。
今回追加したスレーブはテスト目的で、vmware上で動いており、スペックがかなり悲惨なのです。
スレーブの設定を終えてrelay-logをどんどん作ってくれたのですが、relay-logが多くてhddがいっぱいになってしまいました。
おかげでsqlスレッドも動かなくなりました。
i/oスレッドだけ止めるだとか、(レプリケーションをいじくりまわす)このあたりの小技とか、何か解決のヒントを教えてもらえませんか?
-- 既存のスレーブもunkスペックなのですが、マスタ開始当初から動いているためrelay-logはpurgeされてうまくうごけています。
>>742 そういった機能がなかったので結局取り込むためのコードかいて利用してます。
MySQLを使うシステムで全文検索の機能を作ることになりました。 MySQLのFULLTEXTインデックスでは日本語に対応できないようなので、Tritonnを使おうと考えています。 しかし調べてみると、Tritonnの全文検索はMyISAMエンジンのテーブルでのみ機能するようです。 全文検索を実現するためにはMyISAMを使う必要がある、 しかしトランザクションが必須なのでInnoDBを使わなければならない という状況になっており、解決方法が分かりません。 できればTritonnを使いたいのですが、Tritonn以外の方法も含めてMySQL+全文検索機能を実現する良い方法がありましたらご教授頂けないでしょうか? よろしくお願いします。
>>747 テーブルを分けるとかじゃダメなの?
トランジャクション使うデータはInnoDBにして、全文が必要なデータはMyISAMにするとか。
何のデータか知らんから無理かもしれんが。
それか、分かち書きしたデータにFULLTEXT張ってMATCH 〜AGAINSTとか。
749 :
747 :2009/09/11(金) 21:06:19 ID:???
>>748 回答ありがとうございます。
やはりテーブルを分けるのが筋でしょうか。
ブログ関係のWebシステムを作っていまして、ブログ記事のタイトルや内容、その他の関連テーブルからテーブルをまたがって全文検索する機能を作る予定です。
トランザクションは無くても大きな問題は無いように思うのですが、ここは上からの支持なので外せないのです。
また、分かち書きしてDBに入れることも提案したのですが、データ量が増えるとパフォーマンスに影響すると言われて却下されてしまいました。
トランザクションと全文検索の両方を必要とするテーブルを作らないようにDB設計を見直す方向でもう一度考えてみたいと思います。
ありがとうございました。
パフォーマンスを気にするのにRDBで全文検索やれって指示? 単にレコード数が多いだけのテーブルの方がチューニングのしようがあるのにな。
にしても、RDBMSで全文検索やりたがるヤシって後を絶たないなぁ。
実務で使えるRDBMS以外のDBって何?
>>752 いきなり何を言い出すんだ、お前は。
あと、お前がCOBOLを全く知らないことは理解してあげた。
知ったか乙
え、WebシステムにCOBOL?意味がわからん
CHECK TABLEを全テーブルいっぺんにかけたいんですけどどうすればいいですか?
自己解決しました。mysqlcheckを使えばいいんですね
754=752=包茎
で、Blogで使えるRDBMS以外の全文検索って何よ?真面目に知りたいんだが?
760 :
NAME IS NULL :2009/09/13(日) 02:17:01 ID:8JHnWrpH
質問です。 今、DBサーバにMySQLをインストールしてます。 そのサーバにはディスクが2つあります。 バイナリログとアクセスログが書き込まれるディスクは今は同じなんですが、 アクセスログだけ、片方のディスクに書き込むようにすれば、性能ってあがりますか?
MySQLにアクセスログなんていうログはないよ
>>760 アクセスログって、クエリログのこと?
バイナリログもクエリログもデータベースディスクとわけるべきだと思う。
>>749 レプリケーションしてサマリテーブルつくってあげたらどうかな。
senna - toritonnでやってるけどunkスペックなスレーブで十分いけてる検索速度andサマリテーブル作成速度出してます。
764 :
NAME IS NULL :2009/09/14(月) 06:07:45 ID:aUdaKzFo
left joinを複数設定したいんですが、以下で失敗するようです。書式がおかしいでしょうか? FROM{$table1} LEFT JOIN {$table2} ON {$table1}.id1 = {$table2}.id2 LEFT JOIN {$table3} ON {$table1}.id1 = {$table3}.id3 LEFT JOIN {$table4} ON {$table1}.id1 = {$table4}.id4 下のやり方でも失敗しました FROM{$table1} (((LEFT JOIN {$table2} ON {$table1}.id1 = {$table2}.id2) LEFT JOIN {$table3} ON {$table1}.id1 = {$table3}.id3) LEFT JOIN {$table4} ON {$table1}.id1 = {$table4}.id4) また、原因解決のためエラーログを見たいんですが、どこにあるんでしょうか? 当然自分でググって調べたんですがわからず /var/log/mysqld.log にひとまとめにしてあるのかと思ってこっちを見ても 該当の情報がありませんでした 大変すみませんがご意見お願いします。centOS5 mysql5を使っています
764です 上の結合については自己解決しました。ありがとうございました 下のエラーログについて、良かったら教えてください
SQLの書き間違いのようなエラーは mysqld.logには出ません
767 :
NAME IS NULL :2009/09/14(月) 18:13:37 ID:aUdaKzFo
>>766 どうもありがとうございます。公式を見ると
http://dev.mysql.com/doc/refman/4.1/ja/error-log.html 「mysqld がエラーログファイルを保存する場所を --log-error[=filename] オプションで指定できるようになっています。
ファイル名を指定しなければ、mysqld は Unix では mysql-data-dir/'hostname'.err」
と書いてあり、centOSなので find / -name localhost.err や find / -name *.err を試しても該当ファイルが見つからず
自前で設定しないとエラーログを保存できないのかなと思ってきました。
その理解で良いんでしょうか?
とりあえずこっちのページを見て(
ttp://a-programmer.blog.so-net.ne.jp/2007-09-15 )
mysqlmonitorで mysql> mysqld_safe --log-error=/var/log/myerror.log --log-warnings=1 して
わざとsqlエラーを起こしたんですがファイルも出来てません
エラー情報はどこにあるんでしょうか。mysqlディレクトリを見て回ったんですがわかりませんでした
mysqlのバージョンは5.0.45です
RHEL5(CentOS5SQL)付属のMySQL 5.0.45は ディレクトリ構成がカスタマイズされてる。 付属版では /var/log/mysqld.log がエラーログで正しい。
手が滑った RHEL5(CentOS5)付属のMySQL 5.0.45ね。
770 :
767 :2009/09/14(月) 21:34:47 ID:???
>>768 どうもありがとうございます
vi /var/log/mysqld.log したんですが、起動/終了履歴しか書いてないです
これじゃないみたいです。mysql、自前で入れた覚えないんですが、うっかりやってしまったのかな…
>>770 たぶんあなたは、「エラーログ」について、なにか勘違いしてる。
>>767 のurlにあるmysqldのエラーログってのは、
それこそ起動や(そのプロセス自体の)実行に関するエラーのことであって、
通常のSQLクエリを投げた時に、構文が間違ってたりした時の、
"You have an error in your SQL syntax〜〜うんたらかんたら"とか、
"Table(or column) doen't exist・・・"
ってゆうエラーのことではない。
で、そうゆう(SQL)エラーを記録するログは、
>>766 のとおり、mysqld自体にはついていない。
どんなクライアントアプリを使ってるかしらないけど、perlなりphpなりでやってるなら、
Apache(Webサーバ)のエラーログなり、別ファイルに書き出すなりの設定を、
クライアントアプリ側でトラップするしかない。
772 :
NAME IS NULL :2009/09/15(火) 03:30:38 ID:qoH2jeyE
質問です。 会社で他の人が書いたソース(PHP+MySQL)を読んでいるのですが、 複数のテーブルをselectしてるだけのトランザクションがあります。 自分の理解では、トランザクションは更新のためのものであり、 selectだけの場合はトランザクションは必要ないと、理解していたのですが、間違いでしょうか? selectだけのトランザクションは、どのような意味があるのでしょうか?
1つめのselectのあとに更新がかかったら?
初心者ですので知識に乏しいもので入門的な質問なのかもしれませんが、 テーブルを作成し、address.dbにデータを登録しました で、コマンドプロンプトにてSELECTで確認したところ、文字化けしていました どうやらコマンドプロンプトはShift_JIS形式で、UTF-8形式だと文字化けするようですが、これを何とか出来ないでしょうか? 検索してchcp 65001なんてものを見つけたのですが出来ず、よく分かりませんでした データベースに書き込み時にShift_JIS変換する方法 又は コマンドプロンプトで文字化け化を直す方法を教えていただけたらと思います WindowsXP使用で、PHPでの書き込みです
>>774 テーブル作成時にキャラクタセットの指定はどのように?
create table 〜
(
〜
) ENGINE=InnoDB DEFAULT CHARSET=cp932;
みたいに指定はした?
コマンドプロンプトで作業するときは、最初に set names cp932 する。
欠損値について、どうすればいいか、 いいアイデアがあれば教えてください。 Year NA NA NA 2000 2000 1998 のようなCSVを read data local infile で読み込むのですが…
>>775 教えていただいたように
$db->exec('CREATE TABLE address(id INTEGER PRIMARY KEY, name VARCHAR(50), address VARCHAR(150), tel VARCHAR(20), email VARCHAR(100)) ENGINE=InnoDB DEFAULT CHARSET=cp932; ');
のようにセットしたところ、まずENGINEに構文エラーが出て、ENGINEを消したところ、次はDEFAULTがエラーが出てしまいました
>>776 コマンドプロンプトを起動するとc:\Documents and Settings\メイン>となりますが、ココにset names cp932と打ち込むのでしょうか?
自分は色々な場所に打ってみたのですが、環境変数 namesが設定されていませんと出てしまいました
779 :
775 :2009/09/16(水) 11:39:51 ID:???
こっちで以下のcreateを打ち込んだら正常にテーブルが作成されたけどなぁ (こちらのMySQLのバージョンは5.1.37) MySQLのバージョンは? CREATE TABLE address( id INTEGER PRIMARY KEY ,name VARCHAR(50) ,address VARCHAR(150) ,tel VARCHAR(20) ,email VARCHAR(100) ) ENGINE=InnoDB DEFAULT CHARSET=cp932; setについては俺は接続する際の文字列として 以下のものを使用している(excel vbaからだけど) *印のところは適示そちらの環境に合わせて DB_CnString = "DRIVER={MySQL ODBC 3.51 Driver};" _ & " SERVER = ********;" _ & " DATABASE = ******;" _ & " UID = *******;" _ & " password = ******;" _ & " STMT=SET CHARACTER SET cp932;" _ ←ここ & " OPTION =3 " これ以上は俺には知識は無いんで他の方にお願いしてくれw
780 :
NAME IS NULL :2009/09/16(水) 13:57:11 ID:WDq6aOQr
>>759 NAMAZUでもいいんじゃね?
mknamazuのタイミングが問題だが
>>778 mysqlコマンドラインを知らないのか?
だったら、それを調べることから。
あるいは、MySQL GUI Toolsを使え。
初心者みたいだし、超おすすめ。
782 :
767 :2009/09/17(木) 03:17:34 ID:???
>>771 おおお、解説ありがとうございます。
まさにおっしゃる通り、カラムがないとかデータ型がおかしいとか
そういうエラーがmysqlの機能として出力されるのかと思ってました
>クライアントアプリ側でトラップ
やってみます、ほんとにありがとう!
783 :
NAME IS NULL :2009/09/17(木) 14:10:45 ID:9P/or61p
どうも合点がいかないことがあるので、質問しても良いでしょうか。OSはFedora10です。 MySQLをインストールしようと思い、mysql-5.1.38-linux-i68-glibc23.tar.gzを /usr/local に展開しました。 cd mysql-5.1.38-linux-i68-glibc23 ./configure --以下オプション… 上記のコマンドを入力しても、bash: ./configure: そのようなファイルやディレクトリはありません、となります。 ディレクトリに./configureファイルがあったと思うのですが、どこにいってしまったのでしょうか。
select * from tb where ( concat( column1 , column2 , column3) like '%word1%' ) 複数カラムのいづれかに指定文字がある検索をしたいのですが 上記の記述では いづれかにNULL があると対応できません NULLがあっても検索にヒットするようには どのような記述にすれば良いでしょうか? よろしくお願いします
>>784 where c1 like '%word%' or c2 like '%word%' or ...
と、or でつなげちゃダメ?
>>783 バイナリ版をダウンロードしてなんでビルドしようとしてるの?
787 :
NAME IS NULL :2009/09/17(木) 17:46:07 ID:9P/or61p
>>786 あれこれじゃないですか?どれをダウンロードすればいいでしょうか。
自分でビルドするなら mysql-5.1.38.tar.gz
789 :
NAME IS NULL :2009/09/17(木) 19:26:55 ID:9P/or61p
>>788 有り難うございます(T_T)あなたのイエス様のような導きで救われました。
5.4.2がでましたね。 まだβ品質みたいですが、そろそろ使い物になってくるかな。
MySQL5.0からvarchar型で65535文字格納できるようになったとのことですが、 text型の使い道って今でもあるのでしょうか? 長文テキストはvarcharに、でっかいバイナリデータならblobに入れれば済んでしまいそうです。 単純に65535文字以上のテキストを格納する場合にのみtext型を使うのですか? それとも文字制限以外にvarcharでは不都合なケースというのがあるのでしょうか?
改行使う必要ないならvercharでいいんじゃないかな
別に改行あってもvarcharで問題ないだろ textは文字列をそのまんま格納 varcharは余分な空白を削除する textfieldに対応するカラムはtextにしときゃいい
MySQLのvercharは余分な空白を削除する?
>>794 「改行がある」と「改行を使う必要がある」は全く違う意味だろ
お前さんの言うやり方で、どうやって改行のある長文を復元できるわけ?
varcharって改行を認識しないの?
innodbのauto_incrementは テーブルのデータをdeleteしてからmysqlを再起動すると 同じ値が再利用されるってのを最近知った
799 :
NAME IS NULL :2009/09/20(日) 19:32:06 ID:DbTnU+4k
データベースを作成しようと思って mysql> CREATE DATABASE transcript_production; と入力したところ、 ERROR 1006 (HY000): Can't create database 'transcript_production' (errno: 2) というエラーが発生します。データベースが作成できないのは何故でしょうか?
800 :
NAME IS NULL :2009/09/20(日) 20:38:48 ID:K6cwfdto
エラー内容で検索し、問題点の理解を行おうとしないためです。
801 :
NAME IS NULL :2009/09/20(日) 20:43:14 ID:K6cwfdto
まかーは帰れ
802 :
NAME IS NULL :2009/09/21(月) 01:48:42 ID:ki/ZQtAj
はい。
803 :
NAME IS NULL :2009/09/22(火) 09:24:58 ID:pzId1jk0
ちょっと聞きたいんですが NULLを許可したフィールドにNULLを入れるのと データを入れるのとでは使用するサイズに違いはありませんよね? (実際やってみても同じサイズでした) これをNULLだとほとんどサイズを使用させたくないのですが可能でしょうか?
>>803 固定長だと無理じゃない?
別テーブルにして、inner join したら?
805 :
NAME IS NULL :2009/09/22(火) 17:08:39 ID:E7b8KwR3
806 :
803 :2009/09/22(火) 17:25:08 ID:???
やっぱり無理ですか… 値以外にNULLかどうかの区別が付いてるんでもしかしたら出来るのかな? とは思ったんですが… 別テーブルからinner joinすることにします。ありがとうございました
固定長じゃなくなっちゃうからね。
808 :
NAME IS NULL :2009/09/22(火) 23:53:58 ID:ATIBidir
単に時刻だけを扱いたいときって整数型使えばいいの?
>>808 datetime使ったほうがいいとおもうぞ。
addtime()とか時間処理関数使えるし
810 :
NAME IS NULL :2009/09/24(木) 23:13:44 ID:43eZZEHL
ENUM使うくらいならCHARなりINTなりでいいよね
構造にもよるけどENUMは基本使わないかなー 聞いちゃいないがSETはcheckboxの値を収める時なんかには使う
>>810 >ENUM
フツーに使う。
クエリの結果を生で見たときにちょっと
わかりやすいから。
ヘビーな用途じゃなきゃ問題ないだろ。
>>808 いんじゃね。
ちなみに、オレはほとんどそうする。
ファイルのタイムスタンプを多用する
都合にあわせてるからなんだけど。
815 :
NAME IS NULL :2009/09/27(日) 14:04:02 ID:nuIWLu+4
そのデータベースの構造を一覧出来る方法がないかなと思っているのですが、一つのコマンドでそういうのは無いでしょうか? desc name や show create table nameの結果が全部出力されるような感じを考えています。 desc *; や show create table *; という感じで出来るといいのですがそういう方法はありますでしょうか?
>>815 show tables;
じゃだめなの?
817 :
NAME IS NULL :2009/09/27(日) 16:50:23 ID:nuIWLu+4
tableの構造も含めた形で取得したいのですが・・。
>>817 説明たりねーよ。ボケ
mysqldumpコマンドくらい知らねーのか!
819 :
NAME IS NULL :2009/09/27(日) 19:55:25 ID:nuIWLu+4
失礼しました。 イメージとしては、そのデータベースにある全tableの desc name や show create table nameの結果が全部出力されるような感じを考えています。
いやだからmysqldump使えって話じゃん
>>815 つ information_schemaデータベース
822 :
NAME IS NULL :2009/09/29(火) 12:50:09 ID:ko2ZqKae
質問です。 MySQL5.1で、異なるDBサーバにあるテーブルの結合(join)をすることが出来るでしょうか。 ■構成 MySQL5.1をインストールしたDBサーバが2台あり、それぞれ別のテーブルが入っている (レプリケーションしているわけではなく、別の種類のデータが入っている) ■要件 両サーバにあるテーブルを結合(join)したい。 db1のtable1と、db2のtable2を結合したいということです。結合に用いるカラムは存在 します。 table1のデータとtable2のデータを別々に取得し、プログラムを用いて照会するという 方法もありますが、出来るだけDBへ発行するSQLの本数を少なくしたいというのがクライ アントさんのご要望で、現在つまずいています。何かわかりましたらお教えください。 宜しくお願いします!
案1 federated storage engine 案2 spider storage engine
824 :
NAME IS NULL :2009/09/29(火) 18:00:25 ID:ko2ZqKae
>>823 ありがとうございます。案1でいけそうですね。
5.0系のリレーログについて質問です。 mysqladmin shutdownをすると、リレーログの内容はすべて反映されてから mysqldが落とされるのでしょうか? 何がいいたいかというと、mysqldが落ちた状態の時は、リレーログや リレーログインデックスは削除したいのです。 MySQLを実行しているホスト名を変えたいのですが、現状は リレーログファイル名にホスト名がついてしまっているので、 ホスト名を変更した後、リレーログとリレーログインデックスを 削除してからmysqldを上げようと考えているのですが・・・。
826 :
825 :2009/09/30(水) 15:43:47 ID:???
x mysqldが落ちた状態の時は、 o mysqldが落ちた状態の時に、
827 :
NAME IS NULL :2009/10/01(木) 15:40:00 ID:Y2Zf4H+p
マスター、スレーブ、どっちのホスト名変えんの ま、どっちにしても ホスト名かえるならマスターとスレーブ両方ともstopしなきゃならんだろ。 権限テーブルだって見直ししないとならんし。 だったら、マスターから落として、スレーブにマスターの最終更新が反映されたことを確認してから スレーブも落とせば問題ないんじゃないの どっちかを稼働させたまま作業するなんてばかなことはやめたほうがいい。 問題はレプリケーションだけじゃないから。 上にかいたが権限とか、MySQLはホスト名依存の汚い部分があるから。
sage
MySQLのMyISAM型はまだトランザクション機能は利用できないんだっけ?
ずっとできない。
ID ---Primary key CustId ---char(8) 挿入時に、ID に 0を付けた値をCustIdに入れられますか? たとえば、ID=1 であれば、CustId=00000001 みたいに 以下はトリガは作成できても、アプリから実行するとエラーになります。 create TRIGGER generateCustId after insert on customer for each row begin set @custid = CONCAT(Left("00000000",8-Length(new.ID)),new.ID); update customer set CustID=@custid where ID = new.ID ; end
832 :
NAME IS NULL :2009/10/11(日) 12:52:43 ID:I0TScHXP
質問です たまに"MySQL server has gone away"と出てきて MySQLとの接続が切断されるばかりか 一度exitしてもう一度接続しようとすると パスワードを打った瞬間に MySQL Command Line Promptの窓が閉じます。 ですから、毎回コンピューターを再起動しなければなりません。 原因は(不適切にデータベースにアクセスした、など)複数あるみたいなので その追求は後でするとしまして、 "MySQL server has gone away"が出た後でも コンピューターを再起動せずにMySQLを起動できる方法を教えてください。 何かリセットのコマンドはありませんか?
>>832 再起動してるコンピュータはサーバ側でいいんだよね。
ヒント: /etc/init.d/
834 :
832 :2009/10/11(日) 18:38:45 ID:I0TScHXP
>>833 はい、サーバー側でいいんですが
Windows Vistaなのでそのヒントでは
どこをいじればいいのか分かりません。
具体的にどこをどうするのか教えてください。
836 :
832 :2009/10/11(日) 19:00:54 ID:I0TScHXP
Apache2.2の再起動のことですか? それなら既にやっています。 Apache2.2が起動している状態から →停止→再起動 としても正常に起動されないので質問しているんです。 スタートメニューからApacheのstartとstop、 そして、Administrative Toolsでstartとstopと直接やっても起動されません。 他の方法はありませんか?
>>836 どっからapacheが。。
いや、えー
だから、MySQLもapacheのようにサービスを再起動したらいいと言っている
コマンドプロンプトから net start mysql net stop mysql あるいは管理ツールのサービスからMySQLを選んで 起動させる
スタートメニュからどうやったらいいでしょうか? とか、返ってきそうで怖い
サービスの画面まで自分でいってるんだからそれはないだろ アッー サービスにmysqlあったんだ!って感じなんじゃねの?
841 :
832 :2009/10/13(火) 12:11:35 ID:KasnJFah
>>838-840 いやいや、
net start mysql
net stop mysql
は知りませんでしたが、
「管理ツールのサービスからMySQLを選んで起動させる」は既にやってます。
それで出来ないから質問してるんですが。
>それで出来ないから質問してるんですが。 後出乙。832からはexitコマンドとPC再起動しか読み取れない。なにが「ですが」だよ。
841みたいな最初の質問時に環境を明示しないバカは、ハナから放置するのがいいかと。
845 :
833 :2009/10/13(火) 17:15:48 ID:???
846 :
NAME IS NULL :2009/10/14(水) 08:25:48 ID:lFiZMz2+
質問です、人名検索のアプリを作っています。検索条件は 「全部|A-Z|あ|か|さ|た|な|は|ま|や|ら|わ」で、「あ」を押した時には 相田、青山、飯山、井村、織田 って感じでア行に所属する名前を表示をしたいと思います。 この場合、where以下の検索条件はどうしたらいいでしょうか? パラメータは「key=あ」がセットされるものとします。 where `name` like '{$key}%' で考えたけどこれは平仮名指定だし、無理でしょうか? centOS5.3、Mysql5、PHP5で動かしています
>>847 そうですね。気がつかなかった、ありがとうございました
849 :
NAME IS NULL :2009/10/14(水) 23:52:17 ID:0LwxIgqj
Mysqlのコミュニティーエディションについてお伺いします 会社のイントラネットでドキュメントなどのデータベースに利用したいのですが これはライセンス的にOKでしょうか?
OK 何を心配しているのか分からん
あるテーブルのフィールドが更新されたのを契機に 外部スクリプト(PHPかBASHスクリプトを検討)を呼び出したいと思います。 外部スクリプト側で一定間隔で監視対象のテーブルを SELECT COUNT(*) FROM hoge WHERE ...することを 検討してましたが、数秒以内のレスポンスを要求されているため、 この方法でやるのは効率が悪いと考えています。 そのため別の方法を検討しています。 トリガからストアドを呼び出せそうなことはわかりましたが、 ストアドから外部スクリプトをコールすることは出来ますか? MySQLのVersionは5.0を利用しています。
あるテーブルが更新される間隔は、監視間隔よりも頻繁なのかな。 トリガーで監視対象テーブル更新で更新状態フラグテーブルのフラグを更新して、 その更新フラグテーブルをselectしたら1秒もかからないんじゃないのかな?
Cで書いた関数を登録できるから、ある意味なんでもできる
通信を暗号化したいんですが、 SSHのような、パスワード認証で、 通信だけ暗号化したいんだが、mysqlでできますかね? よろしくお願いします。
>>854 暗号化はmysqlの担当じゃないな。
VPNとかで暗号化した通信経路を作って
その上にmysqlの通信を通すのがJK
>>854 俺の質問の仕方が悪かった。ごめん。
mysqlで5.x?だと、SSLと連携するようなんですが、
クライアントアプリの全部に、認証鍵とか埋め込むのが、
面倒なんで、通信だけ暗号化できないのかと。。。。
よろしくです。
ラッパーを通すしかないな そして結局は、そのラッパーを通すためにクライアントアプリを変更する羽目に
運用がおかしくないか? 開発者以外がクライアント使うなんて想像できないんだが オペレータがSQL使うの? 開発時点で暗号化なんて、それどんなapple? SQLクライアントは禁止にして、 Webアプリ化、暗号化はhttpsに任せるがJK
すむせん、MySQLのstatusの見方について教えてください show statusで人生相談に表示するCom_系の値って基本的に加算されてゆくと思うのですが、 計測しているとあるタイミングで減少しているようです。 特にflush statusは実行してないのですがmysqld側でリフレッシュをかけているのでしょうか? また、もしかけているなのなら実行時間のログなどはありますでしょうか?
861 :
859 :2009/10/20(火) 11:29:38 ID:???
× show statusで人生相談に表示する ◯ show statusで表示する コピペミスです 読みにくくてすみません
MySQLの show statsu って人生相談にも乗ってくれるのか。知らなかった
俺の人生 SHOW STATUS; やばい
mysql> show status 俺の人生; ERROR 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '俺の人生' at line 1
全否定されてるw
>>858 レスサンクスです。
最終的に、各PCに常駐アプリいれる予定として、アプリの種類は、
資産管理ツール+ロギングの分類です。HTTPSのPOSTメソッドで、
データベースへの最低限の編集、変更などは、PHP記述で
なんとかなったので、後は、直接アプリからSQLサーバーへ
コネクトして、監査結果やらロギングを行いたいと思いまして、
アプリの開発は、mysql_ssl_set()とか使えば、なんとかなりそうなんですが、
暗号鍵のペア準備が面倒だったので、認証だけは、従来のパスワード認証で接続し、
通信だけ、暗号化したい思いまして。。。どうなんでしょうか?
SQLインジェクションどころの騒ぎじゃないな
なんで編集以外の時だけ直接アプリからmysqlサーバにコネクトするのかは そういう用件だとして置いといて クライアント側で認証鍵とかmysql_ssl_setとか使うなら、まずクライアント側でopensslが利用できないと いけないけどその機能をクライアント側は有してるんでしょうか? そもそもopensslがクライアント側に入ってなければ各クライアント全部にopenssl入れないといけないだろうし 使うにしてもCAファイルはクライアント側で必要みたいだし VPNが一番楽だと思うけど
>>868 まるほど。SQLインジェクション、PHPもろでした。ーー;
事前にqueryして、文字列を比較すれば良いのかな。ああ、しんど、
>>869 レスさんくすです。mysql_ssl_set()
SSHのPermitパスワードAUTHっぽい動作ができるかの確認で、
mysql_ssl_set()を全部NULL指定で、該当ユーザーのGRANTに、
REQUIRE SSLを指定したけど弾かれました。なにかしら、
クライアント側で鍵を用意しないとダメかもしれません。
>>クライアント側で認証鍵とかmysql_ssl_setとか使うなら、
>>まずクライアント側でopensslが利用できないと
>>いけないけどその機能をクライアント側は有してるんでしょうか?
将来へ向けてのトライアル試験なので、
VSではコンパイルしないので、しばらくは大丈夫。
>使うにしてもCAファイルはクライアント側で必要みたいだし
>VPNが一番楽だと思うけど
VPNってのがピンとこないのですが、ローカルのクライアントポートに、
SSHのリダイレクトポートを設ける奴でしょうか?。ポートFWで、
持ち出しPCとかで流行っていますが・・・それでもいいかな。
SSHコマンドのトンネル方式か、それともSSL埋め込みか。
>>871 stunnel辺り使うのが1番楽な気がするけど。
>>870 いやPHPの話じゃなくて、アプリから直接SQLサーバにつなぐんだろ?
てことは当然、コマンド送り放題なわけだから何でも出来てしまう。
で、
>>858 に帰結すると思うんだが。
編集にPOSTを使っておいて、なんで閲覧にGETを使わないの?
>>875 >いやPHPの話じゃなくてアプリから直接SQLサーバにつなぐんだろ?
アプリ自身に、単純にパスワードを埋め込む方法だと、
通信が暗号化されても、配布しているバイナリーを解析されたら、
該当パスワードは容易に抽出できてしまうかもしれない。
結局アプリ側でなんでもできてしまう。ふむふむ。
パスワード方式は、限界で、クライアント側の公開キーを生成して、
サーバー側へ設定するしかないのか。キーはインストール時に、
自動生成して、システム管理へ投げるようにしてもらうか。
>編集にPOSTを使っておいてなんで閲覧にGETを使わないの?
GETもPOSTもPHP側の受処理としてはほぼ同じっすよね?
強い理由があってPOST閲覧している訳ではないです。
>>872 、873
いろいろ情報サンクスです。アプリに埋め込むパスワード方式は
限界っぽいので、もうmysqlのSSLでやって見ようと思います。
まだシビアな情報を扱うDBにはなっていないのでいずれ。
暗号化したパスワードをアプリに入れといて、コネクトする前にデコードして使えば多少解析されてもいいんじゃない? ある程度独自のシード使って ていうかバイナリー解析されたらとか心配してたら何も出来ないよ ちょっといろいろ心配しすぎ
一番安心かつ楽なのはWebアプリにしちゃうことだよ
group_byした結果の行数を取得する方法ってどうやるんでしょうか。 countを使うと、group毎にcountしてしまうので。。
自己解決しました。 select count(*) from (select -中略- group by aa) as c で大丈夫でした。 スレ汚し申し訳ないです。
881 :
NAME IS NULL :2009/10/22(木) 18:09:06 ID:Gyb9EKM2
IBMぐらいしか思いつかんが ラリーがIBMに売るわけがない
マジでどうなるの? 有料化されちゃうの?
>>882 IBMはDB2あるからあんま意味無いんじゃ。
こういう話で国内企業が名前だけでもでて来ないのはちょっと寂しい。
IBMはOracleの前のSunの売却先候補だったことをお忘れなく ま、IBMもMySQLはいだんだろうが 米国勢で買えそうな資金があるのはGoogleとYahooとMSくらいか Googleは社内で大量に使ってるからおかしな会社に売られるくらいなら買うかもしれないが、 Google社内にMySQLのエキスパートがたくさんいるからいまさらどうなっても痛くもかゆくもないだろ 5.4なんてもろにGoogleパッチでできてるようなもんだろうしな 一番の理由になりそうなのはGoogleがソフトウエア売買ビジネスをやるはずもないってことだろうな Yahooもソフトウエア販売はやらんだろう MSはどうかね。MSが買う気になるとは思えんが、万が一そう思ってもOracleが売らないだろう。 となると、買うとしたらヨーロッパのソフト会社かね 日本では知られていないが資金力のあるところはあるんだろう SAPとかは有名だが 日本国内だと楽天が手をあげる可能性はあるかも。 一気に世界企業の仲間入りできそうじゃん 三木谷好きそうじゃん
楽天SQL か、、、 selectした結果がnullの時はポイントとかついてくれたら嬉しい w
ガッしたら1000ポイントとかねw
BTreeを3本木にして、3木Tree にするしかないな。
>>880 もしかして select count(distinct aa) from tbl
5.1.37 innodb text型は、MySQLコマンドブックでは最大長65535バイトとありますが、 可変長と考えてよろしいのですか?
>>892 可変長
ところで、innodb プラグイン試してみた?
894 :
892 :2009/10/26(月) 17:04:27 ID:???
>>893 ありがとうです。
プラグインというのは初めて知りました w
ぐぐって見たら .38からとの事。今5.1系列では40が最新だから使って見ても大丈夫そうな? w
調べてみます。
895 :
NAME IS NULL :2009/10/27(火) 18:22:45 ID:b3uBGirQ
896 :
NAME IS NULL :2009/10/27(火) 18:43:53 ID:sUuPMg09
rdsのdb snapshotってどうやって実現してるんだろう? myiで運用しながらのコピーだとロックがかかるし時間もかかるし
897 :
NAME IS NULL :2009/10/27(火) 19:12:02 ID:uR+M8xJO
チューニングはどうなってるんだろう? 結局のところ生のmysqlだから コネクションが足りなくなったりすることもあると思うんだけど
898 :
NAME IS NULL :2009/10/27(火) 19:24:24 ID:PGbJvuUV
899 :
NAME IS NULL :2009/10/28(水) 03:25:32 ID:AvOezp4B
スレ違いならごめんなさい。 質問なのですが、 テーブルで使われているデータを調べて、最適な型を教えてくれるコマンドがあったはずなのですが、どのサイトを調べても出てこないので教えてください。 例えば、BIGINTで宣言されたカラムに、INT以下のデータしか入ってなく、NULLが無い場合、INT UNSIGNED NOT NULLと出たり、 CHAR(10)にもし"YES"と"NO"しか入ってない場合は確かENUM("YES","NO")が出力されました。 探し方が悪いのか、ずいぶん検索したのですが結局出てきませんでした。 よろしくお願いします。
MySQL 5.1.40 の innodb で delete from data where id is not in ( select id from list ); のように、別のリストのidに含まれない物を消そうとすると、 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction となってしまいます。 noo in (サブクエリ) の構文を最適化して書き直せませんでしょうか?
in句に相関のないサブクエリを書いちゃだめ dataテーブルのレコード数だけlistテーブルのフルスキャンが走る delete from data where not exists (select 1 from list where list.id = data.id)
>>901 ありがとうございます。
魔法のようなクエリですね。
>>900 サブクエリを使わずに、
delete data from data left join list on data.id=list.id where list.id is null
という方法もある。
>>903 ありがとうございます。
手持ちの環境では効率に差がないようですが、
サブクエリよりは、left join のほうが一般的におすすめでしょうか?
906 :
NAME IS NULL :2009/10/31(土) 09:22:36 ID:o/Jls4e4
WebサイトでMySQL5を使おうと思っています。 漢字コードは何にした方が、実務上問題が少ないのでしょうか? よろしくお願いします。
私も文字コード迷った。 ajax使うのにらくだからと思ってサイトもDBも全部utf8にしちゃったけど、今後なにか不都合とかデメリットとかってあるでしょうか?
>>908 入口から出口までutf8で通すのが一番楽だと思うけど、
古い携帯とかサポートしたいのかな?
910 :
906 :2009/10/31(土) 16:04:30 ID:o/Jls4e4
>>907-909 レスありがとうございます。
日本MySQLユーザ会のホームページで、
「utf8 はご存じの通り、到底整理されているコードとは言い難く」って
書かれていましたので、質問させて頂きました。
>>909 「入口から出口まで」のutf8の指定場所は、
HTMLの「<meta 〜 charset=」と、
ソースエディタの漢字コード指定と
MySQLでの指定で、全てなのでしょうか?
よろしくお願いします。
>>910 最近のブラウザや携帯電話では問題ないよ。
IE6とか、古い携帯電話だと機種によってはutf8が甘いのもあるけど、
とりあえずは無視しても良いと思う。
utf8は根強い反対派も居るけど、俺は歓迎してるよ。
(確かに問題も含んでいるのは確かだけど。)
全部utf8で統一すれば、変換テーブル問題もないし。
ただ、適所で正規化が必要かも。そこは面倒だね。
912 :
910 :2009/11/02(月) 20:07:03 ID:cL+4Y1kF
>>911 レスありがとうございます
「正規化が必要」とは、どういうことでしょうか?
MySQL 5.1 auto_incrementに関する質問です。あれは番号を削除した場合つめる事が出来ないですよね。皆さん どの様にされてます?独自の連番システムを作ってるとかですか? 現在作っているのはPKとしてのみ使い、それを使って検索するとか表示するとかする予定は無いのですけど。
>>913 どのようにしているもなにも、番号をつめる必要を感じない
>>914 まァそう言えばそうなんですが w
では、逆に(削除が有った時に)詰める必要があるとしたらどうすれば良いと思います?
>>912 unicodeが嫌われる理由の一つが、その正規化なんですよね。
Macの「〜」とか。
まぁ、調べてみてくれ。
918 :
912 :2009/11/03(火) 07:55:58 ID:zLDyRTuE
>>916 レスありがとうございます。
「正規化」という言葉の意味ではなく、
「何」を正規化しなければいけないのか?
という質問です。
よろしくお願いします。
>>918 何って、unicodeの話してるんじゃないのか?
NFKCで正規化したutf8でいれてutf8_binで比較してる。
正規化してないShiftJISを使うことなんて普通だし、Unicodeだからといって 正規化必須ってわけじゃないからなぁ。
InnoDBで、多くのクライアントからupdateやselectが たくさん(といっても10クエリ/秒)来ているとき、 ほとんどの場合で良好にさばいてくれるのですが、 あるとき、(たぶんupdate)処理がスタックして、 そのテーブルが絡むselect等も一斉に止まり、 timeoutして再び動き出すことがあります。 止まっている間、dead-lock が生じているわけでもなく CPUやI/Oもidle状態で、なぜ止まっているのか分かりません。 試しにMyISAMにしてみると、そのロックはおきませんでした。 なので外部キー制約かと思って、InnoDBに戻して外部キー設定を外してみたのですが、 やはり同じようにロックが生じてしまいます。 ちょっとこれだけの情報で何を質問しているんだと怒られそうですが、 具体的に何がロックしているのかも分からないので、どうしたものかわかりません。 InnoDBに特有の有名な注意点があったりするのでしょうか。 抽象的な質問ですみません。
923 :
912 :2009/11/04(水) 07:35:59 ID:aSZSVXtb
レスありがとうございます。 正規化の意味は分かりました。 再質問ですが、 正規化しなければいけないのに、なぜutf8が良いのでしょうか? (SJISだと、どういう欠点があるのでしょうか)
ソ
SJISだと表示できない文字が増えてきたから
>>923 使う予定のアプリや文字が、全部sjis前提なら、何も問題ない。
でも、そんなことあるか?
最初から最後までSJISならいいけどね。 途中Unicodeになると、変換再変換が面倒くさい。 0x5c,0xa5みたいなのとか。
928 :
923=912 :2009/11/04(水) 16:43:22 ID:aSZSVXtb
929 :
NAME IS NULL :2009/11/04(水) 22:21:36 ID:gnz0MBuh
+----------+---------+-------+----+ | 日時 | 人(id) |入・出 | 時間 | +----------+---------+-------+----+ | 20061002 | 222627 | b | 13:26:47 | | 20061002 | 222627 | c | 13:36:14 | | 20061002 | 585717 | b | 13:36:41 | | 20061002 | 585717 | c | 13:37:26 | | 20061002 | 1142463 | b | 13:38:01 | | 20061002 | 1142463 | c | 13:40:50 | | 20061002 | 402399 | b | 13:40:58 | | 20061002 | 402399 | c | 13:44:24 | ↑は,銀行の窓口のテーブルです。 bが人が入ってきた時間で,cが出ていった時間とします。 そこで,人が窓口にいない遊休時間の平均を算出したいのですが, どのようにしたらよいのでしょうか? MySQLは5.0です。
なんでそんなテーブルにしているの?
931 :
929 :2009/11/04(水) 23:58:22 ID:gnz0MBuh
>>930 レスありがとうございます。
テーブルは他人が作ったもので、私が遊休時間の平均を算出するように頼まれました。
例えばどういうテーブルが良いでしょうか?
テーブルきれいにしても、 プログラムでゴリゴリ書くしか思いつかんなあ int number = 0; boolean idle = false; long begin = 0L; long end = 0L; rs = conn.executeQuery("select ... from ... order by 時間"); while (rs.next()) { if (rs.getString(3).equals("b")) { number++; } else if (rs.getString(3).equals("c")) { number--; } else { throw ... } if (number == 0) { begin = rs.getTimestamp(4).getTime(); idle = true; } else if (idle == true) { end = rs.getTimestamp(4).getTime(); idleList.add(end - begin); idle = false; } }
窓口テーブルが大きいと問題があるかもしれないけど。 SELECT AVG(diff) FROM ( SELECT IF( COUNT(IF(c2.入・出 = 'b', 1, NULL)) = COUNT(IF(c2.入・出 = 'c', 1, NULL)), TIME_TO_SEC(TIMEDIFF(c1.時間, MAX(c2.時間))), NULL ) AS diff FROM 窓口 c1, 窓口 c2 WHERE c1.入・出 = 'b' AND c1.時間 > c2.時間 GROUP BY c1.id ) diffs;
create table hoge( ent_date varchar2(8) ,guest_id varchar2(6) ,ent_type varchar2(1) ,ent_time date ); create table time_table ( t_time varchar2(4) );
insert into time_table select str_h || m2.str_m2 || m1.str_m1 -- as t_time from ( select str_h2 || str_h1 as str_h from ( select '0' as str_h2 from dual union all select '1' as str_h2 from dual union all select '2' as str_h2 from dual ) h2 ,( select '0' as str_h1 from dual union all select '1' as str_h1 from dual union all select '2' as str_h1 from dual union all select '3' as str_h1 from dual union all select '4' as str_h1 from dual union all select '5' as str_h1 from dual union all select '6' as str_h1 from dual union all select '7' as str_h1 from dual union all select '8' as str_h1 from dual union all select '9' as str_h1 from dual ) h1 where str_h2 || str_h1 between '00' and '23' ) hh ,( select '0' as str_m2 from dual union all select '1' as str_m2 from dual union all select '2' as str_m2 from dual union all select '3' as str_m2 from dual union all select '4' as str_m2 from dual union all select '5' as str_m2 from dual ) m2 ,( select '0' as str_m1 from dual union all select '1' as str_m1 from dual union all select '2' as str_m1 from dual union all select '3' as str_m1 from dual union all select '4' as str_m1 from dual union all select '5' as str_m1 from dual union all select '6' as str_m1 from dual union all select '7' as str_m1 from dual union all select '8' as str_m1 from dual union all select '9' as str_m1 from dual ) m1 -- order by t_time ;
select 100 * ( 1 - sum(excl_flg) / count(*) ) from (select tt.t_time ,u_io.excl_flg from time_table tt left join (select distinct 1 as excl_flg ,i_time ,o_time from ( select guest_id ,to_char(ent_time ,'hh24mi') as i_time from hoge where ent_type = 'b' ) u_i left join ( select guest_id ,to_char(ent_time ,'hh24mi') as o_time from hoge where ent_type = 'c' ) u_o on u_i.guest_id = u_o.guest_id ) u_io on tt.t_time between i_time and o_time );
935-937 時間のテーブルを別に用意してやってみた。 ・窓口の数 ・人の滞在時間の重複 ・平均算出の単位 ・窓口の開始・終了時間 ・処理単位は秒?分? このあたりも考えないとダメだけど。 あと、構文はOracleです…。 ていうか質疑応答スレじゃないのに良かったのかな。
>>938 神クエリを見ることが出来たので、許す。
まさかSQLだけでやっちまえるとは…
941 :
NAME IS NULL :2009/11/06(金) 11:11:52 ID:ZUvcKSUf
リアルにすごいなこれ
字下げが詰められちゃったSQLを3人も(!)読んでもらえたみたいでマジ感謝です。 行頭スペースを全角で置き換える気力がなかったの。ごめんね。 つーか、MySQLのスレでOracleSQL書いて褒められるってwww 質問者さんには伝わったかなぁ…あ、ホントに使うなら検証してね! ノシ
>>942 SQLの方言、ちょっと使わないと忘れるよな。
そういえば、sedやawkは忘れないのに、perlは使えなくなるのはなんでだぜ?
非常に初心者的な質問ですみません 今までSQLite使っていました SQLiteはファイルシステムにデータベースを生成する場合を使って、samples.sqliteというファイルを事前に作り、そこにに書き込んでいました 今MySQLを使っているのですが、MySQLはいったい何処の何にデータベースを書き込んでいるのでしょうか? MySQLフォルダを見ても何か書き込みようのものが見当たるわけでもありませんし、パスはどこに指定されているのかとか良く分かりません テーブルとかのデータはいったいどこに格納されているのでしょうか?
C:\mysql\data\testdb とか /var/lib/mysql/testdb とかの testtbl.frm testtbl.MYI testtbl.MYD など。
ファイルベースじゃないと何か不安だなぁ 専用機なら良いんだろうけど
>>945 すみません、色々再確認してみたのですが、どうもそのようなファイル、フォルダがbin、lib、shareしかなく、見当たりませんで、拡張子も.pdbというのがいくつかあるだけでした
で、my.iniを確認してみたのですが、
#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
#Path to the database root
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/"
というのが見つかったのですが、このどちらかのパスで指定された場所にあるのでしょうか?
デフォルトのまま使っているのですが、Application Dataというフォルダが自分のには見当たらなくて、結局何処にあるのか分かりませんでしたが
948 :
947 :2009/11/09(月) 14:56:33 ID:???
解決致しました
なぜどう解決したか書かない。
解決方法を他人に教えるのが勿体ない!みたいな心理が働いてるんじゃね
Application Dataは隠しファイル属性だね
952 :
948 :2009/11/09(月) 16:04:41 ID:???
あぁ、すみません xcopy コピー元ディレクトリ コピー先ディレクトリ /S /E コレを使って、C:/Program Files/MySQL/MySQL Server 5.1/の下に自分で作ったdataフォルダの中にコピーを入れました そしたら自分で作ったデータベースの名前のフォルダが出てました その上でパスをこのフォルダに変更しました 別に出し惜しみしたわけではありません 悪しからず
953 :
NAME IS NULL :2009/11/09(月) 23:32:50 ID:9hIX4tWW
select * from user WHERE id ='3fjsaod' のクエリでid 3 が検索にヒットしてしまうのですが何がおかしいでしょうか? ちなみにPHP+mysql5です
Windows7 x64 でローカル環境で遊んでいるのですが、
■Apache 2.2 →
http://localhost/のページは表示される 。
■MySQL 5.1 → Command line clientからはDBにアクセスできる。
■PHP 5.2.5 →
http://localhost/index.php のスクリプトはちゃんと動く。
■phpMyAdmin → rootでパスワードを入力して実行を押すとパスワードのエラーは出ずに
「Internet Explorer ではこのページは表示できません」 となる。
Vista x64 home premiumの時はphpMyAdminもちゃんと動いていたのですが、
Win7proにしてインストールし直した時に何か設定が変わったのか、ブラウザでphpMyAdminのログイン後の表示ができません。
何がわるい?
955 :
NAME IS NULL :2009/11/10(火) 13:58:34 ID:IvLtg11n
質問させてください。レストランのメニューの一覧を作るプログラムを書いています。 0)関連するテーブルは次の2つ 1)「メニュー自体のテーブルmenuTable(id, uId, menuName, price, category)」 2)「メニューのカテゴリーのテーブルcategoryTable(id, uId, cate1, cate1_open, cate2, cate2_open, …中略…cate5_open)」 3)2つの関係は、menuTableのcategoryの値は"cate1" または "cate2"が入る。uIdは登録ユーザで両方とも同じ。 この条件のとき、所属するカテゴリーが公開状態(cate1_openもしくはcate2_open(初期値0)が1の場合)のメニューだけ SELECTしたいと思います。 どういうSQLを書いたら良いでしょうか? テーブルJOINしてPHPで公開してないアイテムを除外して出力が賢いかと思いましたが、クエリで実現したいです。 よろしくお願いします
雰囲気としてはこーゆーこと? select id ,uid ,menuName ,price ,category from menuTable mt inner join ( select id ,uid ,cate1 as cate from categoryTable where cate1_open = 1 union select id ,uid ,cate2 from categoryTable where cate2_open = 1 ) ct on mt.id = ct.id and mt.uid = ct.cid and mt.category = ct.cate order by id ; 全然動かしてないから構文エラー出るかも…。 idはそれぞれのテーブルで関連無いのかな。 不要なら結合条件から外してくだせぇ。
ん?cate1_openは文字型なのにcategoryは数値型なのか?
あ、逆か。
959 :
955 :2009/11/10(火) 22:50:37 ID:???
>>956-958 ありがとうございます。LEFT JOINしか使ったことがないのでイマイチよくわからないですが、勉強してみます。
もう一つ、漠然とした質問なんですが、よくjoinを使った場合と個々のテーブルに複数回クエリした場合で
必ずしもjoinの方が早くなるわけじゃないと言いますが、何万件以上の規模にならなければ
そんな差は出ないものでしょうか? 数千件程度で遅くなったりしますか?(JOINで)
ほんとSQLは難しい。おまえら尊敬するよ。
961 :
NAME IS NULL :2009/11/12(木) 16:22:19 ID:satwQTs/
C APIにおけるプリペアードステートメントの質問です。 下記のようにstmt1を閉じる前にstmt2を生成すると、最後の行で "Commands out of sync; you can't run this command now"エラーが 起きてしまいます。 1つのコネクションで複数のクエリを同時に発行したいのですが、どう 実装すれば良いのでしょうか。 MYSQL_STMT *stmt1 = mysql_stmt_init(&mysql); char *query1 = "select * from foo"; mysql_stmt_prepare(stmt1, query1, strlen(query1)); mysql_stmt_execute(stmt1); MYSQL_STMT *stmt2 = mysql_stmt_init(&mysql); char *query2 = "select * from bar"; mysql_stmt_prepare(stmt2, query2, strlen(query2));
>>961 mysql_stmt_bind_result() してみるとか。
のんきだね〜皆さん オラクルのSUN買収でMySQLの行く末があやしい状態なのによお linuxディストリにMySQLがバンドルされなくなったら面倒だろ? forkが出てきたとしても、PHPが対応するとも限らんだろ? どうなっちまうのかねえ〜
ぺちぱー乙でありまする☆
MySQL使えなくなったら違うの使えばいいだけだろ 意味分からん
GPLでもあるから心配してない。
文字コード問題、どうにかしてくれないかなぁ・・・
文字コード問題って、今でも残ってるのは UTF-8の4バイト文字対応ぐらいじゃない?
>MySQL使えなくなったら違うの使えばいいだけだろ 無駄な工数といえる
970 :
NAME IS NULL :2009/11/14(土) 01:53:42 ID:X2Zii3C+
文字コードの事なんだけど、以前はujisで登録してたけど少し前に“〜”が“?”に文字化けしてるのに気がついてeucjpms使い始めたんだけど、もしかしたら気づく前にも機種依存文字使ってたかもしれないと思って探したらやっぱりあった。 でもテーブルの量が多すぎて修正しきれないんだけどいい方法無いですか?
>>970 バックアップ取ってこっそりかえてみて、苦情が来なければOKとか…。
そんな変態コード使うとろくな事無いぞ。
mysql 5.1.37 WixXP sp3 mysqldumpで取得したファイルをtestに入れてみようと思い、以下の コマンドを入れたのですが、 c:\>mysql test < "c:\data.sql" -u root -pxxxxx ERROR at line 76:Unknown command '\''. と出てしまいます。念のため同じくmysqldumpで取得している 他のDBを同じコマンドで入れてみたらそちらは正常に入れる事が出来ました。 両方ともDBの中のテーブルはInnodb、キャラクタセットはcp932で作っている のですけど。 で、mysqldumpで出来たファイルの中身を秀丸(utf-8でエンコードし直し)でみると らしき所には '<Sample>\r\n と確かに'\'があります(text型のカラムの所ですけど)。 どうすれば、リストア出来るのでしょうか?
973 :
NAME IS NULL :2009/11/16(月) 17:06:08 ID:izYklsWS
table hoge 1,a 1,b 2,a 3,a 3,b 4,a これから結果を下記のように取り出すことは出来るのですか? 結果: 1,ab 2,a 3,ab 4,a
group_concat
select ifnull(max(id),0), count(*) as kensu from data としているのですけど、ifnullってmysql固有の関数ですよね? それでこれを標準のcaseを使って書き変えた場合、どのように 書けば良いのでしょうか?
>>974 ありがとうです。
あるんですねー。
手元の本には見つけらんなーと
思っていたら、バージョン3とか・・・。
977 :
973 :2009/11/17(火) 18:40:39 ID:LfUIkQIT
これでいけるとおもいきや、 リリース環境のmysqlバージョンが4.0.24で、 GROUP_CONCATが使えません orz 他の方法ありますか?
他にないからgroup_concatができたんだと思いますよ プログラムでがんばってください
979 :
NAME IS NULL :2009/11/18(水) 01:48:14 ID:sB/M8f+C
MySQLのin句で指定できる項目の数には制限があるのでしょうか? 噂によるとオラクルでは1000個以上の項目をin句に指定するとエラーになるそうです。 このような制限はMySQLにもありますか? あるとしたら、それは何個まででしょうか?また、制限以上の個数をin句に指定したい場合のSQLの書き方を教えてください。 よろしくお願い致します。
手元ですぐテスト出来そうなもんだが どこまで他力本願なんだか
981 :
972 :2009/11/18(水) 14:55:49 ID:???
自己解決 mysqldumpでダンプを取得する際に以下のパラメータを追加 --default-character-set=cp932 でダンプを取り直し、それをtestDBに入れたらすんなり入りました。
982 :
NAME IS NULL :2009/11/19(木) 15:18:39 ID:T8+3uiLr
SELECTの内容をUPDATEするにはどうしたらいいでしょうか? update hoge_table set h1 = $1,h2 = $2,h3 = $3,h4 = $4 where id =1; select h1,h2,h3,h4 from fuga_table where id =3; サブクエリだといけると思うのですが全部サブクエリはさすがに重たい処理になる気がしました。 update hoge_table set h1 = (select h1 from fuga_table where id=3),h2 = (select h2 from fuga_table where id=3),長いので省略... from fuga_table where id =3; ご教示お願いいたします。
>>982 deleteしてinsertするのはどう?
insert into hoge_table select h1,h2,h3,h4 from fuga_table where id=3;
トランザクション使えば、データの整合性は問題ないし。
984 :
NAME IS NULL :2009/11/20(金) 21:15:31 ID:fcpTVk0Z
以下の条件を満たすクエリはどう書いたらいいでしょうか? 1)登録ユーザー名と、そのユーザーがアップロードした直近の写真3つをリスト表示するアプリ用のクエリ。 2)ユーザーは複数。アップできる写真に上限はない。 3)ユーザテーブル uTable は、uId , uName 4)写真テーブル pTableは、id uId pName 自分なりに作ったのは SELECT uTable.uId, uTable.uName, pTable,pName FROM uTable LEFT JOIN pTable ON uTable.uId = pTable.uId って感じだったのですが、これだとユーザとその登録写真全てが取れるのはいいけど 写真100件写真を登録してたら不要な97枚までとってしまい無駄です。 どうしたら、3つに限定できますか? LIMIT 3と末尾に書いたんですが、 当然ユーザまで限定されてしまいダメでした。 宜しくお願いします。
MySQL 5.1 indexに関する質問です。Innodbでレコードを削除し、 其の後てOptimize tableで最適化した時、indexも合わせて最適化 されるんですか?
986 :
NAME IS NULL :2009/11/22(日) 04:58:46 ID:ViAte70g
>>984 これは1つのSQLだけでは実行できない。
以下のように2段階で行うしかない。
1. select uId from uTable.
2. select pName from pTable where uId = {1で取得したuid} limit 3
→これはユーザ数分実行する。
あと、テーブルの設計がまちがってると思う。
pTableの主キーがuIdならテーブルを分割する意味はない。
写真テーブルは、pId, pName, uId(主キーはpIdな)とするべき。
あと、「直近の」を判断する情報がない。
pTableにタイムスタンプのカラムを追加するか、
pIdをauto_incrementにした上で、order by pId desc limit 3みたいにしなきゃだめだ
>>985 される。InnoDBのoptimize tableは
create table as selectしてテーブルを作り直しているので
インデックスも作り直される。
989 :
984 :2009/11/22(日) 12:50:06 ID:HWUWqa+A
>>986 ありがとうございます、感謝いたします。
初心者で、どういうものだったら一つのクエリで実現できるのか、判断できないんで困ってました。
クエリを2つ実行する必要があると言うことですが、現実には
1つ目のクエリで1000人分のuIdを取得した場合、2つ目のクエリは1000回発行することになります。
そんなことしてもDBは大丈夫なんでしょうか? 全然平気なのかなぁ。。
たとえば、写真の登録を上限10個にした場合、無駄なデータ取得は10-3で7つです。
クエリ1回だけど7つ程度の無駄なデータの取得負荷あり(JOINを利用)と、1000回クエリはどっちがマシなのか、
判断するにはどうしたら良いでしょう?そういう本があるんですか?
>あと、テーブルの設計がまちがってると思う。
>pTableの主キーがuIdならテーブルを分割する意味はない。
ごめんなさい、情報の書き方が正確じゃなかったです
pTableの主キーはid(auto_increment)なんですが、そうだとしても設計が間違ってるでしょうか?
990 :
984 :2009/11/22(日) 14:25:24 ID:HWUWqa+A
すみません、立て続けで申し訳ないですが質問です。 SELECTを実行しようとしたらエラーになり、WHERE以下の条件に指定したカラムが存在しないと言われます #1054 - Unknown column 'table2.infoOpen' in 'where clause' と。 WHERE table1.`infoOpen`=1 AND table2.`infoOpen`=1 AND table3.`infoOpen`=1 1行目に異常があって、その直後に続く条件がエラーになるのかなと思い2行目を削除しても AND table3.`infoOpen`=1 は何の問題もなくクエリ成功します。 なぜでしょうか? table2.`infoOpen`は確実に存在してるんですが。phpMyAdmin で確認しても値も入って存在してます。。 怪しい点などご意見貰えたら嬉しいです。くだらない質問ですみませんが、宜しくお願いします。
991 :
984 :2009/11/22(日) 14:35:54 ID:???
補足です。mySQLサーバのバージョン: 5.0.45を利用してます
`` がないからでは?
993 :
984 :2009/11/22(日) 16:01:39 ID:???
>>992 ありがとうございます。でもそれだと上下の条件も同じだし…
試しに全てのテーブル名とカラムを`で囲みましたが結果は同じでした。なぜだろう…
イージーチョンボっぽいな よ〜く見比べてみろ
>クエリ1回だけど7つ程度の無駄なデータの取得負荷あり(JOINを利用)と、1000回クエリはどっちがマシなのか 前者はメモリ領域を無駄に食うだろ。JOINするなら尚更。 DBが別サーバならその分通信帯域も食う。 しかも結果を受け取った後スクリプト側で処理するんだろ。CPUリソースまで食う。
7つ程度の無駄なデータというが、自分で例を出してる通り1000人分取得するなら 7000も無駄が発生するんだ。よく考えてみ。
997 :
984 :2009/11/22(日) 23:37:31 ID:???
>>994-996 どうもありがとう、ほんとにありがとう
そのメモリとかの事情がわからないんですが、ともかく、手間を惜しまないってのが基本ですね
複数のクエリを発行てことはトランザクションが必要になるのかな。やってみます、ありがとう
この先言一体どうなるんだろうね〜MySQLは コソーリ教えてよオラクルさんよ
999 :
NAME IS NULL :2009/11/23(月) 07:05:55 ID:Q8mgWefm
ume
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。