1 :
NAME IS NULL :
2008/06/13(金) 10:18:03 ID:q0zt6p92 快速 RDBMS、MySQL の総合スレです。
前スレ[MySQL 総合 Part13]
http://pc11.2ch.net/test/read.cgi/db/1201632550/l50 [関連スレと過去ログ]
http://find.2ch.net/index.php?STR=MySQL http://makimo.to/cgi-bin/search/search.cgi?D=db&q=MySQL&sf=0&link2ch=on [MySQL Developer Zone]
http://dev.mysql.com/ [MySQL 日本語リファレンスマニュアル]
http://dev.mysql.com/doc/mysql/ja/ [MySQL Internals Manual]
http://dev.mysql.com/doc/internals/en/ [MyNA]
http://www.mysql.gr.jp/ [MLja]
http://lists.mysql.com/mysql-ja ここで質問をする前に、MyNAでのFAQを最初に確認しましょう。
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ MyNAでの「心得の条」
http://www.mysql.gr.jp/frame/modules/bwiki/index.php?%BB%A8%B3%D8%2F%BF%B4%C6%C0 ・関連ツール及びユーティリティ
・関連書籍
>>2 | .| /./ / | | _,,,,||,,,l.,,_ ト / | _ | .| /
. | | .| | l .| .,-'|.l .|l .| `|. l ' /´ / / /
| | |.| .| , |´ | .| | _|,_ l .| ./ ''`ト ./ /
| | |.| | | .| |_,,l-,─-.,_、_ | / .λl,/ /
. |. |. || | .| | /::::l ヽ `'' | / , ,.ミ,|´| ./
,,,__.| .| ヘ .| | .|/ |:i::::::〉., ノl | / .// ∨| /
`'' ‐ 、l | .|||l'l:|:|l:::::`':::::i´|| '' / ...:::::l..''
.`ヽ、 |:| ヾl.ヾ::::::::::| .|| ::::::::: l
.\_ -''lヾ ヘ:、.ヘ;;_;ノ ノレ .l
.ヾ=,,,_ .ヘ ,ヾ_,,=..''´.... _,,, /
ヽ .i'`''‐--.〉''´ .ヽ:::::::: _,,, -‐'''´:::::l ./.| drop tableは1日10回な!
.\ ヽ`ニ / l. /:::::::::::::::::::::::/ i''ヘ .l
`ヽ .l-‐''l / .l:::::::::::::::::_;;-ヘ l ヽ ヘ
./.`iヽ .|ヽ| ./ ,,,,,,,_.ゞ,,, -‐''ヽ. |.| .| ヾ.、.ヽ
/ /|.| ヽ .| .| /ヽ /:::::ヾ .| ,l '| .l.l '|ヽ.、.ヽ
// /./.|,, -'''''''''''''''-.、.'-< .| ヽ /:::::::::lト''´ .| | | .i.| .ヾ.、.ヽ
/ / /./ ヽ,.` .l ヽ,'ノ/ ヾ_;;;l.l |/ .l l | ヾ.、lヘ
./ .//l i | .ヾ |:::::|.| .|' l// i.|| i.|
2 :
NAME IS NULL :2008/06/13(金) 10:18:49 ID:q0zt6p92
InnoDB使える安価なレンタルサーバー教えてください
すみません誤爆です
MySQLのデータを一時的に退避させて テーブル構成を変更してからもう一度中に入れたいのですが 何か良い方法は無いでしょうか? mysqldumpコマンドだとデータをいじるのが大変そうです。 エクスポート/インポートの定番のツールなどはありますか?
データはどの位あるの?
7 :
5 :2008/06/13(金) 14:00:00 ID:???
>>6 現在のデータ量はそれほどでもないのですが、
顧客データなのでこれから増えていくことも考慮して
多くのデータ(数千〜万行)を操作できるようなツールを探しています。
最近、数万件のデータをその様にコンバートかけた事あるけど、 ツールを探したり、検証する時間がもったいないから、PHP で自分で作った
というかテーブル構成変えてデータを元に戻してもテーブルにデータ入るわけないじゃん 馬鹿なの?
どっちが馬鹿なんだか。質問の意味を理解してないみたいだな。 失笑を買う。
>>5 SELECT INTO OUTFILEやLOAD DATA INFILEじゃダメなん?
RHEL apache2 mysql5.0.41 php5.2.1 で where col = '日本語文字列' がマッチしないケースがあり困ってます mysql, php ともに utf8 で col は日本語のマルチバイト文字列 (varchar) で mb_check_encoding で true です。 teraterm から select した場合はマッチするのですが、php からの場合には なぜかマッチせず、結果がnullになってしまいます。 どなたか思い当たらないでしょうか。
テーブルのカラムの位置ってselectしたりする際に何か影響があったりしますか? 例えば、よく参照するカラムは上のほうに配置した方が早いなど。
カラムが行単位で繋がってると思う?
SQL ServerやOracleでは、NULLになる可能性が高いカラムを後ろにすると、 1ブロックに格納できる行が増える場合があるけど、MySQLは知らん。
すみませんが、質問です。 MySQL5.0でクエリキャッシュを無効にするには、どうしたらよいでしょうか? 巨大データのテーブルで検証したいことがあるのですが、キャッシュが効いて しまって2回目以降のテストができないのです。 mysqldを再起動しても、どうもキャッシュは無効にならないようです。 環境はCentOS release 5 (Final)、64BITです。
19 :
18 :2008/06/17(火) 12:34:04 ID:???
ageときます。
>>18 select SQL_NO_CACHE field from table ...;
select 文はいじりたくないなら
set query_cache_size = 0;
21 :
18 :2008/06/17(火) 21:18:35 ID:???
22 :
NAME IS NULL :2008/06/18(水) 05:36:21 ID:UtvFT/hw
cronで1日一回メンテナンスしているのですが バックアップログを見ると、あるテーブルが、毎日修復されています myisamchk -r で修復は成功するのに、次の日になるとまた壊れているといった状態です myisamchk -o で直してみましたが、やはり次の日には壊れていました インデックスとデータファイルの間に齟齬があるのだと思いますが どういう処理をしたらいいでしょうか?
>>22 もうだめぽ。Oracleに乗り換えるしかないよ。
的外れだったら申し訳ないんですが、質問失礼します。
現在、VMWareのLinuxで仮想DBを構築しているのですが、
mysqlのインストールまでは正常に出来ているのですが、いざコマンドを流してサービスを開始しようとすると、失敗してしまいます。
ログを見たところ、
InnoDB : Error :pthread_create returned13
・・・とのこと。
少し違うようですが、
?
http://mysqlpracticewiki.com/index.php/Can 't_create_a_new_thread_(e...?
この事例が一番近いのかな、と思い、確かめてみたのですが、どうも腑に落ちません。
mysql のバージョン4.1.22、CentOSとのバージョンの相性が悪いのでしょうか?
それともこれはMySQLでなくてLinuxのエラーなのでしょうか・・・
>>24 もうだめぽ。Oracleに乗り換えるしかないよ。
27 :
22 :2008/06/19(木) 04:07:08 ID:???
myisamchkでなく、 repair tableを使うと壊れなくなりました マニュアルには両者はほとんど同じだと書いてありますが 微妙に違うみたいですね
>>27 mysqld止めずにmyisamchkやってたんじゃない?
29 :
NAME IS NULL :2008/06/19(木) 23:25:04 ID:kglhKwt9
Linux 上で、ソースイヌスコで MySQL Cluster を構成して実験したいけど、 どのtar玉を使えばいいのか、ものすごく分かりにくいな。 MySQL Server : mysql-5.1.25-rc.tar.gz MySQL Cluster : mysql-5.1.23-ndb-6.2.15.tar.gz ↑の組み合わせが最新版だと思うんだけど、 mysql-5.1.24-ndb-6.3.15-telco.tar.gz とかいうMySQL Clusterも見つけてしまって、どれが正解かさっぱりワカンネ
31 :
NAME IS NULL :2008/06/20(金) 06:21:57 ID:bhQIeTGR
mysqldを止めずにmyisamのバックアップをするにはどうするのがいいですか? 今はmysqldを止めて、関連ファイルをそのままコピーしています
mysqldump --lock-all-tables --hex-blob --result-file=name-of-backup.mysql -B specific-dbname 全部バックアップなら -B 以下は不要。
だ〜っ! 遂に、mysql.bkbits.net のでソースコード公開停止か? 今までブックマークしてた各ページにアクセスしたら、どこも404 NotFoundになっちった。
34 :
NAME IS NULL :2008/06/20(金) 15:10:44 ID:lE+0a2Do
MySQL終了のお知らせキタコレ
MySQL4.0.24のテーブル結合なんですが、同じ列名が両テーブルに存在するときはどのように 結合すればいいのでしょうか? 一応多重結合するのでTEMPORARYテーブルを作成しようとしてるのですが Duplicate column〜といわれてしまいます。
tbl1.col=tbl2.col・・・
>>36 イコールの関係ではない列の列名が同じなのだが。。。
そういう場合は不可能でしょうか?
SQLiteだったら、テーブル名.カラム名と結合された列名が作成されてたのですが、MySQLではそういう出力方法は不可能なのでしょうか?
。。。←この読点は何?日本語不自由なの?
>>37 select tbl1.col,tbl2.col・・・ で普通に取れるけど・・・。
又は、tbl1.col as some1,tbl2.col as some2 みたいにするか。
この方法だと後ろで、where,having,group by,order byとかも自由自在。
(たしかにselect *で取ると、結果一覧には、同名のカラムで出力されるけど。)
38 :NAME IS NULL:2008/06/20(金) 23:35:19 ID:???
。。。←この読点は何?日本語不自由なの?
39 :NAME IS NULL:2008/06/21(土) 00:01:28 ID:???
>>38 そりゃ句点だ。
44 :
NAME IS NULL :2008/06/21(土) 09:10:40 ID:pOUskDmd
MyISAMで作ったテーブルって、1000万行(3GB以上)になると、 頻繁に壊れますね。REPAIRで修復していたのですが、 ついにその修復も不能のなってしまって、相当落ち込みました。 これからは、すべてのテーブルをInnodbにするつもりなのですが、 Innodbでも修復不能になった経験お持ちの方はいらっしゃいますか? ぜひ、経験談をお聞きしたいです。
修復不可能ってマジっすか!? 怖いなぁ・・・・
>>42 おお、サンクス。
そうなのか、知らなかったぜ。
しかし新しいレポをちょっと見に行ったけど、今までみたいにバージョンリリースごとにあった
Tagで検索したり指定したりするやり方が出来るのかようわからん。(全部リビジョン番号みたいのになってる)
それに5.1のディレクトリがバラバラになってて、どれ取って来ていいかわからん。
(前もいくつかに分かれてたけど、一応メインと思われる、mysql-5.1/ってのがあったと思うんだが)
>>29-30 にしても
>>46 にしても
M y S Q L の リ リ ー ス の 分 か り に く さ は 異 常
ibdata1のサイズが大きくなりすぎたので、 innodb_file_per_tableオプションをつけて、 テーブルごとにデータファイルを作成するようにしました。 DB内のすべてのテーブルをalter table table_name engine=innodbを 実行して、すべてのテーブルにデータファイルができていることを確認しました。 ところが、それでもいまだにibdata1のファイルの更新が続いています。 もう、使っている箇所はないと思うのですが、勝手に消してしまってもかまわないのでしょうか? 宜しくお願いします。
49 :
NAME IS NULL :2008/06/22(日) 22:00:12 ID:SOmTnHfg
DELETEのあと、AUTO-INCREMENTは加算されっぱなしだよね? 消した分だけ減らしたいんだけどいい方法ない?
>>48 ソース見失ってしまったが
たしか消しちゃだめのはず
>>48 ibdataファイルには、テーブルの実データだけでなく、ほかに色々な情報が入ってたはずなんで、消したらダメ。
どうしても気になるって言うんなら、一旦現状の全データをdumpしつつ、mysqldを停止して
my.cnf(my.ini)でibddataのファイルサイズを小さく設定して(でもゼロには出来なかったはず。最低いくらだったか忘れた)
再度全テーブルを構築し直す、ってくらいしかないんじゃないか。
(それでも多分、小さくなったibdataファイルに、いくらかの読み書きは発生すると思うけど)
>>49 これも上のと似たような話になるけど、deleteした後必要な部分だけdump→truncateでtable再作成
→(auto_incrementカラム以外の)データ再インポート
ってやりかたなら出来なくもないけど、メンドクセすぎか。(人間的にも、マシン、ソフト的にも)
それにこのやり方だと、消したところのレコード番が飛び飛びになってる行は、その値が変わってしまう。
その消した(飛び飛びになった)行番を再利用したい ってことなら、それはauto_incrementの特性上不可能。
Falconに期待
最近のリリースではMyISAMじゃなくてInnoDBがデフォルトになってるのね。 それだけ、(多機能だっていうだけじゃなくて)スピード面でもInnoDBが進歩したってこと?
innodbって普通のファイルコピーでバックアップできないのが嫌 使ってる人バックアップツール買ってんの?
> innodbって普通のファイルコピーでバックアップできないのが嫌 > 使ってる人バックアップツール買ってんの? レプリケーションすればいいだろ。
mysqlのDNS処理部分に詳しい人情報きぼんぬです。
Linuxサーバにipalias で eth0に複数IP割り当てて
全部逆引きで hoge.example.jp と設定しました。
nslookupなどで逆引きチェックなどを行っても設定した
全IPで正常に逆引きが行える。
しかし、どうしても mysqlの認証で
[email protected] というユーザの認証がクリアできません。
Host '(IPアドレス)' is not allowed to connect to this MySQL server
とか表示されちゃう。
そのmysqlサーバからnslookupなどを行ってももちろん該当IPの
逆引きはできてる。でもなぜかmysqlサーバだけちゃんと名前解決しようと
しない。
ためしにuser@(IPアドレス)ってやったら問題なくログインできる。
とりあえず名前解決の問題ということは断言できる状態です。
あとは
/etc/hostsをいじったり
/etc/resolv.conf を何回もチェックしたり、別DNSに変えたり
繰り返してますがかなりはまってます。
どなたかヘルプミー
use mysql; select user,host from user; select user,host from db; として、user,hoge.example.jp とuser,host のフィールドに出てますか。
58 :
56 :2008/06/26(木) 21:53:10 ID:???
select user,host from user; こっちなら出ます。 select user,host from db; こっちでは作成してあるDBが出ます
>>56 ちゃんと hoge.example.jp が正引きできてる?
あとは、skip-name-resolve で mysqld が動いているというオチとか…。
◆◆◆◆◆毎日新聞社による日本人女性への誹謗中傷◆◆◆◆◆
・母親は受験勉強をする息子の学力向上のためにフェラチオをする
・日本人女性の55%は、出会ったその日に男と寝る
・ファストフードは女子高生たちを性的狂乱状態におとしいれる
・ティーンたちはバイアグラを使ってウサギのようにセックスをする
・女子高生は、刺激のためにノーブラ・ノーパンになる
・日本の最新の流行 : 70歳の売春婦
・老人の売春婦の人気にもかかわらず、日本では小学生の売春婦にも仕事がある
・日本の若い看護婦は売春婦に勝る
・24時間オルガズムが止まらない病気で苦しむ日本人女性の数が増えている
・15未満の子供を対象とした疑似ポルノが日本に蔓延している
・OLの72%が、セックスをより堪能するために何らかのトレーニングを受けている
・人妻は気分転換の目的で昔の恋人に抱かれに行く
・主婦は郊外のコイン・シャワーで売春をしている
・日本男子は柔道や空手の部活で男相手に童貞を捨てている
・ほとんどすべての漁師は海でマンタとSEXしている
・まだ10代の少年から退職した老人までみんな2980円の手コキを利用している
・六本木のあるレストランでは、食事の前にその材料となる動物と獣姦する
※同社が全年齢向けコーナーで七年以上にわたり世界に向けて配信していたものの一部です
※同社の行為は日本人への偏見や人種差別、婦女暴行、幼児虐待を助長するものです
◆毎日新聞の英語版サイトがひどすぎる まとめ@wiki
http://www9.atwiki.jp/mainichiwaiwai/ ◆毎日新聞問題の情報集積wiki
http://www8.atwiki.jp/mainichi-matome/ つまり日本国民は
http://www.vipper.net/vip552788.jpg
select TIMEDIFF('2008-07-02 10:00:00','2008-07-02 10:00:01'); は -00:00:01なんですが、 select TIMEDIFF('2008-06-13 10:20:06','2008-06-13 10:25:00')>=0; は1になります これって勝手に0に丸められてるってことですか? select TIMEDIFF('2008-07-02 10:00:00','2008-07-02 11:00:00')>=0; →0 select TIMEDIFF('2008-07-02 10:00:00','2008-07-02 10:01:00')>=0; →1 挙動が理解できん・・・
62 :
NAME IS NULL :2008/07/02(水) 12:11:28 ID:t4YEzj5m
質問です phpmyadmin 2.11.7にて MySQL5.0のデーターベースを作成しようとしたら phpmyadminからパスワードを入力した後 新規作成から作ろうと思ったら、またログイン画面に戻ってしまいます 作成してあるデーターベースから選択して開いても またログインページに戻り再度passを入れたら中身が見れるようになってます 突然起こった現象なんですが apacheにてショッピングカートのwebアプリを起動してます 何卒対策があればお願いしますorz
63 :
NAME IS NULL :2008/07/02(水) 17:37:32 ID:AFk/IFVn
テーブル名を ` で囲わないとselect文で検索出来ません。 どこの設定がおかしいのでしょうか?
>>63 テーブル名になにか記号入ってない?
-(ハイフン)とか
>>62 >>62 あてずっぽだけどphpMyAdminの認証方法はどうしてますか?
例えばcookieにしてたら、それが途切れてログインページにとばされるとか。
通常の使用でも一定時間操作しないでいると、クッキーの有効期限がきれて
ログインページにとばされたと記憶
66 :
63 :2008/07/02(水) 18:22:27 ID:AFk/IFVn
>>64 ご助言ありがとうございます。
小文字の英字3文字です。『day』みたいな感じです。
>>65 返信ありがとうございます
ずばりそれだと思います!phpmyadminの.iniも
cookieの設定にしてあります
MYSQLにてショッピングカートを使っていたんですが
そちらの管理画面にもログインできなかったので一度
HDDに残っていたクッキーを全て削除してから
不具合が生じてきてしまっている状態です
今もサイトで調べているんですが全く分からなくて
解決策などあれば何卒お願い致します
ワロタ。プログラム未経験者だな
>>66 「day」みたいな…じゃなくて、本当のテーブル名を書くのが吉。たぶん予約語。
MySQLからSunと合体したっていうメールが来た。ビックラこいた。
GRANT ALL PRIVILEGES ON monmon.* TO 'user1'@'192.%' IDENTIFIED BY 'hogehoge'; と設定したらこれは192.0.0.0/255.0.0.0からアクセスOKということですよね?
質問です。 1週間ほど前からサーバーの反応が異常に遅くなり、2日ほど原因を調べていたところ MySQLへのログインに時間がかかっているということまでわかったのですが、 どうすればよいかわかりません。 もうひとつ、sockstatすると外部からmysqlのポートにアクセスしている形跡があります おたすけを。。
開いたままのプロセスが沢山溜まっているとか /usr/bin/mysqladmin -u root -p processlist 原因は、バグとか DoS とか、さまざま >もうひとつ、sockstatすると外部からmysqlのポートにアクセスしている形跡があります そもそも、どうして「外部」に向けてmysqld のポートを開けてあるんだろう。 (「外部」って、www サーバとかじゃないよね?)
>74 ありがとうございます。 特にプロセスが溜まっているということはありませんでした。 >そもそも、どうして「外部」に向けて 以前外から使う必要があり開けていて、今回整理したのですが、 それでもまだsockstatにのっているのですよね。。。 auth.log Jul 4 12:53:40 s1 mysqld[48007]: refused connect from 219.101.151.95 Jul 4 12:54:00 s1 mysqld[48007]: refused connect from 219.101.151.95 Jul 4 12:56:00 s1 last message repeated 6 times はぁ。。 MySQL 5.1.25-rc
以前だろうが何だろうが、穴を開けること自体が間違っている。 平文パスワード垂れ流しですよ? API化するか、せめてVPNに乗せるべきだ。
RHEL4 上 の MySQL を 4.1.20 から 5.0.62 にアップグレードしたのですが、 起動時、ログに下記のようなエラーが出るようになりました。 [Warning] option 'max_join_size': unsigned value 18446744073709551615 adjusted to 4294967295 4294967295 は 4.1.20 の頃からのデフォルト値ですが、 18446744073709551615 という数値が一体どこから出てきたのかが分かりません。 (18446744073709551615 が符号無しの値だから 4294967295 にしちゃうね! みたいなことを言われてるのは分かるのですが。) コンフィグファイルや起動オプションでも渡していないですし、 show (global) variables like 'max_join_size'; で見ても 4294967295 がセットされてます。 この警告について解消法等ご存じないですか?
78 :
NAME IS NULL :2008/07/04(金) 15:20:58 ID:UOBy4rbU
先日、サーバ(Win/XAMPP)そのものが物理的に壊れてしまい、 データ復旧するため途方にくれております。 サルベージしたところ、 \xampp\mysql\dataは、そのまま残っているようですが、 これを別の同名フォルダに入れてしまえば、同じようなデータベースが作られるのでしょうか? 破損が怖くて試せません。 どうか詳しい方、お力を貸して下さい。
show variables like 'sql_big_selects'; が OFF になっているのかも。 >show (global) variables like 'max_join_size'; >で見ても 4294967295 がセットされてます。 それは「adjusted」された後の値だから当然。
>>75 localhost のみで良いなら
[mysqld]
bind-address = 127.0.0.1
port = 3306
socket = /tmp/mysql.sock
だな。他にもルータで遮断するとか OS のパケットフィルタ使うとかあるでしょ。
> サルベージしたところ、 > \xampp\mysql\dataは、そのまま残っているようですが、 > これを別の同名フォルダに入れてしまえば、同じようなデータベースが作られるのでしょうか? > 破損が怖くて試せません。 そのディレクトリを DVD-R とかに焼くといいよ。 そしたら気が済むまでチェックできるでしょ!
>>79 sql_big_selects は ON になっていました。
また、起動オプションや my.cnf 上でmax_join_size の値を他の値(100000 とか)に
指定して起動してもログに全く同じエラーが出力されますが、
show variable で見ると、値自体は指定したもの(100000 とか)になっています。
tab_name ------------------- id int auto_increment name varchar(255) not null name_kana varchar(255) not null ------------------- tab_tag ------------------- tid int auto_increment id int not null str varchar(255) not null ------------------- こんなテーブルで人物ごとにタギングされているとして 検索時に取得する際、マッチしたデータとマッチした数を取り出したいのですがどうすれば効率的でしょうか? 以下のようにデータは取れるのですが、マッチした数(最大数として保持したい)のためにもう一度、like検索するのはあまり効率的でない気がするので・・・ select n.id,name from tab_name n, t_tag t where n.id = t.id and (str like %hoge% || str_name like %hoge% || str_name_kana like %hoge%);
>>82 それ、自分のとこでも5.0.50のころあたりから出てる。(CentOS4のsrpm.specをベースに自前で
ビルド)
manualとかにも詳しく載ってないのではっきりとは断言できないけど、
4294967295 とゆう数値は、unsigned int(32)の上限値(4G)で、
18446744073709551615 は、unsigned int(64) (一般的に u long long)の上限値(16E、4G*4G)
のこと。
(ちょっとプログラミングでもかじった事あるなら、ピンと来るはず)
で、max_join_sizeは、一回の結合クエリで保持できる最大データサイズのことだけど、
どこかのバージョンアップの際に、ソースコード上での指定が、uint_32からuint_64に変わった
んではないか。
i386(i686)ベースのアーキテクチャでは、事実上4G以上のデータをメモリに確保することが出来
ないので、
"最大サイズを4Gに制限したよ"みたいな警告が起動時に出るようになったんではないかと思う。
(swapがどうとかではなく、そのプロセスが保持できるポインタサイズが32bitなので、4G以上の
領域にアクセス出来ない)
自分も以前、コンバイルオプション等を色々調べて、これがどうなってるか探したことがあるん
だけど、
mysqldだけの問題ではなくて、kernelやglibcの制限なんかも絡んできそうなので、
結局basearchがi386系の時は、これは出るものなんだと思ってあきらめた。
x86-64や、PAE-kernel使用時ではどうなるかは確認してない。
(cpuはx64対応持ってるけど、メモリを4G以上搭載出来るマシンがすぐに用意できない・・。い
ずれはやってみたいけど)
85 :
84 :2008/07/04(金) 18:55:24 ID:???
現在PCのプロバからは書き込み規制中なんで、携帯からカキコ。 改行が変になっちった。
>>83 >以下のようにデータは取れるのですが
その select 文や where 句、通るの ?
t_tag, str_name, str_name_kana とか、謎のフィールドもあるし…
あ
5.1の全文検索って全角だろうが頭についてる記号無視するようになったのな 固有名詞だと頭が記号のやつ結構あるのでこれ仕様だったら安定版出ても5.0からのりかえられない せっかく速かったのになあ
92 :
83 :2008/07/05(土) 14:19:00 ID:???
>>87 すみません。
間違えました
(str like %hoge% || name like %hoge% || name_kana like %hoge%);
でした。
別テーブルにカウント数を保存しておくくらいしか手はないでしょうか?
頻繁にアクセスするなら memcached とかでキャッシュすればよくね。
memcachedは不安定という印象しか無いのは某サイトのせい
某サイトってどこ?
96 :
NAME IS NULL :2008/07/05(土) 16:43:20 ID:fvlvnh8l
memcachedとMEMORYテーブル使うなら、どっちがパフォーマンスがいいですか? 以前MEMORYテーブルを使ったことがあるのですが、MEMORYテーブルなのに、 SELECT文(INDEXあり、8万行)が0.2秒もかかったことがあって、遅いことに驚いたのですが。 memcachedに接続する際のコストを考えると、どうかという気もしますが、 本当に速いのか知りたいです。
97 :
NAME IS NULL :2008/07/06(日) 08:44:47 ID:KAV48epf
質問です、 DBはMYSQLで以下のテーブルがあるとします。 T1 id_1,id_2 T2 id_1,id_3 T1とT2はid_1より紐付いています。(1対1) 今、T1を更新したいのですが、 条件が T1のid_2とT2のid_3を比較して、 異なればT1のid_2を T2のid_3に更新するというものなのですが、 これを一回のSQL(UPDATE)では出来ないものでしょうか?
update t1 left join t2 using(id_1) set id_2 = id_3 where (NOT id_2 = id_3); ただし、t2 にあってt1にない項目はupdateされません。
99 :
NAME IS NULL :2008/07/06(日) 15:07:40 ID:HJBLqAyo
↑ ちなみに using句のid_1で T2のid_1のカラム名がid だったらどうすればいいですか?
100 :
NAME IS NULL :2008/07/06(日) 15:14:45 ID:d5c64NH+
始めたばかりなんですが、ファイルからデータを読み込むときに file not found のエラーがでます。ファイル自体はちゃんと置いてあるのですが、考えられるエラーの理由はなんでしょうか…
101 :
田中さん :2008/07/06(日) 19:33:52 ID:pcnIKAGY
エヴァンゲリオンにあわせた曲(バンプのアルエ)みたいな曲ないですか
102 :
田中さん :2008/07/06(日) 19:37:09 ID:pcnIKAGY
j-popではなくても大丈夫です
2つのテーブルからマッチする値をとる際、1テーブル(one)のidの値とマッチしないid番号のみ2テーブル(two)からマッチするかチェックさせたいのですがどのようにできるでしょうか? select * from one where id like '%hoge%' これでマッチしない値 select * from one_option sub_id like '%hoge%' できれば1文で結合したいです。 お願いいたします。
not existsでぐぐれ
105 :
NAME IS NULL :2008/07/08(火) 21:15:35 ID:1C8T6mT4
クライアント端末からサーバにVB.NETでMySQLのテーブルを検索しようとすると Unable to connect to any of the specified MySQL hosts のエラーが出ます。 なにかクライアント側で設定がたりないのでしょうか?
なぜかrootの権限消失してしまって、何度インスコしなおしても戻らん。 OSから入れなおしか?
何言っているの?定義ファイルが壊れているだけだろ。何回インストールしてもだめだろ。
108 :
NAME IS NULL :2008/07/08(火) 21:56:47 ID:OZY8zwK5
linux上で使っているけど各データのサイズはどうやって確認出来る? っていうかどこに格納されてる?ファイルシステム自体が違うのかな? /var/lib/mysql/データベース名/テーブル名.frm は行数違っても全部8.5Kって表示されてる(ls -lh) だれか教えてくれ
色々と意味不明。エスパー頼む
111 :
108 :2008/07/08(火) 22:09:25 ID:OZY8zwK5
あーすまん。適当に書きすぎた 初歩の初歩なのだが linux上でmysqlにアクセスしていろいろとデータ追加したりしている で、mysql上で追加したり削除したりすることがディスクにどれだけ 負担になっているか調べたいのだが、どこにデータが格納されているのか よくわからん。 /var/lib/mysql/データベース名/ 以下に作ったテーブル名.frm っていうファイルがあるが、ls -lhでそれらのサイズを見ても 全部8.5Kだったから、たぶんデータそのものじゃない(データのサイズは 明らかに違うはず) っつーことで、どこを見たらそういう情報見れるかな?っていう 質問です。わかりづらくてすまん
>>111 そこまで行ってるのになぜ気づかん?
*.frm以外に、.MYIと.MYDっつう拡張子のファイルがあるはずだが・・・。
それが各テーブルの実データとインデックスデータ。
(TableType=MyISAMの時)
と思ったが、最近のリリースではひょっとして、create table時に何の指定もしなかったら、
デフォでInnoDBになってたりるする??
(それでもそれまでに気づきそうなもんだけど・・)
だとしたら、/var/lib/mysql/以下に、idbdata1って名前のファイルがあると思う。
これが(my.cnf等で特に指定してなかった場合)そのDB上でのInnodbテーブルの全データ(Index含む)。
多分ないと思うけど、もしそれ以外のTableTypeだった場合は、以下の各テーブルタイプごとのdocumentを読んでくれ。
http://dev.mysql.com/doc/refman/5.1/ja/storage-engines.html
113 :
NAME IS NULL :2008/07/09(水) 11:43:08 ID:NB51E0O1
SQLServer2005からMySQLにMySQL Migration Toolkit を使って移行しようと思ったのですが、SQLserverに ツールからコネクションが張れません。 なぜでしょうか?
114 :
NAME IS NULL :2008/07/09(水) 16:49:45 ID:n8bO8kHt
質問です。 WebサイトのコンテンツをMovableTypeを使って、MySQLデータベースに 格納しようと思っています。 一方、クライアントが入力したデータもMySQLデータベースに保存しよ うと思っています。 こういう場合、MySQLデータベースは、各々、別のデータベースに 分けた方が良いのでしょうか。 それとも一つのデータベースに、両方格納しても問題ないのでしょうか。 よろしくお願いします。
>>114 判断に必要な情報が足りていない。
【クライアントが入力したデータ】とやらの性質が分からない限りなんともいえない。
116 :
108 :2008/07/09(水) 17:32:35 ID:1CS4UrgO
> 112 教えてくれてありがとう .MYD と.MVIは/var/lib/mysql/mysql以下にたくさんあった。 でもデフォルトでinnodb使うようにしてる。トランザクション処理 使いたいから っでたしかにidbdata1っていうファイルが、それらしき大きさだった。 たぶん実体はこれだろう。っでも、なんかls とかduとかでファイルサイズ を確認しようとしても、そこへの反映が遅い。っで、わすれたころに 30MB増えたりして、わかりづらい。。。
パフォーマンス考えれば、ちまちま容量増やすわけ無いじゃんw
>>116 詳しくはdocumenをt読んで、だけど、InnoDBの場合、my.cnf等で特定の指定をしてなかった場合、
データが増えてidbdataの容量がなくなる(少なくなる)と、自動で容量を拡大する。(autoextend)
で、いったんデカくなってしまったファイルは、その後Tableデータを削除したり、DB、Tableそのものを削除してしまっても
増えたまま。例えば一回100MBのTable使って、idbdataが100MB超になった場合は、
そのTableをdeleteしようがtruncateしようがdropしようがidbdata自体の(ファイルシステム上の)サイズは変わらない。
なので、実際に現在どれだけ使用中かを知るためには、mysqldにloginして、show table statusなんかをする。
(MyISAMなら、Tableサイズの変更とともに、実体ファイルも容量も増減するんだけど)
>>117 デフォルト設定のままでは、10MBごとにファイル容量を拡張するようになってる。
これをどう感じるかは人それぞれだと思うけど、一気に数十Mとか数百Mとか増やすのでなければ
10Mづつ増えて行くので、自分にとってはチマチマ増えてるように感じる。
119 :
108 :2008/07/09(水) 21:55:11 ID:1CS4UrgO
>>118 すげー親切にありがとう。テーブルサイズの変更っていうか
テーブル自体削除したりしても、idbdata1のサイズが変わらん
から、???だった。
初心者でなんもわからんくてすまん。ドキュメント読んでくるわ
120 :
114 :2008/07/10(木) 14:05:34 ID:3Id/4UG0
>>115 レスありがとうございます。
「問い合わせフォーム」からの入力データ(氏名、メールアドレス、
問い合わせ内容等)です。
よろしくお願いします。
121 :
NAME IS NULL :2008/07/10(木) 14:24:52 ID:VzcOpQyE
122 :
NAME IS NULL :2008/07/10(木) 14:29:03 ID:VzcOpQyE
>>120 すべてについて常識の範囲内で想定するとしてだ。
単純に、コスト(金と手間)とセキュリティリスクの見合いになると思うなぁ。
最大でも数万レコード程度にしかならず、
かつ何らかの操作ミス等で漏洩しても許容できるような内容なら
統合しといたほうがいいと思う。
このレベルを超えるなら、こんな所で聞いてないで信頼できるベンダーに外注しなさい。
124 :
120 :2008/07/11(金) 13:09:27 ID:TCuAt9gA
5.1.26出たけどまだRCなのか 最初に出すって言ってからもうすぐ1年だよ いつGAになるんだ
127 :
NAME IS NULL :2008/07/13(日) 15:05:50 ID:nXfDUouf
インデックスの名前空間ってテーブル名と一緒だっけ?テーブル毎?
URLをストアドファンクションでインサートしているんですが問題が発生しています。
以下のストアドなんですが、
http://example.com/hogehogeからアクセスがあった場合 、
http://example.com/ http://example.com/hogehoge の二つをカウントアップしているようです。
http://example.com/hogehogeのみカウントアップさせたいのですがなにが間違っているのでしょうか ?
CREATE FUNCTION f_logging_referer(
f_page_id INT,
f_url TEXT,
f_device VARCHAR(100)
) RETURNS INT
BEGIN
declare _uid INT DEFAULT 0;
select url_id into _uid from t_url where str_url = f_url;
if _uid < 1 then
return 0;
end if;
-- 最後のアクセス更新 (同じページIDが存在したらUPDATE)
insert into t_url_lastlog(`page_id`,`str_url`,`str_device`) values (`f_page_id`,`f_url`,`f_device`)
on duplicate key update `str_url` = `f_url`,`str_device` = `f_device`;
// URLをカウントアップ
select 1 into cnt from t_url_count where str_url = f_url and page_id = f_page_id;
if cnt = 1 then
update t_url_count set `num_count` = num_count+1 where `num_refmonth_id` = `s_rnid`;
else
insert into t_url_count(page_id,str_url,num_count) values(f_page_id,f_url,1);
END iF;
return 1;
END;
129 :
NAME IS NULL :2008/07/16(水) 16:01:35 ID:MQlNhFey
レプリケーションを導入してみようか検討しているのですが、 レプリケーションすることによって、今までのDBのパフォーマンスが どれ位劣化するのでしょうか?10%、20%程度なら許容できるのですが、 50%も劣化するならあきらめざるを得ません。 毎日1000万件を超えるSQLを発行していますが、更新系:参照系=1:2くらいです。 アドバイスを頂けると助かります。よろしくお願いします。
ごくごく単純に言って、 マスタには書き込んだ分の読み取りが発生するので、読み取り量が1.5倍になる。読み取りを均等に分散させるとして、1:2のまま。 スレーブには書き込んだ分の書き込みが発生するので、読み取りを均等に分散させるとして、1:1になる。 ところで、そもそも君は何故レプリケーションする必要に迫られているか? パフォーマンスの問題を解決したいなら、オーバーヘッド分を犠牲にしてでもレプリケーションするべきだろう。 フェイルオーバーしたいなら、オーバーヘッド分を犠牲にしてでもレプリケーションするべきだろう。 つまり君には、レプリケーションのオーバーヘッドに関わらず、 もはやレプリケーションする道しか残されていないのです。 ただ、単純なレプリケーションでは更新の分散はできないので、1:2なんつー状況で打てる手は少ないと思う。 マスタの分割をセットで考えたほうがいいだろう。
5.1はいつGAになるんですか? Sunに買収されたんだしロードマップくらい用意して欲しいです。 そろそろ出るって言われ続けて相当引っ張ったWindows NT 5.0 (Windows 2000)を思い出します。10年位前の話。
春のカンファレンスで2008Q1って言ってたんだよね 出ませんでしたが。 仕事に影響あるので困る。
133 :
NAME IS NULL :2008/07/17(木) 14:04:47 ID:pK0TIE4w
自宅サーバでMYSQLを使ってサイトを運用しているのですが レコード数が400,000件を超えたあたりから急激に重くなりデータが取り出せない場合が出てきました。 インデックス指定しているカラムから検索し、LIMIT 1で取り出すことは今まで通り可能なのですが データベース全体をファイルに出力しようと SELECT * FROM xxx LIMIT 0, 100; のように順番にクエリを投げるスクリプトを作りました。 するとLIMIT 40000, 100 くらいからMYSQLが重くなり 結果の返還が以上に遅くなります。 対策や原因等、調べてみましたが、これかと思われるものが見当たりませんでした。 ご存知の方が居ましたら、教えていただけないでしょうか?
134 :
NAME IS NULL :2008/07/17(木) 23:53:25 ID:5bq+nAdm
データ抽出の開始行の40000番目のレコードを見つけるのに時間がかかってるんじゃない? 開始行の番号が小さいうちは気にならないけど、番号が大きくなるとそれだけHDDの走査対象が増えるからだと思います。
>>133 ORDER BYを指定しないと戻り値のソート順は不定じゃないの?
フルスキャンするのにテンポラリが作られてたりして。
インデックス付きのカラムを指定してみてはいかがだろうか。
インデックススキャンで済めば、そんなにかからないだろ。
137 :
133 :2008/07/19(土) 12:34:09 ID:???
133です。
>>134 言われる通りっぽいです。
根拠はありませんが、何も指定しない状態でレコードを抽出すると
その行までのデータをシークしていく様子ですね。
>>136 LIMITで指定せずにORDER BYでインデックス付きのカラムから指定したら
正常に取り出せました。
ありがとうございます!
ソートしていたら、基地外なほど応答がなかったのでソート外したんです。
すると、やや速度は上がったのですが今回のようになりました。
取り出される結果自体は、多分データベースに追加した順番でしたので
全部を参照するだけであれば問題ないはずだったのですが
やはりインデックス付きのid用カラムを使用するべきですよね。
はじめからidを振っていなかったので400,000件のデータに追加できずに
データ初期化する事になりましたが、解決できました。
ありがとうございました。
138 :
NAME IS NULL :2008/07/19(土) 16:37:09 ID:Hnv1ifd6
助けてください。 php上で、200万件ほどあるテーブルでdeleteしたところ、 30分たっても終わらないので、mysqladminでそのクエリーをkillしました。 さらに30分たとうが1時間たとうが、該当するクエリーはkilledのまま残り、 mysql restart することにしました。すると、以下のエラーが表示され失敗します。 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) mysql stop mysql start いずれも同じ結果で、/var/lib/mysql/mysql.sockファイルは存在しません。 ps ax |grep mysql してみると、 /usr/bin/mysqld_safe /usr/libexec/mysqld は動いているようです。 ためしに0バイトの/var/lib/mysql/mysql.sockを作成しましたが、やはり結果は同じでした。 どなたか助けてください。
reboot
>>138 ttp://www.hi-ho.ne.jp/tsumiki/book_sup2.html なんらかの理由でソケットファイルが削除されている
最後に、ソケットファイルが削除されている場合があります。
この場合、MySQLサーバーを一旦シャットダウンして再起動をかけるとソケットファイルが復元されます。
※ MySQL標準のクライアントプログラムはオプション--hostでIPアドレスを指定すると、
非ソケットファイル経由での接続が行われます。
例えば次のようなコマンドでMySQLサーバーをシャットダウンして下さい。
mysqladmin --host=192.168.10.100 shutdown
もし、これでもソケットファイルが作成されない場合は
ソケットファイル格納ディレクトリのパーミションの問題が考えられます。
ソケットを作成できない場合はMySQLのエラーログが出力されるのでそれを参考にして下さい。
141 :
NAME IS NULL :2008/07/21(月) 18:36:43 ID:A9N+vOIY
質問させて下さい。 MySQL5.0.51a、Linuxを使用しています。 以下のような場合に `i_img_no` `i_img_disp` を取得したいと思っています。 取得条件は各`i_img_cat_no`の中から一番、数値の低いi_img_dispを持つ`i_img_no`と`i_img_disp`を取得と言った具合です。 CREATE TABLE `i_img` ( `i_img_no` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'No', `i_img_cat_no` int(4) unsigned NOT NULL default '0' COMMENT '画像カテゴリNO', `i_img_name` varchar(32) NOT NULL default '' COMMENT '画像名', `i_img_url` varchar(255) UNIQUE NOT NULL default '' COMMENT '画像URL', `i_img_disp` int(10) unsigned NOT NULL default '0' COMMENT '表示回数', `i_img_up_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新日時', `i_img_reg_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '登録日時', `i_img_del_flg` TINYINT NOT NULL DEFAULT '0' COMMENT '削除フラグ 0=未削除 1=論理削除 2=一時削除' ) ENGINE = innodb CHARACTER SET ujis COLLATE ujis_japanese_ci COMMENT '画像表示情報'; i_img ( 他のカラムは長いので省略 ) --------------------------- i_img_no i_img_cat_no i_img_disp 1 1 3 2 1 10 3 1 20 4 2 10 5 2 30 .... x 2 5 --------------------------- 上記であれば、以下の結果を取得したいのです。 --------------------------- i_img_no i_img_cat_no i_img_disp 3 1 20 5 2 30 --------------------------- ドキュメント等を見て SELECT MAX(`i_img_disp`), `i_img_no` FROM `i_img` WHERE `i_img_del_flg` = 0 GROUP BY `i_img_cat_no` としてみたのですが、これではMAX(`i_img_disp`)時の`i_img_no`を取得してくれず 二つのカラムの関係が非同期になってしまいます。 何か上手くいく方法はないものかと、 GROUP BY `i_img_cat_no` ORDER BY MAX(`i_img_disp`) ASC や GROUP BY `i_img_cat_no` ORDER BY MAX(COUNT(`i_img_disp`)) ASC や SELECT MAX(`i_img_disp`, `i_img_no`) 等も試してみたのですが、構文エラーや思った結果が得られず行き詰まっております。 どうかお力添え頂けないでしょうか。 宜しくお願い致します。
副問い合わせの基本パターンだ。 select i_img_no, i_img_cat_no, i_img_disp from i_img img1 where i_img_disp = ( select max(i_img_disp) from i_img img2 where img1.i_img_cat_no = img2.i_img_cat_no ); がんばって覚えてね
143 :
141 :2008/07/22(火) 03:05:50 ID:???
>>142 レス有り難う御座います。
早速試しながら調べてみます。
>>141 >としてみたのですが、これではMAX(`i_img_disp`)時の`i_img_no`を取得してくれず
それより、その select は普通のSQLではエラーになるので、御注意。
普通の SQL では、group by があるときは、group by の対象フィールドか、集計関数の結果しか select できないので。
23k程度のファイルの内容(文字列)をTEXT型のカラムに保存しようとしています。(UTF-8) ですが、INSERTすると途中までしか入りません。 UTF-8なので3byteになる文字があるとはいえ、 TEXTの上限である約65kに収まらない理由がピンと来ません。 厳密には内容によって変わると思いますが 23kのファイルがTEXT型には収まらない可能性はある、といった経験則のある方いらっしゃいますか? また、収まらないのであればmediumtextかと思ってるのですが、上限がかなり大きいです。 MySQLでデータ型を決めるとき、大容量のデータ型のカラムを確保しておくだけでロスが生じる、 ということはないと考えて大丈夫でしょうか? プログラムでINTかLONGかで確保するメモリが違うというような意味合いなんですが・・・
んとね、MySQLでは照合順序がUTF8のときは、全ての文字が3byteになるの。 よって、入らないというのが正解で、正常す。 大容量のデータ型だと、確かInnoDBでは超無駄になったと思う。 フルテキストインデックス使わないならTEXT型のメリットって知れてるし、 バイナリとして格納しちゃえば?
>>135 おー、やっとか!
せめていつGAになるかがもっと早く分かってれば来年春に稼動予定のシステムで
5.1を採用したんだけどなぁ。結局5.0で進めることに先月決定した。
お願いメールも見たよ。鶏か卵かみたいな話になるけど、GAって名前にならないと
ユーザーは増えないと思う。
148 :
145 :2008/07/23(水) 08:28:34 ID:???
>>146 半角の英字なども3バイトなんですね。
とはいえ23kが単純に3倍になるわけでもないはずと思って調べていたんですが
やっぱりただの容量の上限オーバーだったようでした。
バイナリの方も参考に試してみたのですが、当面mediumtextで行くことにしました。
ほぼ素人判断なんですけど、照合順序をutf8_unicode_ciにする必要があって・・
バイナリだとその辺の取扱いが違ってきますよね。
>InnoDBでは超無駄になったと思う
これがすごく気になる〜・・・まさにInnoDBなので。
情報を探したのですが今のとこ見つからなかったため、念頭に置きつつ、今後確認したいと思います。
ありがとうございました!
149 :
NAME IS NULL :2008/07/23(水) 11:09:43 ID:SYdki5t2
質問させていただきます SQLで既存のテーブルに新しくフィールドを追加しました。 最初はnullなのでそこにデータを入れたいのですが、ファイルから一度に出力させることは出来ないでしょうか? わかりにくくてすいませんが 他のフィールドにはすでにデータが入っていて、新しいフィールドにはなにもない状況。 新しいフィールドに入れるデータはテキスト形式であるので、 load data infile,,,,としたいのですが、特定のフィールドのみにテキストからデータを挿入するやり方がわからずに質問させていただきました
? テキストを整形して 新しいフィールドだけをUPDATEするSQLの塊を作って流し込めばいいじゃない。 もしくは、運用中でなければ 別テーブルに全部流し込んでおいて、 現行テーブルを削除→別テーブルをリネームで、そっくり入れ換えるとか。
?? そのフィールドに入る値は、全レコードで共通なの? レコードごとに違うなら、きちんとキーを見て update するなりしないと、無茶苦茶になるのでは…
レスありがとうございます。恥ずかしながらSQLはほとんど初心者で、今まではJavaでデータベースをいじってました。
今回数百万以上のデータをプリペアステートメントで流し込もうとしたら、恒例の
OUT OF MEMORY
解放など、コードを書き換えるより直接データを入れようと思い・・・
データはテキストを順番に上から入れていけば既存データと一致します。
>>150 テーブルを結合させると言う感じでしょうか?
やっぱりSQLも本かって学ばないとダメですね・・・
>データはテキストを順番に上から入れていけば既存データと一致します。 まず、その「順番に」という処が、大いに問題でね… データを入れた「順番」が、(auto_increment とか他の何かの)キーで残っているならいいが、 そうでないなら、その「順番」自体は、データベース上では分からない、という事が分かってるか ?
Excelと混同してるな。 MySQLにおいてすべてのデータは、順不同で格納されている。 ORDER BYを指定して抽出しない限り、結果の順序は保証されない。 格納順に抽出できているように見えるのは、偶然に過ぎない。 よって、上から順番に入れるという処理は、順不同に入れるのと同義であります。
結合じゃなくて置き換え。 とりあえずphpMyAdminでも使ってろ。
数百万レコードですか…コワ
400万レコード突っ込んでるけど、怖くてできん。
158 :
NAME IS NULL :2008/07/24(木) 18:51:38 ID:BZXqjCKH
同じスキーマのテーブル間で差分を取るツールってありませんか? できれば異なるデータベースにある同じスキーマのテーブル間で取りたいです. レプリケーションが切れたまま動き続けてバイナリログも消えてしまい, う〜む,どうしたものか,と.
160 :
NAME IS NULL :2008/07/25(金) 06:30:19 ID:Pb40YC/J
RDBMSではレコードの順序は不定だからなぁ ORDERED してれば別だけど ダンプで得られる行の順序はやっぱり不定
161 :
NAME IS NULL :2008/07/25(金) 08:31:55 ID:Pb40YC/J
LINES って予約語だったんだ… lines って名前のテーブル作って, ことごとくアクセスに失敗するので一晩悩んだ. 皆さんそういう経験ありませんか?
sqliteから乗り換えたときに key というフィールドが作れなくてハマったけど
163 :
NAME IS NULL :2008/07/25(金) 13:42:43 ID:fXx7t9ol
バーチャルサーバに乗っけたCentOS上でmysqld_safeを実行したのですが Starting mysqld daemon with databases from /usr/data/mysql というメッセージが出たまま、シェルに復帰しないのですが どうすればいいのでしょうか? Enterキー連打とかしても戻ってきません
&
165 :
163 :2008/07/25(金) 14:05:17 ID:fXx7t9ol
>>164 引数に追加したら動きました。
すごい基本的なことなのに教えて下さってありがとうございます。
166 :
NAME IS NULL :2008/07/25(金) 19:41:50 ID:Pb40YC/J
WindowsXP環境なのですが、
公式サイトにWindows向けバイナリが複数用意されていてわからない事があるので
質問させてください。
>>1 の ここで質問をする前に、MyNAでのFAQを最初に確認しましょう。
を見て
mysql-バージョン-win.zip , mysql-バージョン-win32.zip , mysql-essential-バージョン-win32.msi
ms-win用。インストーラー付き。
インストーラーがおかしいことがあるので、こちらはあまり使わない。
mysql-バージョン-win-noinstall.zip (mysql-noinstall-バージョン-win32.zip) の方を使う。
↑上記の事は理解したので、インストーラなし版を使えばいいということはわかったのですが、
http://dev.mysql.com/downloads/mysql/5.0.html#win32 このMySQL公式サイトにインストーラ版が2種類提供されており、
Windows Essentials (x86) 22.7M
Windows ZIP/Setup.EXE (x86) 44.3M
上記二つの違いは何ですか? 同じMySQLだって言うのに 容量が二倍ぐらい違うので
不思議に思っています。ご教示宜しくお願い致します。
168 :
NAME IS NULL :2008/07/26(土) 17:45:44 ID:Lih8T0El
GUIのツールとかが同梱されているかどうかってことじゃね? あと,開発用のライブラリとかヘッダファイル群とかも.
ごめんなさい。できました。
MYSQLのどんなクエリーを発行したら良いのか分からないので教えてください。 7/26から7/25まで 7/25から7/24までの データを取り出して行数をカウントしたいんですよ 悩みましたが select * FROM テーブル WHERE BETWEEN 今日 AND 昨日 とほしい日付だけ発行しなくちゃならなくて面倒です もっと良いやりかたを教えてくださいえらい人
172 :
171 :2008/07/26(土) 23:37:25 ID:???
補足です 日付ごとの行数だけ知りたいんですよ
173 :
171 :2008/07/26(土) 23:55:18 ID:???
ちょと自分で考えました SELECT *,count(*) AS 行数合計 FROM テーブル WHERE アイディー GROUP BY 今日 < 時間 AND 昨日 >= 時間 これで今日から昨日までの合計は取れるんですが、昨日から一昨日までのも一緒にとりたいんですよ
174 :
171 :2008/07/27(日) 00:05:29 ID:???
意味がわからん。日本語で書いてくれ。 スペシャルサービスで回答しちゃうと、日付がDATE型だとして、 SELECT 日付,count(*) AS 行数合計 FROM テーブル GROUP BY 日付 ORDER BY 日付 DESC LIMIT 3 ということか?
176 :
初心者 :2008/07/27(日) 01:14:54 ID:JWwC1+cS
4.02なんですが、ある漢字の文字列をINSERTすると勝手に「\」が 混入したり、文字化けしちゃうのですが、何とかなりませんか? 表示は正しいのですが、データには「\」が混入しているのか、 検索がうまくいかないなども。
最新版にしたほうがいいんじゃ
ujis? sjis?
179 :
NAME IS NULL :2008/07/28(月) 18:14:33 ID:WzQ+GMO3
SQL質疑応答スレからこちらに来たのですが、 謎の現象で悩んでいます。 MySQL4.0.27 monsterテーブル monster_id int(3) AutoIncrement name varchar(50) name_hira varchar(50) テーブルには name name_hira スライム すらいむ ドラキー どらきー イーター いーたー のようなデータが入っています。 モンスターの名前を検索させるページを作ってるのですが name LIKE '%イ%' とやると先頭に「イ」のあるモンスターしかヒットしません。 スライム、イーター が希望なのですが、イーターしかヒットしない状態です。 name_hira LIKE '%い%' とすると、スライム、イーターともにヒットします。 カタカナだと何か問題があるのでしょうか? DB文字コードはUTF-8 さくらサーバーを使用しており、提供されているphpMyAdmin上からSQLを打ってみても同じ結果になります。 SQL打つときの文字コードを指摘されましたが、UTF-8でSQLに流しています。
打つときじゃねーよ my.cnfのdefault-character-setはどうなってる? [mysqld]と[client]の両方な
181 :
179 :2008/07/28(月) 18:55:00 ID:WzQ+GMO3
レンタルサーバーのため、my.cnfの見方がわからないのですが、 SHOW VARIABLES で表示されるステータスでは character_set ujis となっています。 EUCですね……
show variables like 'character%'; してみて。
183 :
179 :2008/07/28(月) 19:28:28 ID:WzQ+GMO3
character_set ujis character_sets ujis big5 cp1251 cp1257 croat czech danish dec8 dos estonia euc_kr gb2312 gbk german1 greek hebrew hp8 hungarian koi8_ru koi8_ukr latin1 latin1_de latin2 latin5 sjis swe7 tis620 usa7 win1250 win1251ukr win1251 です。
184 :
NAME IS NULL :2008/07/28(月) 23:19:13 ID:T5++pvLI
照合順序の変更が反映されるまで時間かかりすぎだろうんこ野郎め
DR:BD って何ですか
186 :
185 :2008/07/29(火) 21:44:16 ID:???
今月号のDBマガジンに記事が載ってるよ>DRBD
188 :
NAME IS NULL :2008/07/30(水) 09:26:43 ID:bWZAYmLX
データベースの同期を取りたいと思います。 複数のデータベースがあって、そのうちの1つに対して更新が行われます。 商品マスタとかなので更新の頻度・量は多くありません。1週間に2〜3件を更新する程度。 この場合、同期をとるのにどのような選択肢がありますか? 出来ればテーブル単位で指定できるといいです。
189 :
NAME IS NULL :2008/07/30(水) 19:22:44 ID:yOXJNvYs
mysqldump で吐き出されるファイルの INSERT 文の順序は 一定ですか?それとも順序については異なる可能性がありますか?
異なる可能性があります。
191 :
NAME IS NULL :2008/07/30(水) 20:00:03 ID:yOXJNvYs
ううむ じゃあdiffは使えないなぁ
192 :
NAME IS NULL :2008/07/30(水) 20:02:17 ID:yOXJNvYs
二つのスキーマは同じでレコードがビミョーに違うテーブルで 構成されているデータベース同士の差分を取りたいんだ。
>>188 レプリケーションか、定期的に mysqldump とリストア
ダウンロードページにいってみたんだけど どれインスコすりゃいいの?
195 :
NAME IS NULL :2008/07/30(水) 23:32:17 ID:3/KaeSae
自分の環境に合わせて好きなンインスコすればイイ。んなことも判らんのか?
>>191 1行1要素になるように整形してソートすればdiff使えるよ。
時間のかかるSELECTのボトルネックはexplainで想像できるけど updateとdeleteのボトルネックは何で計測すればいい?
DBサーバから受け取る検索結果のバイト列を、圧縮して受けたいんだが、定石はありますか? compress()/uncompress() 関数はあるが、これは mysql 内部。やりたい事は select long_long_string from a_table; とかやったquery結果を圧縮して送出し、それを別のサーバで受けて、展開して使う。 query 時間より結果の転送時間の方が長いという洒落にならない状態なので、何とかしたい。 サーバ間は 1GB bps イーサネット。
>>198 長い文字列がひとつあるだけで結果セットの行数は少ないんなら、圧縮したのを格納すりゃ
いいんじゃない? ディスクの節約にもなるよ
200 :
NAME IS NULL :2008/07/31(木) 12:36:43 ID:8xEIvs4r
my.cnf での指定とコマンドラインオプションへの指定では アンダースコア _ とハイフン - が違うのでしょうか? たとえば --hoge-hoge=10 というオプションの指定を my.cnf で やりたい時には hoge_hoge = 10 とすべきなのでしょうか? このあたりの規則について マニュアルのどこに書いてあるのかが見つけられません…
>>200 my_getopt.cの
handle_options()とgetopt_compare_strings()を読むと分かるけど
function: compare_strings
Works like strncmp, other than 1.) considers '-' and '_' the same.
2.) Returns -1 if strings differ, 0 if they are equal
- と _ は同一視されます。
マニュアルには書いてないね。
202 :
198 :2008/07/31(木) 14:05:21 ID:???
>>199 生成時に圧縮してbinaryで格納すると、select するフィールドが複数ある場合は、それぞれ decompress することになる訳ですね。
それでもいいけれど、できればDBサーバとの通信線自体を圧縮する方法がないものかと…。
そうすれば、今使っている諸ルーチンは一切書き替えず、データベースもそのままで使えそうなので。
204 :
198 :2008/07/31(木) 14:37:03 ID:???
おおお、早速有難うございます。php ではないけど、関連で探して早速テストしています。 教えて頂いたページでは giga-bit ether だと圧縮のオーバヘッドの方が上回るとあるけど、 うちのはCPUが暇してるせいか、giga-bit でも少し速くなっている気が… w 有難うございました。
MySQLの認定資格を受けようと考えているのですが、 参考書が原書(英語)しかないようです。 試験対策になりそうな日本語の書籍がありましたら教えてくれませんか。
206 :
NAME IS NULL :2008/08/03(日) 14:07:08 ID:0TwLDbRV
InnoDBに更新しているプログラム最中に、その更新しているTABLEのデータ構造を変えようとしたため、 反応が返ってこなくなってしまた。 そこで、サービスからMySQLの停止をしたのですが、停止するのに所定の時間を過ぎたのでやめました、 というようなwindowsのメッセージがでて、やむなくOSを再起動しました。 そうすると、それから何回も再起動しても以下のエラーメッセージがでて 起動できなくなります。(netstat -nでも確認) このエラーメッセージに出てくるInnoDB's filesがなんのことか検討をつけるために、 ibdata1を秀丸で試しに開こうとしたら、MySQLが起動していないにもかかわらず、 別のプロセスで書き込みが禁止されていると出ます。 ウィルス対策ソフトも切りました。 で、タスクマネージャーのプロセスを見るとmysqld.exeが動いてします。 強制終了しようとしても消えてくれません。 試しに、今度はphpで接続しようとすると、以下のエラーが出ます。 mysql_connect() [function.mysql-connect]: Can't connect to MySQL server on 'localhost' (10061) 080803 13:54:58 InnoDB: Operating system error number 32 in a file operation. InnoDB: The error means that another program is using InnoDB's files. InnoDB: This might be a backup or antivirus software or another instance InnoDB: of MySQL. Please close it to get rid of this error. 昨晩からずっと色々試していますが、私の力ではお手上げ状態です。 お知恵を貸して頂けないでしょうか。よろしくお願いします。
207 :
NAME IS NULL :2008/08/03(日) 14:28:28 ID:0TwLDbRV
連投ですみません。もう少し手順を詳しく書かせて頂くと、 1. OSを再起動した直後は、MySQLは起動していません。(タスクマネージャーのプロセスで確認) 2. DOS窓からMySQLを起動すると、何のエラーメッセージもなく返ってきます。 C:\Program Files\MySQL\MySQL Server 5.1\bin>mysqld 3. この時タスクマネージャにはmysqld.exeはありません。DOS窓から接続しようとしても、接続ができません。 C:\Program Files\MySQL\MySQL Server 5.1\bin>mysql -u root -p Enter password: ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) 4. Windowsの管理ツールのサービスからMySQLを選択して「起動」ボタンを押すと、正常に戻ってきます。 この時、タスクマネージャにはmysqld.exeが在る状態です。 5. しかし、この状態でDOSまどから接続しようとすると、接続できません。 C:\Program Files\MySQL\MySQL Server 5.1\bin>mysql -u root -p Enter password: ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) 6. phpからmySQLに接続しようとしても、同様にこのメッセージです。 mysql_connect() [function.mysql-connect]: Can't connect to MySQL server on 'localhost' (10061) どうすればいいのか全く分からない状態です。
208 :
NAME IS NULL :2008/08/03(日) 15:20:27 ID:d02Ojyox
データベースのハンドリングって何ですか?
>>207 です。自己解決しました。どうもお騒がせしました。
210 :
207 :2008/08/03(日) 21:34:32 ID:0TwLDbRV
ID出し忘れました。
211 :
NAME IS NULL :2008/08/04(月) 15:02:38 ID:jGv6mjyh
テーブル構造について質問です。 過去のマーケットデータを保持するテーブルを作ろうとしてます。 2008年4月10日午後2時半の銘柄Aの値段はX円、というような情報です。 データは速報値、確定値など複数回にわたって外部ソースから入手します。 データは銘柄によって5分刻み、30分刻み、1日刻みって感じです。 銘柄ID integer 時刻 datetime フェーズ(速報値、確定値etc) enum 値段 integer みたいなフィールドを定義して、値段以外のフィールドを複合キーにしようと思うのですが、 これって何か問題ありますか?1つのフィールドを除いてすべてが複合キーってのは変ですか?
実データでやってみないとわからないが、全然パフォーマンスが出ない場合もあるだろう。 おそらくあらゆる引き方でインデックスが使われるように あらゆる複合インデックスを張っておこうという魂胆だろうが、 それでうまくいく場合もあれば、行かない場合もある。 この場合は12通りのインデックスになる。 しかし、無闇にインデックスを増やすことで MySQLが使用するインデックスの決定に失敗して効率が落ちる場合もあるし、 分散が少ないフィールドは変にインデックスを使わないほうが速い場合もある。 あるいはテンポラリを避けるため、問い合わせを複数に分けなければならないかも知れない。 書き込みパフォーマンスも悪化する。 一つ一つのクエリについて、論理的に考え、テストしながら張り方を考えるべきです。 考え方が逆なんだ。
213 :
211 :2008/08/04(月) 16:12:48 ID:???
>>212 どうもありがとうございます。
「あらゆる引き方でインデックスが使われるように」というより、値段以外のフィールドの
組み合わせは一意じゃなきゃいけないので、複合プライマリーキーにしようと思ったんですけど、
UNIQUEインデックスとかの方がいいんですか?
検索は銘柄ID・時刻の組み合わせ+フェーズ値が最大、というクエリーがメインだと思います。
通常は最新のデータしか興味がないので。
MySQL5で、フィールドのコメントを取得したいのですが、 どのようにすればよろしいのでしょうか。 SELECTでフィールドの中身はわかるのですが・・・。
215 :
NAME IS NULL :2008/08/05(火) 19:55:47 ID:AbDG60iy
}elseif(!$c==""){ $sql="SELECT count(res_title.resid) as ress,res_title.resid,title.titleid,title.title,title.cat,title.catt FROM title LEFT JOIN res_title ON title.titleid=res_title.titleid where title.catt='$c' GROUP BY title.title HAVING ress order by titleid desc"; $result=$db->query($sql); while($row=$result->fetchRow(DB_FETCHMODE_ASSOC)){ echo $widget->r($row["titleid"],$row["title"],$row["ress"],$row["cat"]);} なにか間違っているでしょうか、$cに値を入れても何も表示されません。 どうかご教授ください。
}elseif(!$c==""){
>>216 あ、他にif文とかがあるのです。
何が間違ってるんだろう…
>>216 大変申し訳ありませんでした。
elseifをelseにしたら表示がされました。
平に平にご容赦ください。
>>218 else で title.catt='$c' とかインジェクションしそうだな。
220 :
NAME IS NULL :2008/08/06(水) 07:01:22 ID:ihVuWEE/
MySQLを最大5億件のレコードを扱うことを予定しているのですが、 こんな大量のレコードを扱っている人いますか? インデックス付けても、検索が遅くて使い物にならないか懸念しています。 Googleなどが、MySQLを使っているのは知っていますが、 Googleの場合はMySQLの内部コードをいじっていると聞いています。 私の場合、そこまでの技術力はないので、そのまま使います。 ちなみに、InnoDBです。アドバイスよろしくお願いします。
恐らく無理。というか、データ捏造してやってみれ。 差し支えなければ、何を扱ってそんなデータ量になるのかちょっとkwsk
ああ、ちなみに、無理っていうか、MySQLだけの問題じゃ済まない規模だから 難しいという意味に修正してくだしあ。色々と検証すべきポイントがあると思う。
223 :
NAME IS NULL :2008/08/06(水) 07:56:08 ID:ihVuWEE/
>>221 >>222 アドバイスありがとうございます。
>差し支えなければ、何を扱ってそんなデータ量になるのかちょっとkwsk
クライアントが某研究機関(といってもスパコンを使うような規模じゃなくて、規模は中小)で、
実験データを処理するために使うとのこと。
そのための支援プログラムを作っているのですが、
5億件入ったデータにUPDATEをガリガリ掛ける処理です。
本当はメモリー上でやりたいのですが、さすがにメモリーオーバーです。
で、DBを使ってというところなのですが・・・
難しいというのは、例えばMySQLでtmporaryテーブルを作られてしまった時に、
メモリーオーバーになるとかそういうことでしょうか?
>>223 処理時間をあまり気にしなくていいローカルアプリケーションなんでしょ?
だったら実装次第でなんとかなるんじゃないかな?
まさかWEBアプリのリアルタイム処理の話じゃないよね?
225 :
221 :2008/08/06(水) 08:38:23 ID:???
>>224 そんな感じっぽいですな。十分なメモリ(2GBもあれば)と、
高速なディスクがあれば行けるような希ガス。
DBぶん回しつつバックアップどうすんだとかそういう
余計なことまで考えてしまったw
何時間以内にどれだけのデータ処理を必要としてるのかとか、
そこら辺の要件を詰めてサイジングすればいいのでわ・・・
226 :
NAME IS NULL :2008/08/06(水) 09:02:48 ID:ihVuWEE/
>>224 >>225 レス色々ありがとうございます。
そうですローカルです。バッチ処理みたいなイメージです。
なので、一度動かしたら、結果が数日後になるようなイメージです。
以前の話ですが、innoDBで700万件が入ったテーブルにUPDATEやらINSERT処理やら
やっていたところ、突然クラッシュしてデータを持って行かれました。
なので、今回も5億件が入ったテーブルでクラッシュされたり、
インデックスを張っているにも関わらず遅すぎると困るかなぁと思っています。
とりあえず、アドバイス通りダミーの5億件を作ってやってみます。
ただ、もし5億程度の件数を処理した経験がある方がいらっしゃいましたら、
クラッシュの経験とか教えて下さると助かります。
5億とまでいかなくても1億件でもいいです。
処理時間は、ある程度待ってもらえるそうです。
パソコンは数台用意して下さるそうなので、
計算している間に他の計算をしていたりするそうです。
227 :
NAME IS NULL :2008/08/06(水) 09:38:03 ID:p7qhAkhK
>>227 レプリケーションいいね。ちょっと、それも組んでみる。
ちなみに、以前クラッシュした時のログが残っているから、一応貼っときます。
自分にとっては意味がないけど・・・。突然クラッシュして、起動にも失敗するようになり、
セーフモードで起動して、そのテーブルをdropして回復した。結局700万件のデータはパーになった。
InnoDBだから、テーブルの安全性には信頼を置いていたんだが。
趣味だからよかったけど(バックアップもあったし)、業務なら辛い。数時間停止したらクレーム対応が辛い。
071102 9:58:29 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
071102 9:58:30 InnoDB: ERROR: We were only able to scan the log up to
InnoDB: 12 1142088704, but a checkpoint was at 12 1142088979.
InnoDB: It is possible that the database is now corrupt!
071102 9:58:31 InnoDB: Error: page 2 log sequence number 12 1167329819
InnoDB: is in the future! Current system log sequence number 12 1142088979.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB:
http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html InnoDB: for more information.
原因わかります?
ローカルならロック機構とかいらねぇし、大抵MyISAMのほうがいいんじゃないの? インデックスをきちんと張って、メモリが足りてれば捌ける。問題なし。 うちの会社ではMySQL4を改造してパラレル化してン100億レコード突っ込んでるけど、 ディスクエラーが出るなんつーことはない。他に原因があるはずだ。 億単位のレコードのレプリケーションはお勧めしない。 時間がかかるし、レプリケーションが壊れたときの復旧や増築が大変すぎる。 全部ダンプする羽目になるんだぜ? MyISAMにしてファイルコピーのほうが楽。
・MyISAMにする ・メモリを2GB以上積む ・HDDをRAID1+0にする ・C2D/3GHzぐらいにする ・10万レコード程度のテストで、最も高速なSQLを吟味する
がりがりアップデートするのにMyISAM?
バッチなら問題ないかも。すまん。 ユーザのアクションに対して書き込むようなのだと、待ちが頻発して面倒だったんだ。 あと、concurrent_insertsがfixedじゃないと駄目な気がしてた。違ったけど。 dynamicだとoptimizeが大変だなーとか、そんな程度。
>>228 07年11月02日にMySQL5.1βやRC使ってクラッシュしてもしょうがないと思う。
5.1は今日の時点でもまだ正式版でてないんだよ?
クラッシュしたときにInnoDBログの書き込みが追いついてないみたいだけど、
バグでなければinnodb_flush_log_at_trx_commit=0で運用してたとかかな。
235 :
NAME IS NULL :2008/08/06(水) 22:09:17 ID:ihVuWEE/
レスたくさんありがとうございました。
MyISAMの方が確かにリカバリー簡単ですね。
ただ気になるのが、今までMySQLを4年間使ってきて、
InnoDBがクラッシュしたのは1回ですが、MyISAMがクラッシュしたのは数え切れず。
その度にREPAIRE TABLEを実行しています。
私の感覚ですが、MyISAMは500万件又は2GB超えた時点から更新処理にリスクが出てくると思っています。
これも
>>234 さんがおっしゃられたバグなのでしょうか。
ちなみに、innodb_flush_log_at_trx_commit=0での運用はしていないです。
MySQLはフリーですし、クライアントにその点も説得材料にして
多少壊れる場合があることを承知してもらおうと考えています。
ちなみに、REPAIRE TABLEでも直らなかったことを2回経験しました。それは1000万件の規模です。
2GB の壁があるとしたら、それは OSと ファイルシステムの問題、 あともしかしたら O_LARGEFILE の問題?
237 :
NAME IS NULL :2008/08/07(木) 00:33:41 ID:Ozd0b/vL
すいません。 リレーションを組む必要ってあるのでしょうか。 JOINで対応することは設計する上では煩雑となるのでしょうか。
>>237 要件に合わせて好きにしれ。拡張性、保守性なんかも考えてね。
ヒント ・使われるインデックスは1テーブルにつき1つだけ ・一対多の結合 ・矛盾の判定
240 :
NAME IS NULL :2008/08/07(木) 09:25:36 ID:oZD5QO7e
JOIN は問い合わせのときの話であって, リレーションによる制約(外部参照制約だっけ?)は INSERT や DELETE や UPDATE のときに働く. データベースの側でそういう制約がかかってる方が 安心できるんじゃないか? 複数のアプリケーションからアクセスされる マスタ的なデータベースならなおさら.
241 :
NAME IS NULL :2008/08/07(木) 14:29:26 ID:EXHCWKqE
varchar(10) などに10文字より多いのを入れると以降が消えてしまいますが、 そういった場合にそのSQLをエラーにするにはどのようにしたらよいのでしょうか?
if(sizeof($hoge)<10)exit;
mysql> insert into test values ('12345678901'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> show warnings; +---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1265 | Data truncated for column 'col1' at row 1 | +---------+------+-------------------------------------------+ 1 row in set (0.00 sec) mysql> set sql_mode = traditional; Query OK, 0 rows affected (0.00 sec) mysql> insert into test values ('12345678901'); ERROR 1406 (22001): Data too long for column 'col1' at row 1
244 :
NAME IS NULL :2008/08/07(木) 17:13:01 ID:EXHCWKqE
>>243 有り難う御座います。その情報で調べてみると確かに出来そうです。
実はまだ MySQL4.1でして、調べたところによると MySQL5.02 以降な
ら使えるのですね。
show warnings; でmsgが出るようなので毎回それを打って確認する事で
多少遅くなるかもしれませんが、とりあえず何とかなりそうです。
有り難う御座いました。
245 :
NAME IS NULL :2008/08/08(金) 11:52:09 ID:9XXcJabs
>>244 ですが、show warnings; でチェックを入れてみたのですが、あり得ない
と思われるところで以下の切り詰めのメッセージが出てしまいます。
Warning, 1265, Data truncated for column
「select」の直後や「commit」の直後にも出ています。毎度出るわけではなく
頻度はかなり低いですがたまーに出ています。
warningは毎コマンドでクリアはされないのでしょうか?
私のプログラミングミスなのかな・・・?
>>245 マニュアル読んだ?
Statements that do not use tables and do not generate messages have no effect on the message list.
247 :
NAME IS NULL :2008/08/08(金) 13:43:24 ID:9XXcJabs
>>246 有り難う御座います。英語のマニュアルは読んでいません。
日本語のマニュアルはWebのは見ました。
tableを触らないものでは更新されないよ、という意味でしょうか?
ただ、解決しました。大変申し訳ありません。
プログラムが漏れてました。ホントすみません m(_ _)m
248 :
NAME IS NULL :2008/08/08(金) 21:11:58 ID:EEzu8da3
ストアドファンクションはmysqldump の対象ではないのですか?
mysqldumpに関する質問です windowsXP上にxamppで構築したMySQLでmysqldumpした場合、ファイルはどこに生成されるのでしょうか? よろしくお願いします
250 :
NAME IS NULL :2008/08/10(日) 14:40:09 ID:HsfrqI0G
INT 型の id というカラムだけを持つ id というテーブルがあります. オートナンバーを使わずにID番号を割り当てていくために使っています. SELECT MAX(id) INTO @max_id FROM id; INSERT INTO id SET id=@max_id+1; この二つの文を一気に(間に他の操作が割り込まないように)行いたいのですが, ストアドルーチン(プロシージャ,ファンクション)の中では LOCK TABLES も 使えません. エンジンは InnoDB です.トランザクションを使えばいいのかとも思ったのですが, START TRANSACTION を書くと Script line: 4 Explicit or implicit commit is not allowed in stored function or trigger. と怒られてしまいます.ストアドルーチンの中ではトランザクションは使えないのでしょうか?
251 :
250 :2008/08/10(日) 15:51:19 ID:HsfrqI0G
なんか勘違いしていたようです。 ストアドプロシージャの中からは使えました。 ファンクションの中から使いたかった・・・・
252 :
NAME IS NULL :2008/08/11(月) 21:56:09 ID:fuaDtmwp
しかしダウンロードすんのめんどくさいな。。 いつからこんなごちゃごちゃになったんだ?
create table foo ( id integer primary key auto_increment, name varchar(255) not null, created_at timestamp not null, updated_at timestamp not null default current_timestamp ); というテーブルを作成しようとする Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause というエラーが出ます。 created_at と updated_at の行を入れ替えるとエラーが出ません。 これはMySQLの仕様ということらしいのですが、みなさんどうやってこの制限を回避していますか。 datetime を使うとか、updated_at が先になるようにするとか、ぐらいしか思いつきません。 なおMySQL5.0.27です。
default 値がないと、default current_timestamp が仮定されるからでしょう。 先に定義する timestamp フィールドに default を明示的に (0 とか) 指定してやればよいのでは。
255 :
250 :2008/08/12(火) 12:59:34 ID:6IdRWbPe
Ubuntsu で 5.0.51a-3ubuntu5.1 を, Debian で 5.0.32-Debian_7etch5 を使っています. 両方のDBに MySQL Administrator から接続し バックアップを取っているのですが, Ubuntu では ) ENGINE=InnoDB AUTO_INCREMENT=309 DEFAULT CHARSET=latin1; のように AUTO_INCREMENT の値が取れるものの Debian では ) ENGINE=InnoDB DEFAULT CHARSET=latin1; のように AUTO_INCREMENT の値が入っていません. これをリストアすると次の値が狂ってしまうような 気がするのですが,どうなのでしょうか?
256 :
250 :2008/08/12(火) 13:09:10 ID:???
257 :
250 :2008/08/12(火) 16:56:35 ID:???
etch-backports から 5.0.51a-9 をインストールしたら 問題解決しました。
258 :
NAME IS NULL :2008/08/13(水) 01:50:41 ID:3lWVFElR
259 :
NAME IS NULL :2008/08/13(水) 03:15:51 ID:3lWVFElR
MySQLで「テンポラリテーブル」という言葉は二つの文脈で使われている。 CREATE TEMPORARY TABLEで作成されるものと、 MySQLの内部で作成されるもの。 前者は通常のテーブルと同じく、ディスク上に作成される。 後者はHEAPテーブルなので、通常はメモリ上に作成される。 TEXTやBLOBを使う等、HEAPテーブルの限界から出た場合は、ディスク上に作成される。 こういう認識であってますか?
あってます。 内部で作成される一時表は、GROUP BYや副問い合わせなどで作成されます。 基本的にMEMORY(HEAP)テーブルですが、TMP_TABLE_SIZEまたは MAX_HEAP_TABLE_SIZEを超えると、MyISAMテーブルに変換されます。 チューニングとしては両パラメータを大きくするか、 あるいはそもそも内部の一時表を作らないようにSQLを工夫する といった対処を行います。
261 :
258 :2008/08/13(水) 04:03:37 ID:???
>>260 よく分かりました。
ありがとうございました。
262 :
NAME IS NULL :2008/08/13(水) 07:05:18 ID:zR4oZlGS
log-queries-not-using-indexesで インデックスがないクエリもスロークエリログに記録した時、 ログを見るだけでは、それがスロークエリなのか、インデックスがないクエリなのか、 あるいはその両方なのかが分かりません 何かいい方法はないでしょうか?
explain
確かにexplainでも分かりますが スローなクエリはexplainもスローになるので 運用環境ではしたくないです log-queries-not-using-indexesで残すログに 何らかの印を残してくれたら一番スマートだと思うのですが・・
一般クエリログから 不足しているインデックスを検出することは出来ますか?
ログに出たクエリを開発環境で explain してみればいいじゃん
エクスポートしたデータのインポートについて質問です。 SELECT * FROM table INTO OUTFILE 'c:/a.txt' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' は成功してきちんとエクスポートされているのですが、 LOAD DATA INFILE 'c:/a.txt' INTO TABLE table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' は失敗して、インポートがされません。 エラーの内容は、Data truncated for columnです。 エクスポートとインポートともにLINES TERMINATED BYをつけない場合は、成功します。 よろしくお願いします。
268 :
NAME IS NULL :2008/08/16(土) 19:42:43 ID:7uq2BXxL
create table T1 as (select f1,f2 from some_table); としたときの f1 に index を張りたいのですが、別途 create index を発行せずに、このcreate 文の中で書けないでしょうか。 create table T1 as (select f1,f2 from some_table index xfi (f1) ); # 内側に入れた create table T1 as (select f1,f2 from some_table) index xfi (f1); # 外に出した どちらも失敗します。mysql 5.0.51b です。
create table ○○ like □□; でコピーをしようとすると ERROR 1064: You have an error in your SQL syntax. Check the manual that corresp onds to your MyS QL server version for the right syntax to use near 'like □□' at line 1 となってしまいます。 どうしてですか? バージョンはmysql-4.0.20d-winです。
>>269 テーブルを作成する create の中でなんで検索に使う like を使うの?
ってか何をしたいのか判らんのだけど。
>>269 create table new_t like old_t の構文は 4.1 から。
>>270 既存のテーブルと同じ構造の新しいテーブルを作る構文。
うお、ダブリすまぬ。
274 :
270 :2008/08/17(日) 20:20:04 ID:???
SQL初心者で今後学んでいきたいと思っている者ですが、 ひとつの勉強方法として参考までに聞かせてください。 皆さん最初は何やってきました? 【 例 】 無駄にSQLたたいてみたり。 自分でテーブル作ってデータ抽出してみたり。 無駄にサブクエリ使ってみたりなど・・・。 お願いします。
学習など不要。実践あるのみ。
277 :
NAME IS NULL :2008/08/18(月) 02:50:10 ID:i7lKKnR7
>>275 おれも、
>>276 と同じで必要に迫られて使っているうちに一通り覚えてしまった。
機能面から色々いじるのではなく、用途面からアプローチしていく方が効率的。
最初にOracle Masterとった。
>>275 自分で作りたいアプリケーションがあったので、それを作るためには
どうしたらいいか勉強した。
仕事でやらされるのでなければ、こうでもしないとモチベーション上が
らない。 w
MySQLの資格取りたいんですが、 資格に関連した本なさそうなんですが、資格取るためのお勧めの本とかありますか?
>>275 DBやSQLなんてなーんも知らないときに、Postfixとかその他のアカウント認証を
MySQLバックエンドでやる仕事があって、CSVレベルの扱い方から覚えた。
そこそこの概念的な理解とSQL叩ける知識が出来てからは、プライベートで
変なもん作ったりして少しずつ覚えたな。株価データベースとかw
プライベートで題材がないときは住所録が王道だな。 住所もベタベタに保存しないで、郵便番号テーブルと リレーションしたりすれば十分楽しめるお題かと。
ちょっと教えてください。 CPIという鯖のMySQL5なんですが、文字セットがUTF-8とあります。 で、このDBでXOOPSをEUC-JPでインストールしたところ 「@」や「〜」という機種依存文字だけ「?」になってしまいます。 XOOPSのコミュニティで相談したのですが答えはでず・・。 このスレで聞くのもどうかと思ったのですが MySQL側で何かよい対策あるかもしれないので みなさんの知恵をお借りすべく質問させていただきました。 よろしくお願いします。
286 :
NAME IS NULL :2008/08/18(月) 21:30:51 ID:oooeiTev
update文について質問です。 テーブルの上から20個だけupdateをかけたい時、 どのように記述すればよいのでしょうか。 教えていただけたら幸いです。 update テーブル名 set del_flg = 1 where del_flg = 0 limit 20 offset 0; このように書いて失敗しました。
order by
288 :
275 :2008/08/18(月) 23:15:56 ID:???
>>276-279 ,281,282
ありがとうございます。
参考にして取り組んでいこうかと思います。
マジで質問なんですが PHPとMYSQLでデータベース作ったのですが TEXTのフィールドに→'(半角のダッシュみたいなやつ)が入りません。 インサートする直前にS-JISに変えるクエリも送ってます。なんでですか?
PHPだったらPDOのprepareでも使っておけ。 ってかスレチ
292 :
NAME IS NULL :2008/08/19(火) 09:24:11 ID:1xX6q0ke
テーブルに、同じデータが重複して登録されているのですが、 SQL文一発で重複を省くことってできますか? INSERTのミスと、UNIQUEを設定していないために、 全く同じデータが存在します。 同じ構造の別テーブルを作って、UNIQUEを設定して、 INSERT IGNORE INTO T_TMP SELECT * FROM T_TABLE; とすれば、T_TMPの方に重複がないデータができそうですが、 データが膨大な量があるので、できれば、 テーブルコピーをせずにやりたいのです。 アドバイス宜しくお願いします。
一発でなきゃだめ? 削除指定するための指定で両者を区別できないとどっちも消しちゃうけど。
そんなに膨大な量があるなら、大事なテーブルなんだろうから、なおさら直接削除はやめた方がいいように思うんだが… 俺が、小心者なだけか。
全カラム指定でGROUP BYしてCOUNTいれてhavingで2以上なら別テーブルにコピー 同じ指定でコピーの代わりに削除したうえで、別テーブルからもってくれば、、、 3回(+別テーブルのCREATEとDROPの2回か)かかるけど。
新テーブルを create してはいけない 、という条件じゃなかったか ? w どうせ create するのであれば、簡単に create table new_table as select * from the_table union select * from the_table; でいいのでは。
>>293-296 色々考えて下さってありがとうございます。
やはり一発のSQLというのは無理そうですね。
GROUP BY, HAVIGN, LIMIT, INとかをつかって何とかならないかなぁとか、
甘く考えていたのですが、新テーブルを作ってやる方が安全そうですね。
ちょっと、その方向性で準備してみます。
ありがとうございました。
ON DUPLICATE KEY UPDATEが使えないバージョンの場合に 効率の良い方法はどんなのがありますか? とりあえずSELECTしてからUPDATE, INSERTに分岐させてます。
299 :
NAME IS NULL :2008/08/20(水) 01:02:40 ID:dpIyVTSF
group by id とすると、idの値が同じものはグループ化されますが、 idが0の場合はグループ化しないようにする方法ってあるのでしょうか?
(SELECT * FROM hoge WHERE id != 0 GROUP BY id) UNION (SELECT * FROM hoge WHERE id = 0 GROUP BY id) ・・・ということかしら。
まつがえた (SELECT * FROM hoge WHERE id != 0 GROUP BY id) UNION (SELECT * FROM hoge WHERE id = 0)
303 :
NAME IS NULL :2008/08/21(木) 15:56:01 ID:89zb0qJQ
web+DBのサーバー構成が2台ありまして、 両方にアクセスログをMySQLに保存しています。 で、両方のサーバーからのアクセスログをローカルにダウンロードして解析しようとすると、 キー重複でinsertが出来ません。 auto_incrementしているのでキーが重複してしまうのですが、 DTATTIME型にしても、やはり同時刻にアクセスがあると重複してしまいます。 サーバーが違うデータ間で一意にするキーを設定するには、どうすれば宜しいですか?
サーバ名+インクリメントでいいんじゃない?
>>302 ありがとうございます。ちとわけあってユニークキーを設定できない
仕様なのでそれもダメぽです。アヒャ
306 :
299 :2008/08/21(木) 19:07:20 ID:???
>>301 つまり、分けないと無理なわけですね。。
それしかないと言う事で理解しました。ありがとうございました。
307 :
NAME IS NULL :2008/08/22(金) 12:01:14 ID:RqzAWj1+
ちょっと、MySQLが意味不明の落ち方をするので相談に乗ってください。 MySQLに短時間で比較的大量の処理を実行させると、 自動的に再起動が掛かります。どうしてか分かりますか? エラーログにもその痕跡がないのですが。
エスパー募集スレと聞いて OSとMySQLのバージョンと どんな処理したかぐらい書こうぜ
309 :
NAME IS NULL :2008/08/22(金) 14:39:12 ID:Qft0s3jG
すいません。 mysqladminを実行しようとすると、 connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password:NO)' と表示されます。 動いているhostnameがServerUと名前にしているのですが、 それが問題でしょうか。
mysqld が動いている ServerU == localhost なのかどうかを、まずはっきりさせてほしいが。
落ちるところまでは良いとして、再起動って何故wwww 監視プログラムとかが自動的に復帰させてるんじゃないの?
312 :
NAME IS NULL :2008/08/22(金) 15:57:29 ID:RqzAWj1+
抽象的な質問で失礼しました。 環境は、FreeBSD6.2 + PHP5 + MySQL5.1.23-rc-log で、phpの呼び側でログが出てました。 Out of memory (Needed 8164 bytes) MySQL server has gone away Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) の順番にphp側にエラーメッセージが帰ってきます。 サーバーはMySQLもwebサーバーも同じ筐体です。 で、webサーバーは落ちることなく、MYSQLだけ落ちて自動的に再起動がかかります。 頻度は月に一回で、アクセスが集中するときに発生します。 これでどこの部分をいじれば解決すれば分かりますか?
落ちてる理由は Out of memory だな。MySQL が要求したメモリが足りずに OS にぬっ殺されてる。 原因としては、mysqld に割り当てているメモリ量が少ないか、SQL がヘタクソ すぎて膨大なメモリを消費しているかどっちか。
SELECT * FROM xxx で膨大なデータ読んでるんだろうか
カーソル使うのはどう?
ありがちなのはソートだな。
膨大な抽出はディスク上で処理されるのでOOMの原因にはならないはず。 野良ビルドしてない? MySQLだけは公式バイナリ使った方がいいと思うよ。 ちゃんと検証されてるから。
mysqldは普通に構成すると管理用のmysqld_safe経由で起動される。 mysqldがエラー吐いて落ちたときに再起動がかかるのはmysqld_safeの通常の動作。
319 :
NAME IS NULL :2008/08/22(金) 18:20:30 ID:RqzAWj1+
詳しくご指導頂く大変感謝しています。 MySQLをインストールしたときの設定メモですが、FreeBSDですので、 portsを経由してインストールしています。コマンドでいうと以下の通りです。 特にソースをいじっているところも、configをいじっているところもないです。 # cd /usr/ports/databases/mysql51-client # make # make install # cd /usr/ports/databases/mysql51-server # make # make install 今の最新版が、MySQL5.1.26 なのでとりあえずバージョンアップして様子見でしょうか。 ちなみに、SQL文ですが、使うSQL文はいつも決まっていまして、 比較的アクセスが集中したときに落ちます。ただ、落ちた時以上にアクセスがあっても大丈夫な場合があるので、そこは不可解です。 メモリーは2GB積んでおりまして、MRTGでメモリーの推移を観察しても、 落ちた直後がActiveで500MBで、再起動直後はActiveが350MBです。 メモリーの割当でエラーが起こっているとしますと、 my.cnfのどの辺のパラメータでしょうか? このエラーメッセージの「(Needed 8164 bytes) 」がよく分かりません。 8KB程度のメモリーが不足して落ちているとういうことですが、 前述の通り2GBのうち、500MBしかActiveになっていないので・・・。
以下のコマンドの結果キボン top -b | head -5 ps uU mysqld limits -a -U mysql
間違えた ps uU mysql
322 :
NAME IS NULL :2008/08/22(金) 19:29:28 ID:RqzAWj1+
>>321 実行してみました。何か手がかりがあるでしょうか?
www# top -b | head -5
last pid: 62762; load averages: 0.22, 0.49, 0.41 up 79+07:03:23 19:27:02
113 processes: 2 running, 110 sleeping, 1 zombie
Mem: 411M Active, 1246M Inact, 209M Wired, 65M Cache, 112M Buf, 71M Free
Swap: 2048M Total, 244K Used, 2048M Free
www# ps uU mysql
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
mysql 89296 0.0 11.6 483508 243000 ?? S 13Aug08 1290:45.70 [mysqld]
mysql 14745 0.0 0.0 1732 1008 p0- I 5Jun08 0:00.01 /bin/sh /usr/local/bin/mysq
www# limits -a -U mysql
Resource limits for class default:
cputime infinity secs
filesize infinity kB
datasize infinity kB
stacksize infinity kB
coredumpsize infinity kB
memoryuse infinity kB
memorylocked infinity kB
maxprocesses infinity
openfiles infinity
sbsize infinity bytes
vmemoryuse infinity kB
>>322 ありがと。とりあえず OS 的にメモリすかすかで余裕があることは分かった。
あとは再現したときにどういう状況になってるのか・・・だねぇ。
∩___∩ | ノ ヽ/⌒) あばばばばばば /⌒) (゚) (゚) | .| / / ( _●_) ミ/ ∩―−、 .( ヽ |∪| / / (゚) 、_ `ヽ \ ヽノ / / ( ● (゚) |つ / / | /(入__ノ ミ あばばっあびゃばびゃばば | / 、 (_/ ノ | /\ \ \___ ノ゙ ─ー | / ) ) \ _ ∪ ( \ \ \ \_)
VIEWでつけた名前を忘れたのですが、調べる方法はありますでしょうか?
SHOW FULL TABLES
SELECT maildir FROM userdata WHERE username=%u というメールサーバからメールディレクトリを取ってくるクエリがあるのですが、 「%u」だと、たとえばhogehoge、というユーザ名しかとらないので、 これに「@sample.jp」を強制的につけて SELECT maildir FROM userdata WHERE username=CONCAT(%u, '@sample.jp')としたのですが、 Aug 26 19:02:07 main postfix/virtual[7777]: warning: mysql query failed: Unknown column 'hogehoge' in 'where clause' と出てきました。 どのように文字列を結合すればいいのでしょうか?
331 :
NAME IS NULL :2008/08/26(火) 21:37:22 ID:1ujB939S
UPDATEについて質問です。 例えば、フィールド(sort)が100より大きい場合は +100ずつ加算して更新する と言うような事って出来るのでしょうか?
UPDATE table SET sort = sort + 100 WHERE sort > 100
>>330 勘だけど
SELECT maildir FROM userdata WHERE username=CONCAT('%u', '@sample.jp');
%uじゃなくて'%u'じゃない?
334 :
NAME IS NULL :2008/08/27(水) 12:24:17 ID:tjPXlk5i
「force index」と「use index」はどのように使い分けるといいのでしょうか? 以下のような説明を見つけましたが、 -------------- 異なる点として、この構文の場合、テーブルのスキャンは非常にコストがかかる という前提に立つ。 つまり、テーブルのスキャンが実行されるのは、どのインデックスを使用しても テーブル内のレコードを検索できない場合に限られる。 -------------- 意味が分かりません。 非常に大きなテーブルの場合は force がいいという意味なのでしょうか?
MySQL5で、設問テーブルが tableA mid | cid | dat -----+-----+----- 1 | 1 | A | 2 | 2 | B | 3 | 1 | C | 4 | 1 | D | 5 | 2 | E | 6 | 1 | F | としてあり、 その設問に対して複数回答者の解答データ用として tableB uid | mid | res -----+-----+----- 1 | 1 | 1 | 1 | 3 | 0 | 1 | 6 | 1 | 2 | 2 | 1 | 2 | 6 | 0 | 3 | 1 | 1 | 3 | 4 | 0 | 3 | 5 | 1 | 3 | 6 | 1 | があります。 設問は(mid)をキーとして、回答者は(uid)をキーとしています。 上の例で、uid=1のユーザーは、設問1・3・5に回答していることになります。 resは正誤結果です。 このような状態で、cid=1の設問をリスト化し、 そこにuid=1のユーザーの正誤結果を同時に取得できないかと悩んでいます。 SELECT A.mid,A.cid FROM tableA AS A LEFT JOIN tableB AS B ON B.mid = A.mid WHERE A.cid = 1 AND B.uid = 1 だと、未回答の設問が引っかかりません。 以下のような結果を取得したいのですが、可能でしょうか? mid | cid | res -----+-----+----- 1 | 1 | 1 | 3 | 1 | 0 | 4 | 1 | NULL| 6 | 1 | 1 |
336 :
NAME IS NULL :2008/08/27(水) 17:35:56 ID:GXeo9qij
複数のテーブルをJOINで結合するのと、 1つのテーブルの結果を取得して検索キーにする(つまりSQLを複数実行) 場合、どちらの方が処理が早くて、負荷が少ないのでしょうか? 正規化してテーブルを分けていたら、JOINばかりになって SQLのコードが長くなったり、処理が増えて悩んでいます。
そのキーや検索結果が膨大になる場合、 複数のSQLでやるほうが大変だと思うよ。 まあケースバイケースで。
JAVAのPreparedStatementで設定できる「?」の個数って、8個が限界ですか? JAVA 1.5.1 DBMS MySQLの5.0.27 JDBCドライバ mysql-connector-java-5.0.4 9個目の「?」に値をセットしようとするステップで以下のエラーが発生します。 java.sql.SQLException: Parameter index out of bounds. 9 is not between valid values of 1 and 8 カラムがたくさんあるテーブルだってあるだろうに、8個じゃショボすぎます・・・(私は11個あれば足りますが・・・) もう決め打ちで動作テラモッサリ覚悟で行くしかないのか。
>>335 すみません。
サブクエリを使うことで、自己解決しました。
スレ汚し、失礼いたしました。
>>338 ? が8個しかないのに pstmt.setObject(9, value) とかやってるんじゃない?
341 :
338 :2008/08/27(水) 21:08:48 ID:???
>>340 ・・・その通りでございました・・・
「?」がシングルクオテーションに囲まれてました。
my.iniとかmysql-connector-java-5.0.4のソースを追っても的外れでしたw
助かりました、ありがとうございます!
シェルの話になると思うのですが、
ダウンロードしたCSVをインポートしたいのですが、
------------
#!/bin/bash
wget
http://example.jp/hoge.csv mysql -u test
use test;
drop table 'test';
....
-----------
と記載しても、
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
で、止まってしまいます。
cronで回したいので、シェルスクリプトでmysqlのコマンドを打つことはできないのでしょうか?
パスワード無しの特権ユーザtestを作成しています。
>>342 mysql -u test -e " \
use test; \
drop table test; \
....
"
でできないか?(改行前のバックスラッシュはいらんかも?ためしてない。)
でも自分なら、
---test.sql---
use test;
drop table test;
create table ...
load data infile .....
------------
みたいなファイルを用意して、
---test.sh---
#!/bin/bash
wget
http://example.jp/hoge.csv mysql -u test < test.sql
------------
ってするかな。(ってか、すでにそうしてる。)
344 :
NAME IS NULL :2008/08/28(木) 17:52:34 ID:PqsfWYi1
aテーブルにレコードが1件有り、bテーブルにレコードが5件あるとします。 そしてcodeというフィールドを持ち、すべて1が登録されているとします。 SELECT COUNT(a.code) AS num FROM a INNER JOIN b ON a.code=b.code WHERE a.code='1' GROUP BY a.code としたのですが、結果のnumが5になります。 aテーブルのレコードが1つなのですから、同じcodeで結合したら 1件しかヒットしないと思ったのですが、どうしたらいいのでしょうか? 4.1.20を利用しています。
GROUP BY
ちょっとお聞きしたいんですが 画像を表示させる場合 <img src="$pic">でもいいんですかね?
ダメだと思うよ
誤爆か
349 :
NAME IS NULL :2008/08/29(金) 17:39:25 ID:PbXS3bYh
このような質問ですみませんが、 ファイルをジャンル分けしようと思っています。 ジャンルごとにテーブルを作成するのと 一つのテーブルに全て詰めてしまうのとでは どちらの方がパフォーマンス、効率がいいのでしょうか? ジャンルごとに対象のファイル名を抜き出す場合は やはりジャンルごとにテーブルを作った方がいいですよね。 こういった場合に一つのテーブルに詰める事の優位な点などはあるのでしょうか。
>>348 誤爆っていう言い方は訂正するべきでしょ。
原爆症で苦しんでいる方がいるのに、
こういう終戦の月に無教養・非常識すぎるんじゃないの?
普通は >ジャンルごとにテーブルを作成 これはありえない。
一発だけなら誤射かもしれない
354 :
NAME IS NULL :2008/08/29(金) 19:39:38 ID:PbXS3bYh
>>351 なるほど、では一つのテーブルで頑張ってみようと思います。
どこかで50万件ぐらいでデータベースが悲鳴を上げることは無い、
というのを見たのですが、検索の効率が悪いならば、と思ったのですが安心しました。
ありがとうございます。
んとね、そこはクエリに対するインデックスの張り方がキモなわけでして。 適切に張ってある限りはテーブルを分けようが一緒だろうが パフォーマンスはほとんど変わんないよ。
356 :
NAME IS NULL :2008/08/29(金) 22:24:38 ID:PbXS3bYh
>>355 なるほどです。
>354の後からしばらく考えていたのですが、
実装としてはXMLの方が簡単そうな気がしました。
検索効率や、ファイルを削除した時の管理の楽さなどはdbの方が良さそうな気はしますが。
本当に参考になりました、ありがとうございます。
まだしばらく考えてみてみます。
>>356 いや、メインカテゴリとサブカテゴリに分ければ良いだけじゃないか?
君の言う「ジャンル」というのが、ヤフオクで言う「コンピュータ」「音楽」
とかになるなら
コンピュータ(メインカテゴリ)
└ソフトウェア(サブカテゴリ)
でいいと思うけど。
358 :
NAME IS NULL :2008/08/30(土) 00:55:06 ID:Ac0i/DJg
>>357 そうですね、そんな感じを想定してます。
ただサブカテゴリまで使わない感じの本当に単純なリストですが。
それと複数のカテゴリに登録する予定なので
xmlなどで「コンピュータ.xml」などとしてその中に登録していきリスト化してしまえば、と>356では考えたのですが、
table file
+--+----+-----+
| id | title | cate |
+--+----+-----+
| 1 | hoge| comp |
| 2 | hige | music|
| 3 | hage| comp |
| 4 | hage| music|
+--+----+-----+
とあったとき、sql の where を file.cate = "comp" というように絞った方がxml運用より楽そうですね。
それとxml運用ではディレクトリのファイル制限があった場合にカテゴリを追加出来なくなってしまいますしね。
解答者からちょっと嫌われそうな事ですが、
現在オライリーのPHP&MySQLを読書中(7章)でして、
まだMySQLの優位性などがよく分かってないので、
思考があっちらこっちら行ってしまってます。
解答の回答がおぼつかなかったりしてすみません。
MySQLのチューニング関連の本って出てる?
360 :
NAME IS NULL :2008/08/30(土) 11:32:20 ID:poqNHsYq
出てるけど、ほとんどのものはパラメーターの解説ぐらいなもの。 ただで読める、公式のレファレンスを読んだほうがいいのでは?
SQL質疑応答スレから移動してきました。
非常に基本的な質問で申し訳ありませんが、お願いします。
環境はMacOSX10.5上に自分でインストールしたMySQL5です。
サーバもクライアントも同一マシン上で動いています。
grant all on *.* to bbsuser IDENTIFIED BY 'bbs1234';
というコマンドで、bbsuserという名前でbbs1234というパスワードの
ユーザを作りました。
そして、ターミナルから
mysql -u bbsuser -p
でmysqlに接続しようとしたのですが、
Access denied for user 'bbsuser'@'localhost' (using password: YES)
というエラーが出て接続できません。
http://dev.mysql.com/doc/refman/5.1/ja/access-denied.html のページも読んで、
mysql -u bbsuser
ならサーバに接続できることが分かったのですが、パスワードオプションを
つけるととたんにダメになってしまいます。
なぜなのか分からずに途方に暮れています。どうかお知恵を貸して下さい。
GRANT ALL PRIVILEGES ON *.* TO bbsuser@localhost IDENTIFIED BY '********' ON *.* だとユーザを分離する意味が薄れるんで、ON bbs.* とかに制限した方がイイ
364 :
362 :2008/08/30(土) 13:56:46 ID:???
>>363 ありがとうございます!早速やってみたらできました。
それと、ユーザが一部のデータベースにしかアクセスできないようにもしました。
本当にありがとうございます。
>>358 だからその構造がおかしいだろ。
main_category
+-------+----+
| main_id |name|
+-------+----+
| 1 | hoge |
+-------+----+
sub_category
+------+------+-----+
| sub_id |main_id|name|
+------+------+-----+
| 1 | 1 |test |
+----+---------+----+
こうすればいいだけだろ。
366 :
NAME IS NULL :2008/08/31(日) 02:04:32 ID:Fg60kWc8
>>365 返信遅れてすみません。
なるほどです。
sub_categoryの方からidを引き出して
そのidを使ってmain_categoryから引き出せば効率がいいんですね。
やはり文字列よりも整数で抜き出す方が壮大に早いんですね。
ありがとうございます、そうします。
> やはり文字列よりも整数で抜き出す方が壮大に早いんですね。 当たり前だろw 文字列だって所詮は文字コードの数値比較だけど、桁数が全然違うしな。
368 :
NAME IS NULL :2008/08/31(日) 21:01:11 ID:Uz/XNAcD
ご教示ください。 ORDER BYでソートをしたとき、 特定のレコードが何番目になるかを調べるにはどのようにすればよいでしょうか? また、その際にリストと同時に、その番目を取得する事は可能でしょうか。 たとえば、SELECT ID,NAME,AGE FROM PERSON ORDER BY AGE; この時にID=10のレコードがリストの何番目になるのかを知りたいのです。
たぶんoracleのrownumのようなものを期待しているのだろうけれどありません。 何とかする方法はFAQなのでmysql rownumでググれ。
370 :
NAME IS NULL :2008/09/01(月) 11:25:43 ID:knw+y/WY
order byを書かずにselectした場合の順番って順不同ですか? あるいは、insertされた順でしょうか。 内部的に時刻情報を保存しているのは無駄だから、やっぱり順不同…?
順不同というか、単なる集合でしょ。
集合なので順番という概念はないとすると、そもそもORDER BYの存在自体が意味不明でしょ。 現実的なデータハンドリングを考えないと。 で、結論だけど、データの発見順とでもいうところか。 無駄にランダマイズしているわけでもないので、環境と状況が同じなら順番も同じではある。 しかし環境と状況に依存するということはつまり、順不同と考えておくべきである。
374 :
NAME IS NULL :2008/09/01(月) 12:04:22 ID:Sur8/I/j
lsとかglobみたいな感じか
ありがとうございました
MySQLと連携しているWebアプリケーションを標的としたSQLインジェクション攻撃
ttp://www.isskk.co.jp/soc_report/SOC_report_20080812.html 今回の攻撃は、MySQL の拡張機能である ”INTO OUTFILE” を使用して、
指定したディレクトリに jatest4.php というファイルを保存するというものでした。
作成された jatest4.php は単純に文字を表示するだけの php コードであり、
データベースに保存されている情報を抜き出してファイルに書き込む行為は行っておりませんでした。
攻撃者は、Web サーバ上に作成された jatest4.php にアクセス可能か確認することで、
攻撃の成否を確認し、サーバが脆弱であるか確認を行っていると考えられます。
以下のselect文とupdate文を1文で行うにはどう書けばいいでしょうか? select id from id_table sequence order by rand() limit 1; update id_table set pt = pt+1; selectのidと一致する行のptを+1する
MySQLです。 重いSQL文を発行してしまったときなど、ctrl+Cで発行したSQLをキャンセルする ことがありますが、このキャンセルをSQLの発行で実現することはできないでしょうか。 自作のアプリケーションでデータベースにアクセスするため、 ctrl+Cを使うことができないのです。 よろしくお願いします
ctrl-cでキャンセルできるんだっけ? プロセスリストでも見て、killしなよ。
NULL可な日時カラムでソート結果を 1,NULL 2,NULL 3,2008-09-10 4,2008-09-11 5,2008-09-12 6,2008-09-13 1,NULL 2,NULL 6,2008-09-13 5,2008-09-12 4,2008-09-11 3,2008-09-10 のようにしたいです。 nilを大きいと見なすか小さいと見なすかを指定することはできますか?
384 :
NAME IS NULL :2008/09/07(日) 02:09:33 ID:MSRnUF0+
データーベースをバックアップからもどしたら、 権限が書きかわってしまって、、、 PHPmyAdminのSQLでクエリを実行したいのですが、 どういう文で権限をもとにもとせるのでしょうか。。。
元にもとすことはできない。
>>384 データのリストアって、結構トラブル多いよね。
リストアする経験ってあまりないし、たいがい急いで作業してるし。
SIGINTだとmysqlクライアントごと死ぬけど クエリーの処理だけを止めるにはどうしたらいいかな
socket を shutdown する
390 :
NAME IS NULL :2008/09/08(月) 04:19:37 ID:XXYAl1fb
階層構造を表現するのに、経路列挙モデルを使おうと思います パスを、/path/to/形式で格納しているのですが、 親直下の子をselectするために、like '/path/to/_%'とandで、 pathに含まれている"/"の数を指定したいと考えています。 しかし、文字列の中の特定の文字の個数を数える関数がmysqlにはありません 何とか実現する方法があれば教えてください
391 :
NAME IS NULL :2008/09/08(月) 04:41:00 ID:XXYAl1fb
substring_index(substring_index(path,'/',-3),'/',1)='親id' という式をなんとか考えました もっとスマートな式があればお願いします
そんなSQLは書いちゃいかん。 SQLはプログラム言語じゃないんだぞ。 数だけが問題なら、格納する時に数自体も格納しておくとか。
select で一々文字列関数呼び出してたら、かなりコストがかかるのではないか。
>>392 の言うとおり、数を数えて別フィールドに格納しておくのがよいように思うんだが。
>>388 ちょ、sega って…。
KILL でクエリを中止できる。
wwww
regexpつかう
mysqlのバックアップについて詳しく乗ってるサイトを教えてください
398 :
NAME IS NULL :2008/09/11(木) 01:29:40 ID:ZCjKho3B
v5.0.47 を default-character-set=ujis で運用しています。 あるデータベースのみutf8でphp5.1から利用したいと思いましたが EUCが使用されてしまい文字化けしてしまいます。 ぐぐってみたものの set names utf8 か、php5.2から導入された関数を使用して クライアントのエンコーディングを指定するといった方法しか見つかりませんでした。 set names、phpアップデート以外の方法はないでしょうか。
399 :
NAME IS NULL :2008/09/11(木) 08:40:37 ID:uNeI6sP5
>>398 mysql_query('set names UTF8')
が嫌ならテーブル作る時に
default charset utf8 COLLATE UTF8_UNICODE_CI
って加えればいいんじゃないですか?
それより誰かオラの質問に答えてくれ
アパッチ + PHP + MYSQLで
バイナリファイルをbase64エンコードしてミディアムtextのカラムに入れたいんだけど
512KB以下のファイルは入るのに、1024KB以上のファイルがどうしても入りません。
その中間のサイズは試してないんですが、何で入らないのか教えて下さい。
longtextでも試しましたし、いろいろやりましたが分かりません。
400 :
NAME IS NULL :2008/09/11(木) 11:47:52 ID:uNeI6sP5
だれか
>>399 を答えて
512KBは入るのに1024が入らないって事はPHPのプログラムミスじゃないと思うので
mysqlの設定かなにかの問題だと思うんだけど
ファイルサイズが1024KBなの? base64エンコードってことは4/3倍だよね、1677215文字以内に収まってる?
>>400 入らないと判断したんならエラーメッセージぐらいでてるだろ?それも書けよ。
ひっかかりがちなのはmax_allowed_packetのデフォルトがちょうど1MBぐらい
だったと思うがそれは確認した?
BLOB や TEXT オブジェクトの最大サイズはそのタイプによって判断されますが、
クライアントとサーバーの間で実際に送信できる最大値は、有効メモリの量と
コミュニケーションバッファのサイズによって判断されます。max_allowed_packet
変数の値を変更する事でメッセージバッファサイズを変更する事ができますが、
サーバとクライアントプログラムの両方に対してその作業を行う必要があります。
ttp://dev.mysql.com/doc/refman/5.1/ja/blob.html
403 :
399 :2008/09/11(木) 16:56:07 ID:uNeI6sP5
>>401 longtextでも入らないんです。base64で増えてもmediumtextに収まるはずなんですけど
>>402 今外なので帰ったらググってみます。
エラーはフォールズ以外出し方分からないです。
いつもはエラーをプロンプト画面で見てますが
とても手打ちは無理なので諦めました
ログっつーもんはないのか
405 :
399 :2008/09/11(木) 22:07:08 ID:uNeI6sP5
>>402 >>404 できました!
いろいろありがとうございました。
先ほどエラーログを見ましたが特に何も書かれてなかったので
max_allowed・・・でググって修正しようと思ったのですがmy.cnfなるファイルが見つからず
プロンプト画面で10Mの値を入力しても値が1Mで変わらず
仕方ないからmy.iniに
max_allowed_packet 100Mとして書いて
再起動させプロンプト画面で確認したら10Mになってました。
できましたが、とりあえずもうちょっと実験とかしてみます。
406 :
399 :2008/09/12(金) 19:31:20 ID:AgfWqHRC
ついでに質問させて下さい BLOB型とTEXT型の違いが分かよく分からずTEXT型しか使ってないのですが ファイルをDBに格納する場合、BLOB型ならbase64エンコードをしなくて そのまま突っ込んでもいいという事ですか? 今のところTEXT型でも不自由してないのでいいのですが base64にすると容量が増えるので、減らせたらいいかなって思って。 BLOBにしておいて文字のデータ入れたりTEXTにしておいてバイナリ入れたりするのは邪道ですか?
>ファイルをDBに格納する場合、BLOB型ならbase64エンコードをしなくて >そのまま突っ込んでもいいという事ですか? いいですよ。そのための BLOB です。なお、prepared statement 使って下さい。 >BLOBにしておいて文字のデータ入れたりTEXTにしておいてバイナリ入れたりするのは邪道ですか? compare しないなら、どっちも同じ。 compare するなら、text の方は characte set が効いてくるので、予期しない結果になるかも。
408 :
388 :2008/09/13(土) 13:18:09 ID:???
>>394 もちろんkillで殺すんですが知りたかったのは
クエリだけを停止するのは何のシグナルかということです
検索結果が1行だとわかっているときって LIMIT 1 付けたほうが速いのかな 誰も実験したこと無いなら実験してみる
410 :
399 :2008/09/13(土) 19:07:14 ID:QFclDkB+
>>407 ありがとうございます。BLOBでデータ入れる事にします。
とりあえずPCの中にエロ画像が20万枚位あるので全部放り込んでみます。
一つのテーブルに20万枚入りますか?
テーブル分けたらいいんだけど、一つのテーブルってどの位のレコードが限度なんですか?
PCの能力に左右されるんですかね?
知ってる人教えて
LIMIt $st , $lim; $st = ($p -1 ) * $lim; $next = $p + 1; $rev = $p -1; if($rev < 1){ $rev = 1; }
あの、すいません。 MYSQLに画像を入れようとして、BLOB型で入れたんですが WINDOWSのコマンドで確認してみると、エラー音とともに バイナリ文字が大量に出てきました。 それをPHPで取り出して、ヘッダー(Content-type: image/gif)を 入れると画像として表示されるんですが どこかおかしいですか?
どこもおかしくないんじゃない
415 :
NAME IS NULL :2008/09/14(日) 03:08:44 ID:lEAptafg
mysql> create table Sample_TB( id int primary key, name varchar(50), password varchar(50) ); mysql> insert into Sample_TB(id,name,password) values('0','administrator','admin'); mysql> select * from Sample_TB where id = ''; int型(数値)のidの値を、where句に、シングルクォーテで囲った0文字をselectすると、結果が1レコード返ります。 id,name,password 0,administrator,admin int型(数値)のidの値を、where句に、シングルクォーテで囲った0文字をselectしたら結果が0レコードになるようにすることってできますか?
416 :
NAME IS NULL :2008/09/14(日) 03:14:37 ID:lEAptafg
すみません、質問を間違えました。 誤 >>int型(数値)のidの値を、where句に、シングルクォーテで囲った0文字をselectしたら結果が0レコードになるようにすることってできますか? 正 どうして、1レコード返るのか教えていただきたいです。
内部的にこんなふうに動いてるみたい。 select * from Sample_TB where id = cast('' as decimal); で、 mysql> select cast('' as decimal); +---------------------+ | cast('' as decimal) | +---------------------+ | 0 | +---------------------+ 1 row in set, 1 warning (0.00 sec) mysql> show warnings; +---------+------+---------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------+ | Warning | 1292 | Truncated incorrect DECIMAL value: '' | +---------+------+---------------------------------------+ 1 row in set (0.00 sec) 警告が出る。 ちなみにOracleだと''はNULL扱い、'a'とかやるとエラー。
418 :
NAME IS NULL :2008/09/14(日) 13:29:58 ID:6BX47RV+
date型を、9999-12-31 23:59:59.999999の形式でselectするにはどうすればいいですか? 9999-12-31までしか表示できなくて困っています。 設定ファイルとかあるのでしたら、教えてください。
× 2008/09/24 ○ 2007/09/24
select文とexplainの結果を食わせて どうしたらいいかのヒントまでくれるような そんなソフトってないかな
インデクスがあるのに何で使ってくれないんだー、ばかー、というとき、理由の explain が欲しいことはあるな。
423 :
NAME IS NULL :2008/09/16(火) 07:07:05 ID:7pGt26W3
データ件数が、4万程度のテーブルにORDER BYをすると、 タイミングによって、 Out of memory (Needed 2095128 bytes) が発生します。 sort_buffer_sizeが今2MBなので、16MB位設定しておけば、 発生はしなくなるのですが、ネットで調べると2MB位が最適と書いてあります。 何か回避策が他にありますか? 個人的には、全てメモリーでやらずに割当されたメモリーがMAXに到達したら、 遅くなっても良いので、ディスクに書き込んで欲しいです。
whereで分散とかダメ?
>>424 さっそくのレスありがとうございます。
whereで分けるというアイデアは気づきませんでした。
で、先ほどやってみました。
で、うまくいきました、とご報告したかったのですが、
こんどは別のSQLのGROUP BYで同じくOut Of Memoryで落ちました。
結局、相当な数のSQL文に手を入れることになりそうです。
もう、テストも終わりを迎えておりまして、
これを全部対応しようとすると、再度テストをやり直す羽目になりそうです。
パラメータを変更するなどの運用でなんとかするというのは難しいでしょうか。
数万件でOut Of Memoryが多発すると考えていなく、誤算でした。
メモリあるんならsort_buffer_sizeでいいんじゃねーの? 本当にそんぐらいないと足りないソートが走るようなら遅いとか 別の問題がありそうだが.
数十万件のソートは普通にできますが、僅か数万件のソートで問題が生ずるのなら、 むしろソートする1レコード(キーとか色々含む)が巨大で、それが sort_buffer_size を 上回るとかの問題ではないかという気がします。(ソート自体はtemp fileを使うはず)。 「Needed 2095128 bytes」と言われたなら、素直に my.cnf に sort_buffer_size=10MB とか書いておけばよいのではないかと思いますが…。 ただ、もし本当にレコードが巨大なら、それを丸ごとソートする事自体を考え直す方がいいかも。
>>426 >>427 詳しくお返事ありがとうございます。
ちょっと言葉が足らずにすみません。
sort_buffer_sizeの設定を見直そうと考えたのが、
接続がmax_connections近くになると、
それもOut Of MemoryでMySQLサーバー毎落とされるという現象がきっかけでした。
それで、sort_buffer_sizeではなく他のパラメータなどで見直せないかと思っておりました。
>>427 さんの仰られるとおりで、TEXTフィールドを含むテーブルで、
テーブル全体の量としては大きいです。
ソートする列は、単純な6桁の番号や5文字のCHARなので、大丈夫だと思っていましたが、
ソートする場合は、該当する列だけではなく、その他のデータも含まれるんですね。
これも勘違いしていました。そう考えると対応が難しいですね。
>ソートする列は、単純な6桁の番号や5文字のCHARなので、大丈夫だと思っていましたが、 >ソートする場合は、該当する列だけではなく、その他のデータも含まれるんですね。 いや、一行目の理解で正しいんじゃないでしょうか。 なんだか、ソート以外の処で引っ掛かっているような気がします。
>>429 > なんだか、ソート以外の処で引っ掛かっているような気がします。
ありがとうございます。それなら、まだ改善の見込みは少し残っているかもしれませんね。
ちなみに、これ、もし、宜しよろしければ、
どなたか、コメント頂けると嬉しいです。
今回のエラーに関係がある部分を抜き出しました。
*****で書いてあるのが、かなりいじった所です。
チューニングについて書いてある色々参考にしたため、
つじつまが合わなくなっているかも知れません。
[mysqld]
key_buffer = 64M *****
tmp_table_size = 64M
table_cache = 1024 *****
sort_buffer_size = 2M *****
read_buffer_size = 2M *****
read_rnd_buffer_size = 4M *****
myisam_sort_buffer_size = 64M *****
thread_cache_size = 8
query_cache_size = 32M
max_connections = 200 *****
default-table-type=InnoDB
innodb_buffer_pool_size = 256M *****
innodb_log_file_size = 64M *****
innodb_log_buffer_size = 32M *****
[isamchk]
key_buffer = 128M *****
sort_buffer_size = 4M
read_buffer = 4M
write_buffer = 4M
[myisamchk]
key_buffer = 128M *****
sort_buffer_size = 4M
read_buffer = 4M
write_buffer = 4M
連投ですみません。Memory異常が発生しているテーブルはInnodbです。 MyISAMは、殆ど使っていません。
ほんと、なんどもすみません。積んでいるメモリーは2GBです。 innodb_buffer_pool_size + key_buffer_size + max_connections * (sort_buffer_size + read_buffer_size) + max_connections * 2 MB で計算すると1520MBで、Apacheと共存して使っています。
OSは何? Windows 32bitだと普通に限界近いよね。
>>433 Cent OS4です。
で、あれから色々やってみましたら、
innodb_buffer_pool_size = 256M
から
innodb_buffer_pool_size = 128M
にしたところ、エラーが出なくなりました。
また、テストケースが残っているので、なんとも言えませんが、
今まで出ていたテストケースでエラーが無くなったのは収穫です。
Out Of Memoryで割当をどんどん増やしていきましたが、
逆に下げるべきだったでしょうか???謎です。
まだ残っているテストケースをやってみます。
簡単ながら、ご報告まで。
ふつうに32bitの壁っぽいね。 64bitにするとか、 上位層からの同時接続数を絞ってもらうよう 交渉するとか。
MySQLのレコードの処理は4万件でも10万件でも100万件でも 基本的に問題ないよね?チューニングしてれば。 でも、エラーになりやすい事を考えると、 レコードが増えていったら、テーブルを分ける方が良いのだろうか?
問題ないすよ。 エラーになりやすいかどうかは一般化できないし、 それに対してテーブル分割が適しているかどうかも一般化できないと思うけど。 テーブル分割のメリットって、検索範囲を絞る必要が軽減されて SQLやインデックスで考えるパラメータが減りますよね、とか インデックス張り直す速度が向上しますよね、って程度しか思い付かない。 その代わりに柔軟性が落ちて、出来ない検索が増える、と。 あんまメリット無くない?
2chのように1日に何万回も書き込みが発生する規模の掲示板を作っているのですが、こういったことにデータベースは不向きでしょうか? レンタルでの運営なので全体では2ch規模になると思われます。 検索機能もほしいのでできればデータベースでレス1つ1つを保持したいのですが莫大なログの読み書きは現実的に可能でしょうか? ロードバランスなどの負荷対策は行います。
>>438 板毎にテーブルを作成するの?
2ch規模だと、板毎にサーバが必要になるだろうけど、
まぁそんなアクセスは無いと思うから、普通に大丈夫だと思うけど。
板をまたいだスレタイ検索ならともかく、 板をまたいだスレの内容(レス)検索って、あっても相当使いにくそうな気がする。
>>439 さん
レスありがとうございます。
同一テーブル内で一意な掲示板IDをふって分ける形になります。
携帯のレンタル掲示板なのですべてのアクセスを合算すれば2ch規模になることもありえます。
負荷対策はプロキシかませてごちゃごちゃやることになると思います。
ログ自体はdatファイルで保存して検索されうるデータだけDBに入れておいてDBは検索の時のみ使うのが最適でしょうか?
すべてのレスが同じテーブルに格納されているのでビジーになってしまう気がして…
ご教示お願い致します。
>440さん レスありがとうございます。 全体検索はスレタイのみでもごまかせると思いますが、 画像や着うたの投稿も実装するのでできればレス検索も想定しておきたいです。 おそらくレス検索は別サーバに全レスデータいれてsennaでぶんまわす感じになるとは思います。
>ログ自体はdatファイルで保存して検索されうるデータだけDBに入れておいてDBは検索の時のみ使うのが最適でしょうか? 俺もそれでいつも悩むんだけど、ログ=検索されうるデータじゃないのか? 例えば、スレタイ・レスと登録日のテーブルを分けるとしても 結局、必要なデータなわけだから、DBに入れるのもdat化するのも 同じ事のように思うんだが。
DATのほうが使いやすいと思う・・・。データベース鯖のこと考えなくて済むし。 掲示板レンタルならなおさらじゃない?
でも、ログを検査する時、大量に読み込まなきゃいけないだろ? 実質無理じゃないか?負荷がかかりすぎて。
書き込みをdatにしまうときに、senna に掛けて検索用キーだけDBに入れる、という意味じゃないの?
検索用キーを入れても、取り出す時に ファイルを読み込まないといけないのでは?俺の知識不足かな。
grep(ry
>>447 そりゃそうだが、読む必要があるのは表示する分だけだから、ごく少量でしょ。
>読む必要があるのは表示する分だけだから ってことなら、やっぱりDBでいいんじゃないか?
その用途でDBはオーバースペックなんじゃね?
なんでもかんでもRDBMS使おうとすんなよ。 sennaの結果をキーにしてレス番引くハッシュDB+共有メモリだ、この野郎。
sennna使うって、専鯖じゃないと無理では?
454 :
NAME IS NULL :2008/09/18(木) 07:56:38 ID:aEJbx1ek
innodbの行レベルロックを調べていますが、
http://dev.mysql.com/doc/refman/5.1/ja/innodb-locks-set.html の説明が訳文が不自然で分かりにくいので、教えて下さい。
update文やdelete文を実行する際に、
whereで該当した行だけがロックがかかるのでしょうか?
たとえば、whereで条件設定したupdate文を実行している最中に、
他のセッションからselectやupdateが実行された場合、
whereに該当するデータを対象としている場合は、ロックにより待たされるけど、
whereに該当するデータではない場合には、そのまま待たされずに実行されるということでしょうか?
実験してみたかぎりでは、そのような感じを受けるのですが、
いまいち確信が持てません。宜しくお願いします。
> update文やdelete文を実行する際に、 > whereで該当した行だけがロックがかかるのでしょうか? NO そのSQLを実行するために「InnoDBが触った行がすべて」ロックされる。 索引の効かないSQL、例えば UPDATE AAA SET BBB = CCC WHERE DDD LIKE '%ABC%'; こんなのを実行すると全行ロックされる。 > 他のセッションからselectやupdateが実行された場合、 > whereに該当するデータを対象としている場合は、ロックにより待たされるけど、 > whereに該当するデータではない場合には、そのまま待たされずに実行されるということでしょうか? MVCCだからそもそもSELECTは待たされない。 前述した仕組みにより UPDATEは他の更新SQLのWHERE句と重なっていなくても待たされることがある。
456 :
442 :2008/09/18(木) 13:11:40 ID:???
皆様、たくさんのご意見ありがとうございますm(_ _)m
>>444 さん
datのみということでしょうか?
ファイルをごちゃごちゃいじるのが苦手なのでレス編集・レス削除・レス検索の実装を考えるとどうもうまくいく絵が想像できないでいます…
ちょっとdatのみの場合の設計も考えてみます。
>>445 さん
datとDBにする場合はDBを検索専用に考えてます。
なのでdatのみだと検索が大変そうなのでレスデータをDBにいれておけば検索も簡単にできるかも と思いました。
>>452 さん
貴重なご意見ありがとうございます。
無知すぎてどういう意味か理解できません。調べます。
>>453 さん
ハウジングです。
457 :
~ :2008/09/18(木) 13:35:45 ID:cULg/wVA
ググっても出ないので教えて下さい DBの中のtableを別のDBに移すのに、今はtableを全部PHPの配列に入れ、新しいtableを作りループで書き込んでいます。 配列に入れるとメモリも食いそうなので クエリだけで別のDBに変更する方法があれば教えて下さい。 鯖は一台です。別の鯖に移したいということではないです
>>457 テーブルの構造は「固定」なの?
固定なら新しいテーブルを作成する時に、
予め作成しておいたSQLファイルを実行すればいいと思う。
459 :
NAME IS NULL :2008/09/18(木) 16:15:36 ID:aEJbx1ek
>>455 さん詳しくありがとうございます。
分かりやすい説明でよく分かりました。
indexが効くようなSQLを考えたいと思います。
助かりました。
460 :
457 :2008/09/18(木) 22:27:14 ID:cULg/wVA
テーブル構造はそのままです。 同じDB内ならテーブル名を変更すればいいだけだけど そんな感じで名前そのままでDBだけ変更できないかなって思って
461 :
457 :2008/09/18(木) 22:27:49 ID:cULg/wVA
>>460 それって単に新規テーブル作成するだけじゃないのか?
464 :
457 :2008/09/19(金) 12:38:01 ID:iYQHTpJc
とりあえずmysqldumpは分かったんですが このコマンドってどうやって使うんですか? mysql > って書き方じゃないからPHPのクエリ送る関数では無理ですよね? となるとプロンプト画面からだけなんですか? めんどくさい…。
LOAD DATA INFILEやINTO OUTFILEに日本語のファイル名が使えないのですが、 これは仕様なのでしょうか。
466 :
465 :2008/09/19(金) 15:16:39 ID:???
自己解決しました。
コンソールもまともに使えないバカはDB使うな
468 :
NAME IS NULL :2008/09/20(土) 00:04:28 ID:z861H5yU
PHP+MySQLでデータベースシステムを構築しようと考えています。
PHPは文字コードにUTF-8を使用している為、MySQLでのテーブルは↓のコマンドを使用し、UTF-8で運用するようにしています。
create table 【テーブル名】 ( 〜 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
PHPでは読み書き共に問題ないのですが、コマンドプロンプト上では日本語が文字化けしてしまいます。
「chcp 65001」コマンドでコマンドプロンプトの文字コードをUTF-8にしても同じく化けています。
PHPで使用する分には支障が無いため、このままでも良さそうな気がしますがどうも気になります。
他に何か設定する箇所があるのでしょうか?それともこれはこういうものなのでしょうか?
知識のある方よろしければご回答願います。
以下、今まで試した設定です。
・MySQL接続時に「mysql_query("SET NAMES utf8")」コマンドを使用し、文字コー
ドをUTF-8にするようにしている
・my.confです→
http://uploadr.net/file/ee7daa730e ・↓データベース文字コード設定です
mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
>>468 コマンドプロンプト上ではSJIS(cp932)
470 :
NAME IS NULL :2008/09/20(土) 00:18:33 ID:z861H5yU
>>469 「chcp 65001」コマンドで文字コードを変換しても駄目なのでしょうか?
> 「chcp 65001」でUTF-8
これ、自分もいつかどこかで聞いたことあるけど、UTF-8にならなかった。(XPsp2 and sp3)
そん時MSのKBとかでも探してみたんだけど、結局ようわからんかった。
つうことで
>>469 chcp 437 とかで、ISO-8859-1(Latin1)とかにすることは可能。
どうしてもUTF-8のまま扱いたかったら、コマンドから、>(リダイレクト)で出力を
ファイルに書き出せばいいんでない。
472 :
471 :2008/09/20(土) 02:34:24 ID:???
失礼。
>>471 書き込んでからもっかいググってみたら、
どうやらコマンドでchcp65001入れるだけでなくて、
プロパティから「フォント設定」も変更しないといけないらしい。
つうことでやってみたら、コマンドプロンプトがUTF-8にナッタヨ!でも一部の文字が化ける。
(しかも一度画面を切り替えるなりして、Window再描画したら直るし。意味分からん)
とゆうこで471は忘れて下さい。あんまやるとスレ違いにもなっちゃうので。
スレ汚し失礼しました。
chcpは知らんかったが、コンソールの文字コードを変えるのではなく、 mysql> set names sjis; で、クライアントの方を変更するのではだめなのかな?
chcpはなんか変換されないで空白になるのも多いから utf-8になるコンソールでもあればいいんだけどね
475 :
NAME IS NULL :2008/09/20(土) 22:36:32 ID:CkpTAsfp
なんでだろー なんでだろー なんでだなんでだろー カラムをtextからblobにしても やっぱりJPG画像などのバイナリデータは base64encodeしないと入らないのは何でだろ〜 base64encodeしないと入らないの? なんで? 教えて! ちゃんとPHPでrealストリング関数かけて、'とかエスケープしてるのに。 なんで? blobの意味ないし。
LAN{スレ行けばいいんじゃね
PHP 知らないけど、プレースホルダ使えないの?
478 :
NAME IS NULL :2008/09/21(日) 09:57:28 ID:kM7sFGM5
Xeon 3GHz 4GB Memory MySQL5.1 FreeBSD7.0 RAID-1 の構成で運用していますが、MySQLの一秒間の処理の限界っておおよそどれ位でしょうか? 検索で調べると6000回に成功したとか記事が踊っていますが、 MySQLのソースをいじらずに限界と思われる目安が知りたいです。 ちなみに、現在60query/sのサイトを運営していますが、まったく支障はありません。 これより、もっともっとヘビーな運用していらっしゃる方いますか?
・クエリキャッシュの有無 ・SQLの複雑さ ・バッファキャッシュへのヒット率 ・ネットワーク経由かどうか といった要因で性能は1〜2桁変わるから、 人の聞いても意味ないよ。 意味ないことを示すために手元のノートPC(Core2Duo 2.0GHz)で 8735.9 query/s 出してみた。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class BenchTest { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/scott", "root", "xxxx"); Statement stmt = conn.createStatement(); long time = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { doTrans(stmt); } time = System.currentTimeMillis() - time; System.out.println(time / 1000.0); stmt.close(); conn.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } static void doTrans(Statement stmt) throws SQLException { ResultSet rs = stmt.executeQuery("select 1"); while (rs.next()) { // } rs.close(); } } これで11.447秒
テーブルhogeのaとbというフィールドに複合インデックス作って以下のようなクエリを 実行しているのですが、インデックスを使用してくれません。 select * from hoge where (a, b) in ((1,2), (3,4), (5,6), ... ); インデックスを使用して効率的に上記のような文を実行させる方法はありますか?
482 :
NAME IS NULL :2008/09/21(日) 21:24:14 ID:Y5xtFq5q
>>253 あたりもあるのですが
更新日時と登録日時みたいに、新規レコード追加時に両方ともCURRENT_TIMESTAMPにしたいことって
あるじゃないですか?
こういう場合どうしてます?
ホスト言語側で対応するよりしょうがないですか?
ふつうはトリガ使うんじゃないの
データをUTF-8で入れているのですが、すべてのデータをujis(euc-jp)に変えることは可能でしょうか? 今、考えつく方法はmysqldumpしてエディタで文字コードを変えていれるくらいです コマンドでできる等ありましたらご教示お願いします
euc-jp で表現できない文字は、どうするの
>>484 データ消しちゃってて、0件の時どうするか書いてないんじゃないのw
488 :
482 :2008/09/22(月) 14:36:02 ID:???
>>483 レスありがとうございます。
トリガですか。ひとつのテーブルに一個しかDefualtでCURRENT_TIMESAMP入れられないの地味に面倒ですね。
せっかくトランザクションがあるのに・・・
登録日時はデフォを0にして、ホスト言語でやるか、トリガ導入するか検討してみます。
すいません。もう一点。
実はポスグレからの移行なのですが、文字列を入れるカラムをポスグレのときは、
長さを考えずに全部TEXTにしていたのですが、MySQLだと、
TEXTにするとインデックス作るのに長さを指定しなきゃならないみたいなので
最大文字数を想定できるところはVARCHAR(L)でやろうかと持ってます。
ただ、慣れないので色々迷ってまして、
この数字って、255以下の時と256以上の時で最低の容量が違うだけで、
実は10とか100にするのと255にするのはあまり変わらなかったりするのでしょうか?
なるべく、小さめに設定した方がいいにか、
それこそ、ざっくり255 or 65535でやっちゃって良いのか、
はたまた、いっそのこと全部TEXTでやっちゃうのか。インデックス作るのに長さ指定するのはそんなに面倒じゃないし。
先輩方よろしくお願いいたします。
489 :
NAME IS NULL :2008/09/22(月) 14:39:32 ID:dQ0vwUgz
490 :
482 :2008/09/22(月) 15:51:02 ID:???
VARCHARとTEXTの違いを整理・共通点すると ○両方とも可変長である ○単位 VARCHAR 文字単位(マルチバイト文字は2文字にカウント。文字コードにより変わる) TEXT バイト単位(文字コードにより変わる) ○容量 VARCHAR
491 :
482 :2008/09/22(月) 15:59:43 ID:???
うぎゃ、なんかよくわらんが、スペースおしたら書き込んだ、すんません。 VARCHARとTEXTの違いを整理・共通点すると(ちなみに5.0.45です) ○両方とも可変長である ○単位 VARCHAR 文字単位(マルチバイト文字は2文字にカウント。文字コードにより変わる) TEXT バイト単位(文字コードにより変わる) ○容量 VARCHAR 0〜255文字までなら+1バイト、それ以上は+2バイト TEXT TINY、MEDIUMなど、最大容量によって+1〜+4バイト ○インデックス VARCHAR プリフィックス長を指定して、部分インデックスを作ることも出来る TEXT 必ずプリフィックス長を指定する。 こんな感じでしょうか? プリフィックス長を指定したインデックスの挙動をいまいち理解してないのですが UNIQUEなどには出来ないってことですよね? 主キーやUNIQUEならVARCHARで、それ以外はINDEXはって検索にバリバリ使うなら 、少しVARCHARオススメで、あとはそれほど変わらないって事でしょうか?
492 :
NAME IS NULL :2008/09/22(月) 19:34:27 ID:sUYPnH9p
質問です。 結果を見やすくするためpager less -n -i -Sをを使ってみたのですが、 lessが日本語対応していないらしく、文字化けしてしまいます。 lvコマンドは-Sに対応してないようで困っています。 何かいい方法はありませんか? 会社のサーバですのであまり環境を変えない方法がいいです。 よろしくお願いします。
492です。 コマンドの最後に\Gを入れることでよく見えるようになりました。 ありがとうございます。
494 :
485 :2008/09/22(月) 19:47:05 ID:???
>>486 表現できない文字も強制的に変換してしまいたいです。文字化けすると思いますが
Debian (Linux)上にmysql 5.0.32-7 をインストールしています。 mysqlの設定ファイル my.cnf に [client] default-character-set=utf8 [mysqld] default-character-set=utf8 skip-character-set-client-handshake を追記し、新規にデータベースを作成したりテーブルを作成した場合は文字化けしないのですが WindowsXPにインストールしたmysqlのデータを mysqldump -u root -p[rootのパスワード] [DB名] > db.sql 等とエクスポートしたファイルをLinuxのシェルで mysql -u root -p[rootのパスワード] [DB名] < db.sql すると show full columns from [テーブル名] 等とすると [レコード名] | varchar(30) | sjis_japanese_ci と表示され、utf8になってない事が分かります。コレをutf8にすれば文字化けしないはずなのですが (新規に作成したテーブルだとutf8になっていますので) どうすれば変更できますか? alter table [テーブル名] default character set=utf8 を実行してコマンドは成功したみたいなのですが、実際に確認してみても変わりません。 alter table [テーブル名] default character set=utf8; Query OK, 10 rows affected (0.01 sec) Records: 10 Duplicates: 0 Warnings: 0 ↑成功しているように見えるのに変化しません・・・。どうすればいいんでしょうか?
nkf使うとか(違
>>485 alter table tblname convert to character set ujis;
とか?
498 :
485 :2008/09/25(木) 13:51:14 ID:???
>>497 ありがとうございます!
そのコマンドを実行してみましたが、データはutf8のままのようです。
レプリケーションで2つの同期するテーブル構成を少し変えたいのですが可能でしょうか? 以下のような構成にしてDB2(スレーブ)はselect専用にしたいです。 update,insertはDB1(マスター)で更新というかたちです。 DB1 ------------------------- seq title body body2 date primary key seq ------------------------- DB2 ------------------------- seq title body body2 date primary key seq, index title, fulltext body,body2 -------------------------
500 :
NAME IS NULL :2008/09/26(金) 06:11:12 ID:JNwKxv59
レプリケーションでマスターとスレーブの同期をとるためのコマンドLOAD DATA FROM MASTER があったけど、今使えないっつうか、廃止予定らしい。 レプリケーションで新しくスレーブ足してマスタースレーブのデータの同期を取るのはどうすりゃいいの? 一旦マスターとめてデータのバックアップをスレーブでリストしないとだめ? それともマスター動かしたまま、とりあえずバックアップとってスレーブでリストア、 あとはレプリケーションうごかすと、バイナリログでそのうちマスターとスレーブが同期する? 難しくてわかんないよぉ
501 :
499 :2008/09/26(金) 11:01:07 ID:???
>>500 止めるか、ロックすれば良いと思います。
ロックがオススメ
マスターにレプリケーション用のユーザ登録→現在のDBデータをスレーブに送る(tarでまとめてscp)
あとはスレーブ・マスターで設定すれば同期してくれます。
スレーブに送る際にDBデータのpositionデータを覚えておけば後はゆっくりできます。
マスターもtarとposition見たらロック解除してOKなので5分程度で終わります。
詳細は「現場指向のレプリケーション詳説」で検索すれば出てきます。
502 :
499 :2008/09/26(金) 11:01:34 ID:???
>>500 止めるか、ロックすれば良いと思います。
ロックがオススメ
マスターにレプリケーション用のユーザ登録→現在のDBデータをスレーブに送る(tarでまとめてscp)
あとはスレーブ・マスターで設定すれば同期してくれます。
スレーブに送る際にDBデータのpositionデータを覚えておけば後はゆっくりできます。
マスターもtarとposition見たらロック解除してOKなので5分程度で終わります。
詳細は「現場指向のレプリケーション詳説」で検索すれば出てきます。
500じゃないんですけど、常時結構な量の書き込みがあって ロックするとコネクションが溢れちゃうんだけど どうしたらよいでしょう。 そんな設計すんなよ、というのはそのとおりなんですけども。
スレーブを一つ止めてそっからコピーでできるといいのにね。スレーブもマスターのどこまで レプリケーションできたかの情報もってるからできそうな気もするけどよくわからん。
505 :
499 :2008/09/26(金) 13:15:04 ID:???
>>503 ユーザにメンテナンスと断りを入れておいていったんLANケーブル外してロック&tarするのはどうでしょうか?
止めたくないのはわかりますが、5分程度ですしメンテナンスの告知もしないでレプリケーション設定を行うのは万が一の場合、危険です。
一回、tarとそこまでのpositionとっておけばスレイブを増やす場合でもそのファイル&position情報でいけると思います。
試してないけど…
>>499 は検索用なので定期的にcronとかで設定した方が良いかなぁ…
こういうことはなせる同僚がほしい…
506 :
499 :2008/09/26(金) 13:18:56 ID:???
>>504 すでにスレーブが1つ以上あるならそれでもいけるかもしれない…
スレーブ止めて
show slave status\G
の
Read_Master_Log_Pos値をpositionにしてあとは同じ感じでできるかも
これまた試してないけど…
507 :
NAME IS NULL :2008/09/26(金) 16:44:28 ID:UeZFxsYq
CentOS3.6のMySQL(3.23.58)でBDBテーブルを作りたいんですが リコンパイルする必要があるのでしょうか? 或いはリコンパイルする必要があるか確認する方法はありますでしょうか? リコンパイルする必要がないのでしたらどのようにしたら BDBテーブルが作れるようになる設定や環境などあるのでしょうか? 現状create tableでTYPE=BDBを指定してもエラーにはならないのですが 出来上がったテーブルはMyISAMになってしまいます。
レプリケーションの便乗質問 マスターの古いバイナリログを消すと新しいスレーブ追加するとき面倒? 今は全部あるから面倒なくスレーブ追加できるけどさすがにログが増えすぎたんで消したいんだけど
BOLBってなに?
BLOBの間違いだろう、たぶん
それそれ。 名前から機能がまったく推測できないから、 かんたんに説明してもらえる?
そのぐらいぐぐれよ Binary Large OBject サイズの大きなバイナリデータを入れるときに使う。
サイズの大きなバイナリデータ。 jpgの画像とか? ありがとね。
xamppいれて、 cakephp入れて、 phpmyadminで mysqlのデーターベース作成して やってるんだけど、 おぼえることがおおくてしにそうです
cakephpで phpmyadminというものを わけもわからずに使わせられたんだが、 これっていったいなんなの? これでmysqlのデーターベースを作ったり 項目を追加したり名前の設定をしたりするようだが。
516 :
NAME IS NULL :2008/09/29(月) 18:19:33 ID:KUDRPKKk
バージョンは4.0系です select * from table where id=10 こうするとidが10のレコードを取り出せますが、この前後のレコードも一気に取り出す記述はありますか? autoincrimentを付けてたら楽だったのですが、現在はつけておりません
>>516 select * from table where id<10 ORDER BY id DESC LIMIT 1;
select * from table where id>10 ORDER BY id LIMIT 1;
って一気にか。そりゃ無理だな。
と思ったけど、無理じゃなかったな。 出来たよ
519 :
516 :2008/09/30(火) 10:01:31 ID:???
520 :
NAME IS NULL :2008/09/30(火) 12:05:09 ID:KB4BJQpx
482で更新時間と登録時間にCURRENT_TIMESTAMPを入れる質問をしたものですけど トリガで試してみたらうまくいきません。 DELIMITER | CREATE TRIGGER update_user_add AFTER INSERT ON t_user FOR EACH ROW UPDATE t_user SET user_add = CURRENT_TIMESTAMP WHERE user_id = NEW.user_id; | DELIMITER ; こんな感じでトリガ作ったのですが、 ERROR 1442 (HY000) at line 1: Can't update table 't_user' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. とエラーが出ます。 なんか、トリガーがループしてる感じですか? 間違ってなさそうに見えるんですけど、なんか勘違いしてますか? ちなみにuser_addのカラムは user_add TIMESTAMP NOT NULL DEFAULT 0, こんな感じに作ってます アドバイスお願いいたします。
521 :
520 :2008/09/30(火) 12:26:49 ID:KB4BJQpx
ttp://okwave.jp/qa4020691.html なんか、だめみたいですね。
別テーブルに分けなきゃだめっぽい。
慣れの問題かもしれませんが、更新時間と登録時間を同時に
CURRENT_TIMESTAMP入れるのがこんなに面倒なのはどうかと思う。
ホスト言語でやれば簡単ですけど、それもなんかなあ。
なんか、簡単な方法ありますでしょうか?
postgreはバキュームがなあ。
まあ、8.3使えばいいんだろうけど。
あと、MySQLレプリケーションが簡単なのがいいんだよなあ。
SPAM襲来
そんなわけで、asksにSPAMがきたわけですけど、
8254個のアカウントが登録されていたので、
DBからさっくり消してみました。
手動で消そうと考えて、100個づつ15分ぐらい消していて、
全部でいくつなのか調べてみようと思ったら、
手動じゃ無理だということがわかって、
DBから消したら2秒で終わりました。
8254 rows in set (0.89 sec)
mysql> delete from user where email like "%stroam.info" ;
Query OK, 8254 rows affected (2.43 sec)
http://www.asks.jp/users/hiro/50142.html
>>521 mysql> desc trig;
+-------+-----------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+----------------+
| col1 | int(11) | NO | PRI | NULL | auto_increment |
| col2 | timestamp | NO | | CURRENT_TIMESTAMP | |
| col3 | datetime | YES | | NULL | |
+-------+-----------+------+-----+-------------------+----------------+
mysql> delimiter /
mysql> create trigger trig before insert on trig for each row
-> set new.col3 = CURRENT_TIMESTAMP;
-> /
mysql> delimiter ;
mysql> insert into trig values ();
Query OK, 1 row affected (0.00 sec)
mysql> select * from trig;
+------+---------------------+---------------------+
| col1 | col2 | col3 |
+------+---------------------+---------------------+
| 7 | 2008-09-30 20:41:16 | 2008-09-30 20:41:16 |
+------+---------------------+---------------------+
1 row in set (0.00 sec)
該当行を更新するだけならNEWとOLD使えばいいでしょ。
>>524 なるほどそんな手があったのですね。
OKに書いてあったのは、同じテーブルの別の行をってことですね。
ありがとうございました。
すみません。下記環境でMySQLが停止できなく困っています。 OS:RHLinux4 MySQL:5.0 ストレージ:InnoDB 大量データを更新中(2000万件)セッションが切断。 なくなくMySQLごと"service mysql stop"で再起動をかけようにも ずっと待機中で停止せず。 これは更新失敗に対しROLLBACK待ちをしているという可能性はありますか? 強引にkillはやめておきたいのですが、 やはりkill -9 とかで撃ち殺すしかないのでしょうか。
527 :
NAME IS NULL :2008/10/01(水) 01:25:59 ID:YdAay/hy
MySQLを勉強しようと思い xamppをインストールして文字コードをlatin1からutf8に変更したいんですが うまくいきません・・・ 参考書やサイトを調べるとcharacter-set-serverを変更するようにと書いてありますが my.cnfにそういった項目がありません。 ちなみにxamppのバージョンは2.5です。 すいませんがアドバイスよろしくお願いします。
528 :
527 :2008/10/01(水) 01:49:08 ID:???
すいません自己解決しました。 お騒がせしました・・・
529 :
NAME IS NULL :2008/10/01(水) 16:37:31 ID:TVxghor3
すみませんが MySQLをUSBメモリーに入れて持ち運んだり 使ったりする方法があれば教えて欲しいのです。 当方Databaseは全くの初心者なのですが、Googleで検索すると 小さなLinuxのディストリにMySQLを入れてUSBメモリーで活用する方法は あるようなのですが、起動したWindowsPCを利用してUSBメモリに入れた MySQLを起動する方法はあるのでしょうか? 例えばOpenOfficeのBaseはMySQLのインターフェイスとして使えるみたい なのですが、ポータブルOpenOffice(USBから起動可能)とMySQLを同じ USBメモリにいれて、OpenOfficeBaseからMySQLを使うみたいな方法とか 可能なのでしょうか? もしかしたら(おそらく)頓珍漢な質問なのかもしれませんが ご教授よろしくお願いします。
531 :
530 :2008/10/01(水) 17:04:44 ID:???
>>530 素早いレス有り難うございます
さっそくGoogleで調べてみたのですが
なんとも漠然として良く解らないのですが
このXOOPSってものはUSBメモリーに入れて
WindowsPCのUSBコネクタに刺すだけで
ポータブルアプリのように使用することが
出来るのでしょうか?
533 :
531 :2008/10/01(水) 17:57:08 ID:???
>>532 ありがとうございます。
紹介していただいたサイトにアクセスして
ダウンロードを試みたのですが
今の私のネット環境が、ファミレスから
ノートPCで、auの通信(定額)カードからアクセスしているもので
通信速度が不安定なためうまく落ちません(時間がかかる)
家に帰って光環境で改めてダウンロードしてみたいと思います。
それまでしばらくxoopsってものを検索してみます
ありがとうございました。
xamppじゃだめなの?
>>534 xamppにインストール以外で動くのってあったっけ?
536 :
NAME IS NULL :2008/10/03(金) 15:40:23 ID:EkG+fINK
mysql> select * from hoge; +---------------------------------------- | NO | NAME | EXPLAIN | +---------------------------------------- | 01 | あああ | 説明1 | | | | 説明2 | +---------------------------------------- | 02 | いいい | 説明3 | +---------------------------------------- ズレかな? Mysql初心者です。質問ですが上記のようにフィールド内で改行して入力することは可能ですか? コマンドプロンプトからではなく、PerlからINTOしていますが、改行コードをいれると、コマンドプロンプト上で 激しく見えにくくなるのでなんとかならないかと悩んでいます。
>>518 > 出来たよ
俺も知りたい。
「前へ」と「次へ」がやりたい。
>>536 フィールド内に改行(LF)を入れるのは perl でも何ででもできるが、
それをコマンドプロンプトから桁揃えして見せようというのは無理だと思う。
>>538 pager指定できるからその辺の整形を超頑張るプログラムを作成して
そいつに食わせればOK。いいのができたら公開してください...
542 :
537 :2008/10/03(金) 17:42:29 ID:???
前へ次へじゃないんだ? ブログサービスでblogテーブルとentryテーブルがあって blog - id - name - user_name entry - id (unique) - blog_id - title - body こんな感じだとして、 entryを1件表示するときは select * from entry where id=10 order by date limit 1 これで良いけど このentryの前後のentryを1発で取れたらいいなあ。 select * from entry where id=10 order by date limit (-1,0,1) こんな風に書けたらいいんだが。無理%8
それidがuniqだし、どうがんばっても1件しか取れないじゃないか
entry に id_before, id_next とか入れておいて join すれば
id=10のやつよりdateが小さいのをdate降順に1つ id=10のやつそのもの id=10のやつよりdateが大きいのをdate昇順に1つ をそれぞれ求めるselectは書けるだろうからあとは unionでつなげりゃひとつになるぞ
547 :
NAME IS NULL :2008/10/04(土) 01:43:40 ID:ZUcZ2Wn8
ibdata1がストレージを圧迫しています。 dumpでリストアする事によってファイルサイズを小さくする事はできるでしょうか? dumpでデータ退避し、mysqld停止、ibdata1削除、mysqld開始、dumpでリストア こんなもので可能なんでしょうか?
id>=9 and id<=11 じゃあダメなのか?
それはidに抜けがないことが保証されてないとな。
okokじゃあこれだな id >= (select max(id) from entry where id < 10) and id <= (select min(id) from entry where id > 10)
このスレ、アホばっかだな
質問もアホなら答える奴もアホ
>>548-550 は質問の内容と
>>546 をよく見たら?
質問がアホすぎるから解読大変だけど、オマエラもアホ
552 :
NAME IS NULL :2008/10/04(土) 21:21:45 ID:GMrT+eWs
とりあえず、通ぶって「マイスクル」っていうのをやめろ!!
553 :
NAME IS NULL :2008/10/05(日) 11:29:55 ID:Raag8XH9
登録日時に3日加算すると、現在の日時になるレコードを抽出する。 と言う事をやりたいと思っています。テキストで書くと、 ID1の登録日:2008-10-02 11:00:00 現在の日時:2008-10-05 11:00:00 登録してから3日経っているので、ID1が抽出される。
554 :
553 :2008/10/05(日) 11:30:44 ID:???
すみません、途中で送信してしまいました。。 上記のような事をしたい場合、どういうSQL文を書けばよいのでしょうか? バージョンは4.1.22を使っています。
>>553 SELECT * FROM table WHERE 登録日 < DATE_ADD(NOW(), INTERVAL -3 DAY)
こんなじゃない?
556 :
553 :2008/10/05(日) 14:07:14 ID:???
>>555 上手く目的通りできました。ありがとうございました。
>>555 おいおい、そのSQLパフォーマンス的には最悪だぞw
動けばいいとか思っている奴や趣味でやっている奴ならいいが。
じゃ、お前が例文出してみろよ。
自分ならプログラム側で処理しちゃうかなあ。 >557 趣味と言うか、実行される頻度が少ないなら……かも?
560 :
NAME IS NULL :2008/10/05(日) 22:05:19 ID:hWt3oaRG
MySQL 5 を利用しています。 先月の25日から今月の24日までをselectしたいんですが、どやればいいんでしょうか。。。 いろいろググりましたが、先月の25日の出し方がわからずここに来ました。 どうかよろしくお願い致します。
561 :
NAME IS NULL :2008/10/05(日) 23:20:41 ID:0Qb0kFe2
>>560 SQLでやるべき計算ではないし、第一、処理が意味不明だ。
3月31日までの場合、2月30日からということでいいのか?
日数か週ベースで計算するべきでないか?
とか余計なこと考えちゃったよ。
>>561 すいません。説明が足りませんでした。
値 登録日
値1、2008-09-24
値2、2008-09-25 *ヒット
値3、2008-10-01 *ヒット
値4、2008-10-24 *ヒット
値1、2008-10-25
とテーブルから値を引きたいんです。PHP側でやった方がよいでしょうか。。。
今日の日付 - INTERVAL 1 MONTH でたいていはいけると思うけど、 前の月に対応する日がない場合があるから注意。 以下のような動作になるのでそれで困る場合はさらに考えてくれ。 MONTH 、YEAR_MONTH 、または YEAR を加え、結果の日付が新しい月の最大日数より大きな日を持つ場合、その日は新しい月の最大日数に調整されます。 mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> '1998-02-28'
>>563 先月の出し方
select date_add(curdate(),interval -1 month);
2008-09-05
たしかに、先月はいけるんですが、日が今日になってしまいます。
日付は25日固定にしたいんです。
2008-09-25 にしたいんですが、方法がわからず。。。
でも、ありがとうございました。
DATE文の質問が続いているけど、 557が言うようにSQLだけで処理するべきじゃないの? 俺はいつもそうしてるんだがw PHPで処理するとしたら、一度登録データと照合して それを配列に入れてまた出力…って感じでこっちの方が重そうだが。
先月の25日が欲しかったのか。日付取り出して足したり引いたり してもいいけどdate_format使った方がすっきりするかな。 mysql> select date_format(now() - interval 1 month, '%Y-%m-25'); +---------------------------------------------------+ | date_format(now() - interval 1 month, '%Y-%m-25') | +---------------------------------------------------+ | 2008-09-25 | +---------------------------------------------------+ 1 row in set (0.00 sec)
>>566 ぬぉーーー!!!
ありがとうございます(T.T)
感謝感激です=3=3=3=3
そっか、そういう手があったんですね。ほんとありがとうでした。
MYSQLとSQLliteってどうちがうの?
AというデータベースにあるテーブルをBというデータベースに移したいのですが簡単に移せるコマンドなどあるでしょうか? どちらも同じサーバです。
mysqlはライセンスが糞だけどsqliteは真に自由
○思想的な MySQLはデータを保管するサーバ。 多数のプロセスやリモートサーバからアクセスされる前提で作られている。 SQLiteはローカルファイルを読み書きするライブラリだと思っておけばよい。 ネットワーク越しのアクセスは想定されていないし、ユーザ管理もできない。 ○ライセンス的な MySQLは有料を含む特殊なライセンスで縛られている。 SQLiteはパブリックドメインなので何をしても良い。 ○技術的な MySQLはセットアップもチューニングも複雑で、バックアップもSQLダンプせにゃならんので使いこなしが大変。 SQLiteは大規模な用途には不向き。メモリが溢れる。でも全OS共通のファイルベースなのでハンドリングが楽。 こんなところか?
572 :
569 :2008/10/06(月) 15:24:01 ID:???
おねがいします
RENAME TABLE
574 :
NAME IS NULL :2008/10/07(火) 06:47:48 ID:7N0nokGk
>>569 insert into テーブル名 select * from データベース名.テーブル名 where 〜
テーブル構造が全く同じ場合
※違う場合はカラム指定で
insert into テーブル名 select カラム名, カラム名 from データベース名.テーブル名 where 〜
サーバのバージョン: 5.1.24-rc-log 他たぶん5.1系列を使っています。OSはFreeBSD6系列と7です。
ibdata1が大きくなってきました。困りました。
いくつかのブログではテーブルごとに分割して
ALTER TABLE tablename TYPE=InnoDB
をせよ、と書いてありました。
公式をみたらdumpしてrestoreしろって書いてあるのですが、どっちをやるべきか
迷っています。
http://dev.mysql.com/doc/refman/5.1/ja/adding-and-removing.html そこでそれぞれの特徴とか長所短所とか理由とか他のカッコイイ方法などを
教えていただけるととてもうれしいです、教えてください。
テーブルごとに分割ってinnodb_file_per_tableのこと? これを仕掛けてalter tableすると、テーブルデータは 別個のibdファイルに入るけど、メインのibdata1はそのままで 小さくならない。 (file_per_tableしてもibdata1は内部処理のために引き続き必要) dump/restoreは一旦ibdata1が小さくなるが、 そのうちまた大きくなるんじゃない? だから (1) dump (2) innodb_file_per_table設定してibdata1を100MBぐらいで再作成 (3) restore が一番幸せ
577 :
NAME IS NULL :2008/10/07(火) 15:28:36 ID:w+mNm15C
便乗して質問します。file_per_tableにすると、 パフォーマンス的に劣化するとかありますか? file_per_tableにしてから、書き込みが遅くなったような気がするのですが。 あと、file_per_tableにすると、 障害が起こりやすくなるとかありますか? ファイルが複数別れることで、整合性がとれなくなる。っているような感じの障害です。 file_per_tableに関する情報が少ないので、 詳しい情報を持っている方がいらしたら教えて下さい。
innodb_file_per_table、
うちで評価したときは性能差はまったくなかった。
Heikki(InnoDB作者)が書いた以下の資料が参考になると思う。
http://www.innodb.com/innodbtalkCC2004b.pdf P13を見ると、特にデメリットはないと書いてある。
There are no clear disadvantages in using multiple tablespaces.
5.1のパーティション機能との相性もよいことだし
(パーティションごとにibdをつくってくれる)、
どんどん使っていいんじゃないだろうか。
登録月から今月まで何ヶ月経過しているか出したいのですが、以下の様にテスト していますがうまくいきません。(日でなく月の値です) 登録日はdatatime型で入っています。 select date_add('2008-09-07 00:00:00',interval -now() month); +-------------------------------------------------------+ | date_add('2008-09-07 00:00:00',interval -now() month) | +-------------------------------------------------------+ | NULL | +-------------------------------------------------------+ 1じゃなくて、ぬるぽかよ。。。orz どこが悪いのでしょうか?お知恵を拝借させて下さい!
なんか根本的にまちがってる気がしてきた。 上のやり方だと、成功したとしても先月の日付はでるけど、1にはならない。。。orz 頭が混乱してきました。。。今夜中に終わるのか。。。
自己解決しました! select month(current_date)-month('2008-09-07 00:00:00'); 1 で行けました!ありがとうございました!
>>581 一人上手乙。
ところで、そのクエリだと登録日が去年の12月とかだと -2 にならない?
ケースバイケース。 ただ、Rawdeviceの方は、運用上のデメリットが大きいから、あまり使われないと思うが。 SolarisZFSだと、RawDeviceにしてもパフォーマンス上がるどころか落ちるみたいだし。
586 :
575 :2008/10/08(水) 08:49:10 ID:???
>>576 >>578 返答、情報ありがとうございます。
実は前にfile_per_tableで一度トラブって、最近はビビってdump、restoreしてました。
もう一度勇気とテスト環境を出してがんばってみます。
InnoDBをファイルコピーしてんの? それ、まずくない? バイナリの互換性は保証されてないよ。
588 :
581 :2008/10/08(水) 16:26:00 ID:???
>>583 >ところで、そのクエリだと登録日が去年の12月とかだと -2 にならない?
(((( ;゚Д゚)))あわわわわ。。。
(root@localhost)[i]>select month(current_date)-month('2007-09-07 00:00:00');
+--------------------------------------------------+
| month(current_date)-month('2007-09-07 00:00:00') |
+--------------------------------------------------+
| 1 |
+--------------------------------------------------+
-2にはならないけど、1になる!年越してない。。。orz
13にしたいんだけど、どすればいいんでしょーか (´・ω・`)
実装前にここ見に来てよかった・゚・(つД`)・゚・
そりゃ年も考慮して差をとらないからだろ。
590 :
581 :2008/10/08(水) 18:02:23 ID:???
year()というので年の部分がとれるからそれぞれ求めてから引き算して12倍すれ
592 :
581 :2008/10/08(水) 19:36:49 ID:???
>>591 ありがとうございます!やってみマンモス(*゚∀゚)
このまま実装してたら大変なことになるとこでした。
593 :
NAME IS NULL :2008/10/08(水) 20:36:57 ID:6eXhPINv
windowsパワーシェル最新版でダンプしたのですが、 それをmysqlに戻そうとするとエラーが出ます。 < 演算子はまだサポートされていません。 と出るのですが < は使えないって事ですよね? どうしたらいいですか?
594 :
584 :2008/10/09(木) 00:02:59 ID:???
ある特定のカラムに1, 2, 3, ..., nまでをinsertとかupdateするにはどうしたらいいですか? sqlとストアドプロシージャのどちらに解決方法があるかわかんなくてここで質問・・・、ここ総合だけどいいのかな! 現在プライマリキーを外部のプライマリキーと一致させようとしてまして、 外部キーがnullのところは1から順に採番させようとおもっています。先の方にデータが無いやつでして。 いったんあるカラムにプライマリキーっぽい列をつくって制約を変更させようとしています。
596 :
595 :2008/10/09(木) 20:13:05 ID:???
解決しました
解決方法も書いていってください…誰かのために
598 :
NAME IS NULL :2008/10/09(木) 23:57:04 ID:YH1XilU+
MySQL4.0.27に文字コードEUC-JPでデータベースを運用しています。 サーバー移転に伴い、MySQL5.0.45にデータを移したいのですが、DBに入れた時点でphpMyAdmin上で文字化けが発生してしまいます。 旧サーバーからエクスポートし、文字コードがEUC-JPのSQLは用意できました。 これを、照合順序eucjpms_japanese_ciのDBにインポートするのですが、文字化けしてしまいます。 おそらく照合順序をlatin1にすればいいと思うのですが、なぜEUC-JPのSQLをインポートしているのに、eucjpmb_japanese_ciで文字化けが起こってしまうのでしょうか。 eucjpms_japanese_ciで文字化けしない方法はあるのでしょうか?
目に見えるもが真実とは限らない。 コードが何か調べてみよう。 $ nkf -g < hogehoge ISO-2022-JP とかできる?
600 :
595 :2008/10/10(金) 10:19:55 ID:???
>>597 ところがどっこい
>>596 は騙りです・・・!
質問スレでのageてID出すのは常套。
というわけで一応引き続き
>>595 を募集しております。
601 :
595 :2008/10/10(金) 19:14:35 ID:???
>>595 〆
結局インデックス貼って順次phpで書き換えました。
602 :
NAME IS NULL :2008/10/10(金) 22:00:43 ID:KNttnty4
例えば、idとnameの値が「1」と「aaa」だった場合、 もう一度同じ組み合わせの値をINSERT使用としても出来ない。 と言う事はSQLで可能でしょうか?可能でしたら、方法を教えて下さい。 バージョンは4.1.22を使っています。
>>602 両方ともprimaryにしておきゃ良いんじゃない?
>>603 それだと片方重複でNGになっちゃう。
条件分岐はSQLではやらないほうがいいと思うけど。
>>604 NGって?
エラー無視しておけば良いだけでは?
606 :
602 :2008/10/10(金) 22:30:05 ID:???
>>603-605 あくまでも「両方共に一致する場合」なんです。
例えばidが2でnameがaaaだと登録出来るようにしたいのです。
primaryだとそれは無理なのではないでしょうか?
PHPを使って、1回毎にSELECTで登録されているか否かを判定して
対処しようとも思ったのですが、件数が増えると負荷がかかりすぎるので
なんとかSQLで対処出来ないものか?っと悩んでいます。
存在するかどうかを判定する部分と挿入する部分はアトミックにしておかないと。 存在しないと思っている間に、 他の人が存在しないから挿入。 挿入しようとして、、、エラーか二重挿入か。。。 となるよ。
そんなものは、書き込みロックだコノヤロウ。 読み取りは複合インデックスで間に合うだろ。常識的な量なら。
>>603 が正しいと思うけど。複合キー知らんの?
mysql> create table q602 (id int, name varchar(10), primary key(id, name));
Query OK, 0 rows affected (0.13 sec)
mysql> insert into q602 values (1, 'aaa');
Query OK, 1 row affected (0.00 sec)
mysql> insert into q602 values (2, 'aaa');
Query OK, 1 row affected (0.00 sec)
mysql> insert into q602 values (1, 'bbb');
Query OK, 1 row affected (0.01 sec)
mysql> insert into q602 values (1, 'aaa');
ERROR 1062 (23000): Duplicate entry '1-aaa' for key 1
610 :
583 :2008/10/11(土) 00:22:18 ID:???
>>588 これでどう?
mysql> select timestampdiff(month, '2007-09-10',current_date) hoge;
+------+
| hoge |
+------+
| 13 |
+------+
複合キーが使えるとは限らないのでは? 直接SQL叩くわけじゃなからろうから。
612 :
602 :2008/10/11(土) 09:29:31 ID:???
みなさん、ありがとうございます!複合キーの存在を知りませんでした。 複合キーを指定すれば、双方に一致する重複キーは登録出来ませんでした。 ソースも提示していただき、ありがとうございました。勉強になりました。
>>611 別にコンソールから出なくても
phpMyAdminとかでも普通に設定できるんだけどね。
phpmyadminていうのは、 もしかして、データーベースの設計はできるけど その中にデータ-を突っ込むのはphpのコードを 書かないとできないの?
下の様なテーブル構成のテーブルがあったとしてsubjectとbodyが同じカラムデータをもっているので まとめようかと考えています。 user(id,name) subject(id,text) body(id,text) 下の様にtextカラムをtypeでsubjectなのかbodyなのかを判別する形になります。 user(id,name) text(id,type,text) こういったテーブルの結合は結合前と比べてselect,update,insert時の速度にどんな影響が出るでしょうか?
text(id,type,text) にどんなINDEXを張るかによる
1:1なら、普通こうじゃね?
user(id,name)
text(id,subject,body)
>>616 じゃ、subjectとbodyの組み合わせが特定できん。
1人1レコード限定ならいいが、idというフィールド名はどうかと。
619 :
616 :2008/10/14(火) 10:22:49 ID:???
>>617 userのidにprimary,textのidにindexをはります。
>>618 subjectは1個、bodyは2個も想定しています。(どちらも複数の場合も)
620 :
NAME IS NULL :2008/10/14(火) 11:57:13 ID:w3Po+6Kv
お世話になってます。 振り仮名(ひらがな)を入れたカラムのソートがうまくいきません。 SELECT `main`.station_frgn FROM `t_station` AS `main` ORDER BY `station_frgn` ASC; +-----------------+ | station_frgn | +-----------------+ | とうきょう | | おぎくぼ | | しんじゅく | | よつや | +-----------------+ こんな感じになります。 定義は `station_frgn` varchar(255) character set utf8 collate utf8_bin NOT NULL, です。型がまずいのでしょうか? postgresqlの時はDB初期化時のlocaleの問題だったのですが、そんなのでしょうか? お願いいたします
>>320 5.0.62で再現しない。
バージョンいくつ?
622 :
621 :2008/10/14(火) 13:07:51 ID:???
623 :
620 :2008/10/14(火) 15:23:35 ID:w3Po+6Kv
>>621 レスありがとうございます
5.0.45です。
CENT OS5 でYUMでパッケージから入れたやつです。
hex打つとどうなる? mysql> select station_frgn, hex(station_frgn) from q620b order by station_frgn; +-----------------+--------------------------------+ | station_frgn | hex(station_frgn) | +-----------------+--------------------------------+ | おぎくぼ | E3818AE3818EE3818FE381BC | | しんじゅく | E38197E38293E38198E38285E3818F | | とうきょう | E381A8E38186E3818DE38287E38186 | | よつや | E38288E381A4E38284 | +-----------------+--------------------------------+ 4 rows in set (0.01 sec)
625 :
NAME IS NULL :2008/10/15(水) 12:22:41 ID:JiSJzo9m
質問です。 内部結合と外部結合のどちらもできる場合どちらを使うべきでしょうか?
状況によるでしょ、適切な方を使えばいい。
627 :
NAME IS NULL :2008/10/15(水) 17:06:47 ID:48BARsZo
質問です。 掲示板のデータを格納するようなテーブルを作ってデータを300万件ほど格納し、 以下のようなSQLを発行すると処理に40秒ほどかかってしまうのですが、 もっとデータの抽出に速度を上げる方法などはないのでしょうか? SELECT * FROM Messages ORDER BY primary LIMIT 1000000, 30 尚、テーブルはMyISAMで設定は以下の通りです。 key_buffer = 512M sort_buffer_size = 8M read_rnd_buffer_size = 8M
連番ふってインデックス用意すれば?
629 :
627 :2008/10/15(水) 17:36:43 ID:48BARsZo
>>628 レスありがとうございます。
message_idというカラムにauto_incrementを使用し、プライマリキーとして使用しています。
order by区で指定しているカラムはプライマリキーのカラムです。
message_id >= 100000 and message_id < 100030
631 :
627 :2008/10/15(水) 17:53:09 ID:48BARsZo
>>630 レス有難うございます。
その方法も考えたのですが、DELETE文は流せなくなる(連番に空きが出来る為)のと、
他のカラム(書き込み時間など)でのソートが出来なくなると思います。
DELETE文は当初から流すつもりはないのでいいのですが。
他のカラムでのソートは結構ありえます。
INDEXが張られている他のカラムでも迅速に結果を抽出できたらと思っています。
条件の後出しは嫌われるよ。 LIMIT対象が10万とか100万になったら今のmysqlでは遅いのはどうにも なんないと思う。whereで適切に対象を絞れるようなデータの持ち方を 工夫しろとしかいえないな。
そのLIMIT の数値が少ないときは速くなるの? EXPLAINとってみた? まあ構造考えた方がいいかもね。
634 :
627 :2008/10/15(水) 18:08:40 ID:48BARsZo
>>632 レス有難うございます。
最初に記述しておくべきでしたね、以後気をつけます。
やはりどうにもならないですか…。
有難うございます、勉強になりました。
っと、リロードしてなかったー
636 :
627 :2008/10/15(水) 18:14:03 ID:48BARsZo
>>633 EXPLAINはもちろん取っています。
keyにはPRIMARYが入っているので、問題なくINDEXは使われていると思います。
LIMITの数値が少ないときには0.1秒未満なので十分な速さです。
結局、「limit の offset が百万というのを、何か別のindexの掛ったキーから取り出せないか」ということに尽きるのでは。 offsetきっかり百万から30個欲しいというシチュエーションが、どういうものか、想像が付かないけど。
638 :
627 :2008/10/15(水) 18:23:37 ID:48BARsZo
>>637 管理用ページに付ける、
ページング付で各カラムでソート出来る、記事一覧表示などの際ですね。
探すのが人間だとそれはちょっと苦しいかな
念のため、MySQL以外でも厳しいクエリなので誤解なきよう
全てをDBに載せるんじゃなくてハッシュと併用すれば?
しょっちゅう更新されるならあれだが、そうじゃないなら、delete のたびに 連番を振り直して primary キーと対応させたテーブルを作って join するとか。
643 :
620 :2008/10/16(木) 10:02:49 ID:mFFT7Z7j
>>624 遅レスすいません
こんな感じになりました
+-----------------+------------------------------------------------------------------------+
| station_frgn | hex(station_frgn) |
+-----------------+------------------------------------------------------------------------+
| とうきょう | C3A3C281C2A8C3A3C281E280A0C3A3C281C28DC3A3E2809AE280A1C3A3C281E280A0 |
| おぎくぼ | C3A3C281C5A0C3A3C281C5BDC3A3C281C28FC3A3C281C2BC |
| しんじゅく | C3A3C281E28094C3A3E2809AE2809CC3A3C281CB9CC3A3E2809AE280A6C3A3C281C28F |
| よつや | C3A3E2809ACB86C3A3C281C2A4C3A3E2809AE2809E |
+-----------------+------------------------------------------------------------------------+
なんだそりゃw UTF-8文字列を、さらにUTF-8エンコードするとそうなるな。
645 :
NAME IS NULL :2008/10/16(木) 12:13:57 ID:rARIjcbd
あるテーブルの主キーを別な列に変えました。
そのときの新しいカラムが後ろにあるのですが、これをテーブルの先頭側に移動するには
どうしたらいいでしょうか?
またこの変更から気になったのですが、MySQLは必ず主キーの順で取り出されると
どこかで目にしたと思っていたのに、適当なselectだと元の主キーの順っぽく出てきます。
どこかにこの情報が格納されててanalyzeとかするとこういうのはきれいになったりするのでしょうか。
多少のキーワードでもいただければうれしいです。
>>638 同じような理由で、うちはwordpressっていうブログのデータベースにそれなりの数の記事突っ込ん
だら管理画面からじゃ管理できなくなりました。
しょっぱすぎるpkey直接指定の管理画面を用意してほぼ手作業(フィールドの直接編集っぽいやつ)
で編集してます。
>>645 RDBMSにはそういった順番の概念はない。
順番が必要なら必ずORDER BYすること。
647 :
645 :2008/10/16(木) 13:07:05 ID:???
>>646 どこでこんな間違いを覚えてきたのか、某okwaveにも書いてありました。
> マニュアルにも「order by指定がない場合は、順序保証しない」ことは明記されています。
postgresql出身で、初めて知ったときはpkey順に保証されてるんだーmysqlってふしぎーとか思ってました。
ひどい思い違い乙。
インデックスが使われたときはインデックス順、使われなければ格納順な気がする。 後者はpkを順番につけることが多いのでしばしばpk順に見えるが、順番につけなかっ たときは一致しない。 動作としては自然だよね。ただし仕様はあくまでorder byなしのときの順序は保証しない なので、依存したプログラムを書いてはいけません。 mysql> create table order_test (pk int primary key, c varchar(100)); Query OK, 0 rows affected (0.08 sec) mysql> insert into order_test values (1,'a'),(10,'b'),(5,'c'),(3,'d'); Query OK, 4 rows affected (0.05 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from order_test; +----+------+ | pk | c | +----+------+ | 1 | a | | 10 | b | | 5 | c | | 3 | d | +----+------+ 4 rows in set (0.02 sec) mysql> select * from order_test where pk >= 3; +----+------+ | pk | c | +----+------+ | 3 | d | | 5 | c | | 10 | b | +----+------+ 3 rows in set (0.03 sec)
>>648 なるほど、インデックスを利用しているか否かによって違うってのは
意識したこと無かったです。そして感覚的に納得できます。
>>647 RDBMSにはそういう概念が無いと言っている
実際、キミは困っているんだろ?
>>643 これはおかしい。
おかしなエンコードで入っている気がする。
とどめをさすために、以下のクエリを試してみて。
mysql> select station_frgn, length(station_frgn) from q620;
+-----------------+----------------------+
| station_frgn | length(station_frgn) |
+-----------------+----------------------+
| とうきょう | 15 |
| おぎくぼ | 12 |
| しんじゅく | 15 |
| よつや | 9 |
+-----------------+----------------------+
652 :
NAME IS NULL :2008/10/16(木) 14:44:49 ID:naDhJJuw
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 死ぬとき このレスの事思い出してから地獄へ行けよ ニヤ(・∀・)ニヤ(・∀・)
653 :
627 :2008/10/16(木) 15:07:03 ID:R1QWjYpq
一応、解決策とはいえないまでもパーティショニングを行ったところ、かなりのパフォーマンス向上になりました。 報告だけさせて頂きます。
何分割にしたかとかいくつに分けたとかドンくらい速くなったかとか レポートキボン
>>650 いえ、困っていません。
テストデータをselectしたときに気分が悪くなった、というだけです。
誤った認識が心に疑問を投げかけていたのです。
前述のカラム順序も実装させるプログラムではカラム名で取り出すので問題ありませんが、
select * って書いたときにこれまでは一番左にpkeyがあったのに、今じゃ真ん中に
pkeyがある、ってのがムカつくだけです。
order byにしろカラムの順序にしろ、実用性に欠ける質問でごめんなさい。
カラムの並び順はalter tableのchangeで変えられるだろ。
657 :
643 :2008/10/16(木) 16:51:21 ID:mFFT7Z7j
>>651 こんなんなりました。
+-----------------+----------------------+
| station_frgn | length(station_frgn) |
+-----------------+----------------------+
| よつや | 21 |
| しんじゅく | 35 |
| とうきょう | 34 |
| おぎくぼ | 24 |
+-----------------+----------------------+
`station_frgn` varchar(255) character set utf8 collate utf8_bin NOT NULL,
collate utf8_binがまずいのでしょうか?
なんか、varcharだと大文字小文字の区別がなく、しかも日本語の場合も
濁点有り無しとかの区別をしないようなことをどっかで見たので、
VARCHAR(255) BINARY
にしてみたんですけど、すでにそこが間違ってます?
BINARYでソートは出来ない幹事なのでしょうか?
658 :
NAME IS NULL :2008/10/16(木) 18:18:54 ID:mFFT7Z7j
BINARYの解説に 「文字セットを持たず、ソートと比較は値の中の数値バイトに基づいているという意味です。」 というのがあるけどこれでしょうか? ということは、大文字と小文字をきっちり分けたいデータはソートがうまく出来ないってことでしょうか? これは日本語だけの問題ですか? もしかして、ソートしたいカラムは大文字・小文字の区別はつけられなのですか?
>>657 > `station_frgn` varchar(255) character set utf8 collate utf8_bin NOT NULL,
> VARCHAR(255) BINARY
矛盾してるじゃん。どっちが本当かを確かめるために
show create table t_station\G
を見たい。
でも、いずれにせよ、入っているバイト列がおかしい。
SELECT文の結果がきちんと表示されること自体、
端末の設定か何かを二重に間違えているせいじゃないだろうか。
>>624 の状態なら
collation が utf8_bin でも utf8_general_ci でも
ひらがなのソートなら問題ないわけだし。
660 :
658 :2008/10/16(木) 20:07:12 ID:mFFT7Z7j
>>659 CREATE TABLEの時は
VARCHAR(255) BINARY
と書いたのですが
show create table t_stationすると
`station_frgn` varchar(255) character set utf8 collate utf8_bin
になってます。
同じ意味なのかと思って、特に気にしてませんでした。
動いてるWEBページ(PHPで接続して取得)もあるのですが、
そちらでも問題なくSELECT>表示できています。
↓念のためshow create table t_stationです。
CREATE TABLE `t_station` (
`station_id` int(11) NOT NULL auto_increment,
`station_name` varchar(255) character set utf8 collate utf8_bin NOT NULL,
`station_frgn` varchar(255) character set utf8 collate utf8_bin NOT NULL,
`prefecture_id` int(11) NOT NULL,
`station_addtime` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`station_id`),
KEY `prefecture_id` (`prefecture_id`),
CONSTRAINT `t_station_ibfk_1` FOREIGN KEY (`prefecture_id`) REFERENCES `t_prefecture` (`prefecture_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
ごめん > VARCHAR(255) BINARY は4.1の文法だった。5.0でも正しい。 collationがutf8_binになる。 でもなんでそのデータでマトモに動いてるのかは まだ想像つかない。
662 :
NAME IS NULL :2008/10/16(木) 23:44:54 ID:ZMC0AuF4
MySQL5.0使ってます。 主キーかつ外部キーのフィールドだと PRI しか表示されないんでしょうか?
load data infile で datetime型に"Oct 16 2008 12:00AM"このような形式の データを読み込みたいのですが可能でしょうか? 普通にやると0000-00-00 00:00:00で読み込まれてしまいます MySQL5.0.67+CentOS5.2 glibc2.3のgz形式のバイナリパッケージを使っています よろしくお願いいたします
>>663 $ cat data.csv
Oct 16 2008 12:00AM
Nov 17 2008 04:00PM
mysql> load data local infile 'data.csv'
-> into table loadtest (@var1)
-> set date = str_to_date(@var1, '%b %d %Y %h:%i%p');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from loadtest;
+---------------------+
| date |
+---------------------+
| 2008-10-16 00:00:00 |
| 2008-11-17 16:00:00 |
+---------------------+
2 rows in set (0.00 sec)
MySQLの認定試験にこの手の問題が出ます。
MySQLの認定試験って市場価値あるの? 単に、OracleMasterのマネして金儲けしようとしているだけじゃないの?
技術者を雇う側からいうと、人事に話を通しやすいから、何であれ認定試験の資格があるとありがたい。 「この人はよくできる人です」と「この人は××のゴールド認定技術者です」では、聞こえ方が全然違う。
667 :
663 :2008/10/17(金) 15:06:54 ID:???
>>664 できました!
どうもありがとうございました。
>>666 「この人は、MySQLの認定技術者です」で、本当に聞こえがいいの?
grant文で権限をつけるデータベースを複数指定したい場合はどう知ればいいのでしょうか? grant all privileges on hoge,hoge2.* to 'hoge' identified by 'hogehoge'; ,区切りでやってみましたが無理でした。
>データベースを複数指定したい場合 ワイルドカード以外はできない。
>670さん ありがとうございます。 以下のようにワイルドカードで指定してもできません。 複数は無理なのでしょうか? grant all privileges on hoge*.* to 'hoge' identified by 'hogehoge';
100カラムあるテーブルと10カラムのテーブルが10こあるのでは どちらが効率的に select,insert,updateできるでしょうか? 10カラムの方はselect時に個別(1テーブル)で事足りるものもありますしすべてを連結させる必要があるときもあります。 型はtinyint〜textまで含まれています。 100個の方はビューを作るので擬似的に分けることはします。(なので管理がめんどくさいということはないです)
>>672 ケースバイケース。
てか効率だけで決めたら後々苦労するよ。
SELECT対象が10カラムのテーブル1個で済む場合、100カラムのテーブルを
使うよりもサイズが小さいためメモリのヒット率向上が見込まれる。
ディスクI/Oが減るため性能がよい。
SELECT対象テーブルが多いとだんだん悪くなる。
10テーブルへのinsert、updateは整合性を取るためにbegin〜endで囲む
ことになる。気をつけないとデッドロックを起こす。
InnoDBのページサイズは16KB。
100カラムのテーブルはレコード長が伸びるため格納効率が悪くなる。
例えばレコード長6KBだと2レコードだけ入って、4KBすきまができてしまう。
MySQLはオプティマイザがあまり賢くないので多数のテーブルの結合は
おすすめしない。10テーブル結合して数分返ってこなくても泣かないこと。
まだまだ懸念点は出てくるはず
まずは教科書通りに設計して、実機で検証すべき
>>673 様
ありがとうございます!
とても参考になりました。
InnoDBでした。後出しすみません。
一緒に使うパラメータはなるべく一つにまとめようと思います。
またすべてを使うことはあまりないので(管理時のみ)管理ページを改める方向でいきます。
本当にありがとうございました。
create table test( id int unsigned not null auto_increment primary key, passwd varchar(32) not null); (たくさんのデータが入っていると仮定して) ここから下のSQLを流した場合、 先にidを探してそのIDと合致するデータのpasswdの正否を判定するという認識で間違いないでしょうか? select 1 from test where id = 1 and passwd = 'example'; 一意なカラムがあるwhereにある場合は他の要素(この例だとpasswd)にindexを春必要はないでしょうか? もしくはpasswdにもindexなどをはったほうがいいでしょうか?
>>676 Primary Keyの等価条件があればMySQLは迷わずそれを使う。
idだけで1件に絞り込めるので、passwd、あるいは(id, passwd)に
indexを張る必要はありません。
>先にidを探してそのIDと合致するデータのpasswdの正否を判定するという認識で間違いないでしょうか?
yes
ただしそれ、インジェクションの典型的な例に出るやつだから注意ねw
>>677 やはりそうだったんですね^^
orderとかでソートする値にはindexをつけるべきですか?
たとえば先ほどのテーブルを
id int,
sequence int,
unique key(id,sequence)としたばあいはどうなるでしょうか?
2度質問して申し訳ないですがお願いします。
>>678 便乗で申し訳ないが、なぜそれがインジェクションになるの?
select 1 from test where id = 1 and passwd = 'example'; これをexampleの部分に入るべき生データをユーザーの入力で、 ' OR 1 = 1 とかいれられて そのままSQLにしてしまうと、 select 1 from test where id = 1 and passwd = '' OR 1 = 1; というSQLになって常に結果が見つかることになってしまう。
>>679 そのテーブルでどんなSQLを流すつもり?
こう?
select 1 from test
where id = 1 and passwd = 'xxx' order by sequence;
勝手にエスパーするとこっちか?
select 1 from test t1
where id = 1
and sequence = (select max(sequence) from test t2 where t1.id = t2.id)
and passwd = 'xxx';
>>681 where の比較対象の定数部分にユーザ入力をそのまま突っ込むような設計してたら、これに限らず何だって同じ。
prepared statement 使うなりすれば。
685 :
NAME IS NULL :2008/10/18(土) 20:08:43 ID:EcpiaIsa
ご存じの方がいらっしゃったらお教え下さい。 MySQL Workbench の日本語化は可能でしょうか? いろいろ調べてみたのですが、前身のDBDesigner4の日本語化は 見つかったのですが、それ以降は見つけられませんでした。
>>683 データベース接続のラッパーにクオートさせてるだけだけど大丈夫か心配になってきた。
687 :
NAME IS NULL :2008/10/19(日) 01:02:14 ID:qPDNVZvi
誘導されてきましたが、Mysqlへの接続についてはココでいいのかな? サーバーPCの環境 OS XP VB2003 SERVER アパッチ DB Mysql 5.1 問題点 Mysqlに接続できない エラーメッセージ 'MySql.Data.MySqlClient.MySqlException' のハンドルされていない例外が mysql.data.dll で発生しました。 Unable to connect to any of the specified MySQL hosts Public str_Domein As String = "192.168.**.**" Public connStr As String = String.Format("server={0};user id={1}; password={2}; database=aaa; pooling=false", str_Domein, "hogehoge", "hagehage") LAN上のIP指定では問題なく接続できていたけど、諸事情により野外でノートを持っていき接続する必要が出てきた そこで、str_Domeinを「Public str_Domein As String = "hogehage..net"」のようにドメイン指定にしてみたら接続できなかった 引っ越す前は問題なかったけど、引越しをし、光プレミアムに回線が変わってから使えなくなってちょっとアセってます 引越し前も後もサーバーPCの設定はしていないので繋がっても不思議ではないが繋がらなくなったのでルーターの設定かと思い ポート3306のルーティングをしたり、ファイアウォールもオフにしたりしたけどダメ サーバーPCもファイアウォールの3306のポート設定してあります 何か設定忘れてるかな?
Windowsのコマンドプロンプトからtelnetや TeraTermProから直接 3306 を叩くとどうなる? 悪いのはあっちかこっちかはてまた途中か。。。
>SERVER アパッチ ということは、外から直接DBサーバに繋ぐのではなく、外からはhttp を叩き、apache が DBサーバを呼ぶ、という理解でいいのか? それなら、野外でノートと、とか何とか無関係では。
MySQL Clusterで、 Server1: SQL-Node,Data-Node,Management-Node Server2: SQL-Node,Data-Node の構成で DBの HA構成を考えています。 この時 Server1が死んでも Server2だけで稼動してくれますか?
691 :
NAME IS NULL :2008/10/20(月) 18:31:37 ID:Ry3FUMpj
質問です。 solidDB for MySQLをプラグインとして追加し、MySQLを起動すると 起動に失敗し、エラーログに以下の記述が出ています。 [ERROR] Can't open shared library '/usr/lib64/mysql/plugin/libsoliddb.so' (errno: 0 undefined symbol: _ZN10Field_blob10get_lengthEPKhb) 色々調べたのですが、原因が分かりませんでした。 どの様にすれば、解決するでしょうか? ご教授頂ければと思います。
それぞれのバージョン、プラットフォームも書かずによー質問できるなw そのエラー見る限り、そのライブラリとMySQLのバージョンに齟齬があるとしか思えんし。
693 :
691 :2008/10/20(月) 18:43:15 ID:???
>>692 申し訳ありません、環境も記述すべきでしたね…。
ディストリ:CentOS 5.2 (x86_64)
MySQL:5.1.28 (rhel5 x86_64)
solidDB for MySQL:5.1.22 (x86_64)
以上です。
他にも何か足らないものがあれば、宜しく調べますのでお願い致します。
はじめて、MySQLをいれたのですが、リモートのホストとPhpMyAdmin(3.0.0)との接続ができません。 MySQLのバージョンは、 Server version: 5.0.67 MySQL Community Server (GPL) apache 2.0.63 PHP 5.2.6 です。 PhpMyAdminの設定後、アクセスしようとすると、以下のエラーが出ます。 MySQLのメッセージ: #2002 - サーバが応答しません (あるいはローカルの MySQL サーバのソケットが正しく設定されていません) mysql 拡張をロードできません。PHP の設定を確認してください - ドキュメント ただし、以下の簡易スクリプトだとSuccess!とでます。 <?php if(!$conn = mysqli_connect('xxxx', 'xxxxxxx', 'xxxxxxx','mysql')) { print "ConnectError"; }else { print("success!") ; } ?>
インデックスの張り方で悩んでいます。 pk access_date type pkは主キー、access_dateはdatetime型の更新日時(のようなもの)、 typeは1〜3とかの多くの行でかぶるカラム、です。 このテーブルで select * from hoge where type = 1 /* とか */ order by access_date limit 1 /* とか */ こんなクエリをやっています。 現在はaccess_dateとtypeにこの順で複合インデックスを貼っています。 access_dateが古いところにtypeが1のものがあれば早く取り出せてると思うのですが、 そうでない場合には頭から探してるようで遅いです。 ○○調べてこいや、とかの助言でもいただけたらうれしいです。
EXPLAIN調べてこいや インデックスの張り方が多分逆の予感。
インデックスは指定したキーの順であらかじめソートした索引だと 思えばいい。 更新日時を先にもってきたらその順番で並んでしまうだけでその あとにtype持ってきても意味がないよ。秒まで同じ更新日時の レコードがtype別にまとまることになるが、そんなにはげしく更新 されないだろ? type, access_dateの順のインデックスにすればtypeごとにaccess_date 順で並ぶので、type=1の一番古いの一つさがすのは簡単になる。
698 :
695 :2008/10/21(火) 10:55:54 ID:???
>>696 >>697 お返事ありがとうございます嬉しいです。
やはりインデックスの順番が一番怪しいかなと思っていました。
友達に聞いたらtypeにビットマップなインデックスはってみ、普通のやつじゃ意味ねーよ、
って言われてmysqlじゃない話で落ち込んでました。
再度インデックス張り直してきます。30分ぐらいで終わる予定です。みんなこれぐらいかけてるのかな・・・。
ところで
>>697 氏のおっしゃる
> 更新日時を先にもってきたらその順番で並んでしまうだけでその
> あとにtype持ってきても意味がないよ。
この辺の話っていうのは、mysqlのインデックスに限った話ですか?
よければ参考書籍などを教えてもらえないでしょうか?
699 :
643 :2008/10/21(火) 13:03:30 ID:5o5JIZbw
700 :
695 :2008/10/21(火) 13:06:49 ID:???
インデックス張り直しでうまくいきました。 access_dateの古いものから順次新しいものに書き換える、というのがいい速度で動きました。 勉強になりましたありがとうございました。
mysqlclientライブラリを使用したプログラムをフリーソフトとして公開したいんだけど、 GPLにしたくない場合(バイナリのみ配布)は商用ライセンスをいくつ買わないといけないの? ダウンロードされた回数だけ必要になるなんてことないよね?
>>701 組み込んで売るための
OEMライセンスというのがあります。
値段はしらない
703 :
643 :2008/10/21(火) 15:47:10 ID:5o5JIZbw
ごめんなさい SET NAMES utf8 を忘れていた(知らなかった)だけみたいです。 でも、なんで、ホスト言語で文字コード何もいじってないのに ページではUTF8で表示されてたんですかね?
だからUTF8エンコード2回かけるとそうなるって言ったじゃない。 ユニコード文字にしたくてデコードして次に回したら そいつもUTF8と判断してデコードしたと
705 :
伊藤 誠 :2008/10/21(火) 20:32:37 ID:BZveQiyh
通りすがりの質問で失礼します。 こんなテーブルがあるとします。 商品管理テーブル ・商品ID←主キーかつオートインクリメント ・商品名 ・JANコード ・メーカー 価格管理テーブル ・価格ID←主キーかつオートインクリメント ・商品ID ・定価 ・原価 ・売価 ちなみに、商品IDと価格IDはユニークであるために、 主キーかつオートインクリメントとしています。 本題は、ストアドプロシジャを使って 新規に商品の登録をする時にどうしたらよいかです。 私は、mysql5.0系を使用しています。 テーブルを二つに分けたのは、価格の変更等に対応するためです。 詳細なテーブルデータは割愛させていただきます。 価格管理テーブルの商品IDは商品管理テーブルと紐付けるための カラムですが、オートインクリメントであるため、商品データを 商品管理テーブルに格納してからでしか、確定しません。 商品データの登録→価格データの登録 とすれば、良いのかもしれませんがどのようにして商品管理テーブル から商品IDを拾えばよいのでしょうか?最新の登録データを拾うでは 不完全ではないでしょうか?→の間に他者による登録があるかも知れ ません。それとも、テーブルの仕様から見直すべきなのでしょうか? どうかご教示ください。
MySql.Data.dllをプログラムに添付して 勝手に再配布しても問題ありませんか
707 :
696 :2008/10/22(水) 00:17:15 ID:???
>>698 私の読みは、
>>697 氏と異なります。
MySQLの規定の動作として、ORDER BYはWHEREの結果に対して実行されるので
ソートしてからデータを引くことはできません。
access_dateがインデックスの先頭では、
多分インデックスは一切使われてないのではないでしょうか。
ぜひEXPLAINしてみてください。
おすすめの書籍は、
なんといってもオライリーの実践ハイパフォーマンスMySQLです。
インデックス以外も含め、載ってない解決策はほとんど無いと思います。
708 :
696 :2008/10/22(水) 00:36:17 ID:???
>>705 価格管理テーブルの価格は初期登録する必要がありますか?
ストアドプロシージャでINSERTした時に
トリガーで価格を登録させるということではだめですか?
ストアドプロシージャ単独での解決はあんま詳しくないから、パス。
テーブルを分けるメリットがあんまり感じられないけどスルーします。
>>706 だめです。
709 :
706 :2008/10/22(水) 06:15:16 ID:???
>>708 なぜ殺たし
じゃなくて・・・
なぜダメなのですか
711 :
695 :2008/10/22(水) 09:58:51 ID:???
>>707 さらなる返信ありがとうです!
>>696 を見てすぐにexplainしました。(今は張り替えてしまったのでインデックスないのです。)
そのとき確実にインデックスが使われていました。
> ソートしてからデータを引くことはできません。
というのは、(access_dateで)order byしてから(typeで)where絞り込みできない、ということでしょうか?
typeで絞り込んでaccess_dateでorder byするのでインデックスが逆なのかな、と自分では納得していました。
本のオススメありがとうございます!
でもオライリーのハイパフォーマンスは、実はもう手元にあったりします。楽しい本ですよね。
他の本は最後の方ばかり見返すのですが、この本はどの章でも見返すことがあります。
ただ出版されたのがいかんせん古いせいか、myisamに偏ってるかなと思ってます。
自分はmysql5.1(間違ってベータ版入れてた)からしか使ったことがなく、innodbをかなり主流に使ってます。
(実際、読み1:更新1とかなものでmyisamは向いてないのかと自己判断してしまっています。)
innodbの主キーインデックス?はちょっと特殊なんだよーとかをブログなどでかじり見するだけで、それを理解
できる脳みそはなく次なる書籍を探しておる次第であります。
DBサーバーPCで作業する人が作成者のみ場合ユーザーをlocalhostに設定する意味ってあるんですか? ローカルシステムはrootで入ると考えると、全てのログイン設定はリモートのみでいいような気がするんですが? ばかげた質問ですが教えてくだちぃ。
>ローカルシステムはrootで入ると考えると なぜそう考えるの?
714 :
伊藤 誠 :2008/10/22(水) 20:41:08 ID:IFpXZn2t
>>710 返事が遅れてスミマセン。
ありがとうございます!
もしかして、常識でしたか?
何とか解決できそうです!
715 :
712 :2008/10/22(水) 21:07:40 ID:???
>>713 他人が使わない自分(DB管理者)専用のPCなので
アクセスする場合はroot権限だけあれば事足りるんじゃないかと。
それとも管理者自らも一般ユーザーとして入るべきなの?
716 :
NAME IS NULL :2008/10/22(水) 21:46:15 ID:N2/E62Xq
質問させてください。 Linux mysql5.0でレプリケーションの設定を行っています。 マスター・スレーブを切替を行う場合、どのような設定が必要になるのでしょうか。 コマンドで、簡単に切替が出来たりしないでしょうか。
思いっきり初心者で申し訳ないのですが、 データベースを使った顧客管理を考えています。 来店するごとに使った金額を Aさん ○○歳 [1回目]○○円 [2回目]○○円 Bさん ××歳 [1回目]××円 [2回目]××円 [3回目]○○円 Cさん △△歳 [1回目]△△円 といったように毎回の買い物金額を格納したいのですが、 私の知識では「カラムを追加していく」以外に方法を知りません。 でも例えば「Aさんが1000回来店したら・・・」と考えるとこの方法では 無理な気がします。 こういう場合はテーブルを増やす方がいいのでしょうか? 他にもっとスマートな方法があったりしますか? どなたか教えてくださいよろしくお願いします。
テーブル1 1 Aさん ○○歳 2 Bさん ××歳 3 Cさん △△歳 テーブル2 1 1 ○○円 2 1 ○○円 3 2 ××円 4 2 ××円 5 2 ○○円 6 3 △△円
>>717 [氏名],[回目],[金額]
A,1,○○
A,2,○○
B,1,××
B,2,××
B,3,××
C,1,△△
[氏名],[年齢]
A,○○
B,××
C,△△
720 :
691 :2008/10/23(木) 18:04:25 ID:???
>>717 大雑把だが、こうやって分ければいいだけじゃない
顧客情報テーブル
顧客ID 名前 年齢
販売管理テーブル
顧客ID 来店日 金額
721 :
717 :2008/10/23(木) 19:14:01 ID:???
>>718-720 すごく初歩って感じですね;
もう一度入門書から出直します。
こんな質問にも
ものすごくわかりやすく教えてくれて感動です。
どうもありがとうございました。
722 :
伊藤 誠 :2008/10/23(木) 19:39:26 ID:bgpPSB7H
>>720 販売管理テーブル
顧客ID 来店日 金額
→販売ID 顧客ID 来店日 金額
ですね。
DBの設計について書いてある情報を探せばいい。 SQLの話ではない。
724 :
NAME IS NULL :2008/10/24(金) 10:40:38 ID:yyHCFjKP
5.0です。 特定のカラムを基準にしてソートをした際に、 それぞれのレコードに1〜の連番を付与したいのですが可能でしょうか? いわゆるRANK関数のように、同率をまとめてしまうのではなく、 欠番の無い連番を付与したいと思っています。 何卒、ご教示のほどお願いいたします。
Xoops上でユーザを80件作成した後に SELECTでユーザデータ抽出を行うと29件ずつしか抽出されません。 WHEREで絞込みをしようとしても29件目以降のデータは無視されてしまいます。 Xoopsでは80人の一覧が表示されるので、 そこで使用しているSQLをTelnet接続で実行しましたが やはり29件しか表示されません。 MySQLの設定で参照する件数に上限を設けるようなものがあるのでしょうか?
726 :
724 :2008/10/24(金) 10:59:46 ID:yyHCFjKP
すみません。 下記で自己解決しました。 SELECT (@i := @i +1) AS COUNTER , `id` , `record` , `team` FROM `usr` ORDER BY `record` DESC その上で改めて質問です。 上記で取得した連番(COUNTER)で3の倍数に相当するレコードの`team`に対して UPDATEをかけるにはどうしたらよいでしょうか? 要は、成績順に並べて出来るだけ均等なチーム分けを目的としています。 よろしくお願いします。
727 :
NAME IS NULL :2008/10/24(金) 11:27:03 ID:NKNlFjoF
SELECT * FROM aaa INNER JOIN bbb USING(id) というように結合していますが、結合するテーブルがもう1つある場合、 どうしたらいいのでしょうか? 今は SELECT * FROM aaa INNER JOIN bbb ON aaa.id=bbb.id INNER JOIN aaa.id=ccc.id と、USINGを使わない形にしています。
↑の「今は」の箇所は SELECT * FROM aaa INNER JOIN bbb ON aaa.id=bbb.id INNER JOIN ccc ON aaa.id=ccc.id でした・・。
729 :
伊藤 誠 :2008/10/24(金) 19:47:04 ID:ZASOccgh
>>727 SELECT * FROM aaa,bbb,ccc
WHERE aaa.id = bbb.id
AND aaa.id = ccc.id;
では、駄目なの?
質問 phpmyadminでデーターベース作るじゃん そのときの文字コードを後から変更できるの?
じゃん
じゃん
じゃんじゃんいこうぜ!
735 :
NAME IS NULL :2008/10/25(土) 16:23:48 ID:UcstQw9n
ストアドプロシージャでの変数宣言で、 オラクルみたいに「テーブル名.項目名」というような データ型を宣言できる? テーブル「aaa」があるとして、 create table aaa ( xx int, yy varchar(20), primary key (xx) ); 下記のような変数宣言は可能? create procedure bbb begin declare 変数名 aaa.xx; end おしえてくれー!
736 :
735 :2008/10/25(土) 17:05:17 ID:UcstQw9n
やってみたけどできなかった 宣言の仕方が違うのか、 それとも項目の属性で変数宣言はできないなのか
737 :
735 :2008/10/25(土) 18:07:49 ID:UcstQw9n
訂正 -> declare 変数名 aaa.xx%TYPE; でもだめだった mysqlではTYPEもROWTYPEも使用できない という結論にしときます。
>>738 どうやるの?
「文字コードの変更」
ってボタンがある?
740 :
NAME IS NULL :2008/10/25(土) 21:45:28 ID:jm6nkPuu
DATETIME型のカラムでWHEREかけてSELECTすると抜けが出るんだけど、俺だけ? バグなの?これ?
>>740 1. DATETIME型と思い込んでて実はTEXT型。
日付のフォーマット違いにより抜け発生
2. 時刻を指定し忘れてて00:00:00。
先頭または末尾が抜ける
3. WHERE句のほかの条件に引っかかっている。
どれでも好きなのをどうぞ
742 :
NAME IS NULL :2008/10/25(土) 22:32:27 ID:FDwSwRnl
AテーブルとBテーブルにそれぞれ hoge というIDがあるとして 「BテーブルにあるIDをAテーブルから削除」は DELETE FROM A WHERE hoge IN (SELECT hoge FROM B); と書けますが、 「Bテーブルに無いIDをAテーブルから削除」は どうやって書いたら格好いいでしょうか
>>742 DELETE FROM A WHERE hoge NOT IN (SELECT hoge FROM B)
じゃダメなの?
744 :
742 :2008/10/25(土) 23:01:13 ID:???
745 :
NAME IS NULL :2008/10/26(日) 00:12:27 ID:+O8nbZ0E
>>741 そっか。レスありがと。
他で出てないなら俺のミスだな。
しっかし、NOW()で取得した時刻をフォームで渡してその時刻以降をSELECTしてるだけなんだけどな。
極たまに抜けが出るのよ。
URLエンコード・デコードもちゃんとやってるし、なんだろうなぁ。
原因探ってみます。
おまえの説明では何が抜けたんだかさっぱりわからんのでなんとも 言えんな。抜けたというレコードの値とselect文をちゃんと示せよ。
747 :
NAME IS NULL :2008/10/26(日) 01:17:13 ID:+O8nbZ0E
>>746 いや。他でそういう奴がいないんだったら間違いなくスクリプト側のミスだろうって事。
INNODBで行ロックかかっててもSELECTで抽出されないなんて事はないもんねぇ。
不正な値が入ってるわけでも、型を間違っているわけでもありません。
いろいろ試してたら、SELECT関係ない事がわかった。 SELECT * FROM table_name ORDER BY date_time LIMIT 10; これで抜けが出る。 DATETIME型ってひょっとしてORDER使えない? それともやっぱりアプリケーション側のミスか・・・
>>748 SELECT関係ない→WHERE関係ない
とりあえずアプリ介さずに再現するか試してみます。
抜ける頻度は0.5%ぐらい。決まった行が必ず抜けるわけではない。99.5%のクエリは思ったとおりの結果が出る。
状況を説明する気がないことはわかった。一人で悩んでください。
>>750 何が知りたいんだよ。こんだけ状況説明してんのに。
型指定間違いとか、そんな昨日SQL始めました的な事聞いてるわけじゃないんだけど。
whereつけないorder byだけで抜けたように見えるというなら、それは 本当に入ってないんだろ。それは入れるつもりの値でない別の値を入れて しまったか、値は正しいがselectの時点では入ってないかのどちらか。
はっきりした。 DATETIMEのORDER BYとLIMITで抜けが出ます。 DATETIME型のカラムをUNIQUEにしてテスト用テーブル作りORDER BYとLIMITでシェルから試してみました。 テーブルに変更は行っておらず、同じクエリを繰り返し、結果は当然同じになるはずですがこれが保証されませんでした。 頻度が低いから気付いてない人がいるかも。 該当Ver MySQL5.0.45
755 :
NAME IS NULL :2008/10/26(日) 21:30:11 ID:gkmt0pAA
複数IDの更新をしようと思い、 UPDATE SET num=num+1 WHERE id IN('1','2') としているのですが、INの中に指定されているIDが存在すると 更新されないのですが、1つでも存在しないのがあると、更新されません。 こういう場合、どうやって複数更新したらいいのでしょうか? やはり、PHPを使ってforで1つずつ更新する方法しかないのでしょうか?
修正 としているのですが、INの中に指定されているIDが存在すると 更新されないのですが、1つでも存在しないのがあると、更新されません。 ↓ としているのですが、INの中に指定されているIDが存在すると 更新されるのですが、1つでも存在しないのがあると、更新されません。
当たり前だ。UPDATEっつー命令の意味がわかってんのか、あんたは。 まずは存在しないIDに対してUPDATEを吐くようなヘッポココードを修正しろ。
ランキングとスコア があるテーブルがあるとして スコアの大きい順に並び変えて上から順にランキング(1,2,3・・・・)を付けていくのは どうしたらいいですか?
759 :
755 :2008/10/27(月) 01:13:27 ID:???
>>757 ですよね・・。ただ、1件ずつSELECTで調べてUPDATEとして〜
という方法だと、負荷がかかりすぎると思うのです。
処理対象の件数が多ければ多いほど。
何か良い案があればと思い、質問させていただきましたが
SQLだけで無理、もしくは1件ずつ調べる方法しかない場合は諦めます。
760 :
757 :2008/10/27(月) 01:24:27 ID:???
ON DUPLICATE KEY UPDATE ってのもあるけど
InnoDBでwebアプリが動いているのですが、 最近MRTGでCPUが100%になるので、topコマンドで見てみると、 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 11728 mysql 25 0 694m 344m 5392 S 11 10.5 26:01.50 mysqld と、前回restartしてからの時間(26時間)、プロセスが動き続けていることに なっているのですが、実際ほとんどアクセスはされていません。 mysqldは、このように何十時間もプロセスに出続ける物でしょうか? 接続が終了したら、プロセスの時間はリセットされるのでしょうか?
>>755 意味がわからない。何がしたいのか。
where句で該当しないものがupdateされたら逆に困るだろ。
>>761 当然だろ。プロセスが勝手に終了してどうすんだ。お前はサーバーという意味がわかってない。
>>762 apacheってプロセスの時間短いよね。うちはpreforkだけど。
そういうのを以って言ってるんじゃない?sshdも短いし。
わしその辺詳しくないからわからんわ。
764 :
755 :2008/10/27(月) 11:00:09 ID:???
>>760 いや、追加はしたくないんです。。
>>762 とにかく「複数のレコードのUPDATEを、出来るだけ負荷がかからず行いたい」
と言うのが目的です。確かに存在しないIDが更新されたら困りますが。
更新用のIDリストはログファイルにまとめているので
それの更新をかける時に、削除されているIDがある可能性があるんです。
なので、どのようにしてSQLを組み立てるべきなのか、悩んでいまして・・。
存在しないid指定しても単に該当するレコードがないからそのidについては 更新されないだけでエラーとかにはならないよな。単に更新件数が減るだけ。
767 :
755 :2008/10/27(月) 12:25:39 ID:???
>>765-766 >>755 に書いたソースで試しましたが、全部が更新されないんです。
自分も「単に更新件数が減るだけ」だと思っていたのですが・・。
だから、INを指定する書き方が悪いのかと思い、方法をお尋ねしました。
おかしいね、環境とバージョン書いてみて
>>754 ゼロから詳しくおしえてください
どうやれば再現できますか?
>>767 where 〜
〜に該当しないのはもちろんupdateされないだろ。
updateしたいレコードをちゃんと抽出できるようにwhereを指定すりゃいいだけだろ。
アホじゃね?
771 :
755 :2008/10/27(月) 14:48:11 ID:???
>>768 バージョンは4.1.22です。
>>770 いやだからそれは759に「こういう事で処理出来ますが〜」と書いています。
1件ずつ調べる、対処する方法だと負荷がかかると思うから
「一括で更新する方法はないか?」と言う質問です。
772 :
NAME IS NULL :2008/10/27(月) 14:55:54 ID:l/LuSqsB
>>771 一括でupdateする方法を教えてやったんだが・・・
いや、質問者はINの中に存在しないIDがあると、存在するものも含めてすべて更新しないって言ってるんでしょ? そもそも、そのWHERE区をSELECTで使ったらちゃんと出るの?
774 :
NAME IS NULL :2008/10/27(月) 15:07:55 ID:l/LuSqsB
>>773 質問者の質問は
|ID |num
|1,2,3,4|0
|2,3|2
こんなんだろ?
whereでちゃんと抽出できりゃ一括でnum=num+1はできるだろ。
質問者が何を勘違いしてんのか知らんが。
where出来てないってことだけじゃん。
少なくとも俺の手元では存在しないid(下の例では2)を指定しても なんともなかったぞ。 mysql> show create table t1\G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL auto_increment, `value` int(11) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 1 row in set (0.00 sec) mysql> select * from t1; +----+-------+ | id | value | +----+-------+ | 1 | 10 | | 3 | 30 | | 4 | 40 | | 5 | 50 | +----+-------+ 4 rows in set (0.00 sec) mysql> update t1 set value = value+1 where id in(1,2,3); Query OK, 2 rows affected (0.03 sec) Rows matched: 2 Changed: 2 Warnings: 0 mysql> select * from t1; +----+-------+ | id | value | +----+-------+ | 1 | 11 | | 3 | 31 | | 4 | 40 | | 5 | 50 | +----+-------+ 4 rows in set (0.00 sec)
質問者がテーブル構造もろくに書いてないのが問題だが、
いくらなんでも、
>>774 の様に仮定する人はいないと思うが。
まあエスパーか同じようなテーブル書く人なのかもしれんが。
777 :
NAME IS NULL :2008/10/27(月) 15:14:41 ID:l/LuSqsB
>>776 存在しないとか、意味不明な事言ってるから、setでも使ってんのかと思って。
NULLの事だったの?
setカラムならFIND_IN_SET使えばよろし。
778 :
NAME IS NULL :2008/10/27(月) 15:24:58 ID:l/LuSqsB
なんでもいいが、
>>773 の言うように、selectできりゃupdateできる。
ようは抽出が出来てないだけだ。
つか、掲示板で聞く前に、本でも買って少しぐらい勉強しろ。呆
779 :
755 :2008/10/27(月) 15:52:41 ID:???
自分の書き方が悪いのか、全く伝わっていませんね・・。
もちろん、自分で調べてググってそれでも解決しないから
皆さんの知恵をいただこうと思い、質問しました。
もちろん、SELECTでも出力されるし、テーブル構造も
>>775 のような形です。
だから、「SELECTしてUPDATEするの繰り返すと負荷がかかる」
という意見が言えるのではないでしょうか。
どのように質問すれば皆さんに理解して貰える書き方が出来るか
馬鹿な私にはわかりませんので、もう遠慮します。色々ありがとうございました。
>>779 だから全く問題ないのに、結果がおかしいんだろ。
異常が出てるのはそこだけじゃないかもしれないから、
1件ずつ入れて回避するようなことをせずに、根本的に直したほうがいいよ。
インストールしなおしたら?
結局、
>>775 のような、とは書いてるが実際のテーブルとかそこで使用したSQLとか
結果とか全然あげてないじゃん。あとで自分のミスに気がついて赤面することになるとは思うけど
問題解決したいなら全部さらしたほうがいいと思うよ。
782 :
NAME IS NULL :2008/10/27(月) 16:04:27 ID:l/LuSqsB
>>779 君は本買って勉強したほうがいい。ど素人中のど素人だから、今の段階で質問をするべきじゃない。
一回で抽出できりゃ、一回でupdateできるって言ってるだろ。意味がわからないんだから、そうとう知識がないんだよ。
>>780 お前もひどいアドバイスだな。無駄な事させてやるな。
SQL直書きでは上手く動いているけどPHPとかのスクリプトでSQL生成した時に 失敗している気がするな 後からログ拾ってバッチするよりその時一緒に処理するのが一番なんだけどね 例外起きた時にもROLLBACKで整合性を保てるし
>>779 UPDATE SET num=num+1 WHERE id = '1' OR id = '2'
じゃダメなんだっけ?
785 :
NAME IS NULL :2008/10/27(月) 20:48:57 ID:cFNYmbxb
質問です。 カラムaddress1,address2,address3の重複を削除するにはどうしたらいいでしょうか? |adress1|address2|address3| |東京 |埼玉 |千葉 | |千葉 |東京 |埼玉 | 結果:東京、千葉、埼玉 のように抽出したいです。よろしくお願いします。
InnoDBにてDELETEは使っちゃダメとスローログに出るんですが、 SELECT1000件に1度ぐらいDELETEを使う頻度であれば、 DELETE単体が遅いだけで、SELECTでの表示には影響を与えないのでしょうか?
5.0.27で、InnoDBのINSERTとDELETE間でロックが発生するんですが、これって仕様なんでしょうか? それらしい記述は見つけられなかったのですが。 端末A create table x ( id int ) type=InnoDB; insert into x values (1); COMMIT; START TRANSACTION; insert into x values (2); 端末B delete from x where id=1; ->待ち発生。端末AでCOMMITすると実行される。
789 :
NAME IS NULL :2008/10/27(月) 23:40:55 ID:oW9TD4fV
MySQLをインストールしました。 LinuxのrootユーザーでログインしDBTESTというDBを作成しました。 このLinuxマシンにApacheを入れてPHPも動くようにしました。 PHPで↓このように書いたのですがDB接続エラーが表示されてしまいます。 $connect = mysql_connect("localhost","root","testrootuser"); if(!$connect) { echo("DB接続エラー"); mysql_close($connect); ext; } なぜmysql -u root -p でパスワードを入力してログインできるのに PHPではログインできないのでしょうか? 何か設定が必要でしたら教えてください。 よろしくお願いします。
>>788 これでやってみなー
端末A
create table x ( id int ) type=InnoDB;
create index x_id on x (id);
insert into x values (1);
COMMIT;
START TRANSACTION;
insert into x values (2);
端末B
delete from x where id=1;
791 :
NAME IS NULL :2008/10/28(火) 07:55:14 ID:YysnRPb3
スキーマのint(1)とかの(1)って何なのでしょうか? 今まで、桁数の制限だと思っていたのですが、 int(1)に1桁以上の数を挿入しても、問題なく出来ました。 実際は単なる説明で、実際に何かを制限する機能はないのでしょうか。
>>791 10.2. 数値タイプより:
>> MySQLがサポートするその他の拡張として、各タイプの基本キーワードに続く
>> カッコ内に整数データタイプの表示幅を指定するオプションがあります(例 INT(4))。
>> この表示幅オプションは、カラムに指定された幅よりも小さい幅の整数値を表示
>> する際に左側をスペースで埋めるために使用されます。
>> この表示幅は、カラムに格納する事ができる値の範囲も、カラムに指定された幅
>> を超える値の表示される桁数も制限しません。例えば、SMALLINT(3) として指定
>> されたカラムは、通常の -32768 から 32767 の SMALLINT 範囲を持ち、そして、
>> 3文字で許容された範囲外の値は3文字以上の文字を使って表示されます。
桁数を指定したいならDECIMALやNUMERIC使え。
>>785 select distinct(address1) from table_name union select distinct(address2) from table_name union select distinct(address3) from table_name;
不効率。
796 :
NAME IS NULL :2008/10/28(火) 12:49:44 ID:fDvzELKB
intのデータを order by するとき、nullの値が先に来てこのようになってしまうのですが、 ------------------ null, 0, 1, 2, 3 ------------------ nullを後ろに持って行く方法はあるのでしょうか? 0, 1, 2, 3, null 宜しくお願いします。
mysql order by null でぐぐるといいよ
InnoDBなのですが、order byに時間がかかってしまいます。 select * from table where mid='hoge' order by id desc limit 0,10; explainで確認したところ、 Using filesortとなっていてorder byにはindexが使われていないようです。 order byの対象レコードはrows 41074(mid='hoge'が41074レコード)なのですが、 これで一秒ほどもかかってしまいます。 midとidにそれぞれindexを作成しています。 何か良い改善策はありますでしょうか?
>>796 order by -x desc
効率はたぶんよくない(全要素について-x計算してからソートになる)
>>798 mid, idの2項目を並べたインデックスを作れ。
create index i on table(mid, id desc);
>>800 midに既に複合インデックスを他のカラムと作成済みだったのですが、こちらの方が頻度が多いので見直してみます。
INDEXのdescって意味があるんですよね?ちょっとぐぐってきます。
>>794-795 ありがとうございました
今まで使っていて「数字の左側の空白」は意識したことがなかったのですが、
事実上、この数字にはほとんど意味がないってことですね
803 :
796 :2008/10/29(水) 00:10:16 ID:vK6Gsuhh
文字列xからフィールド内の要素を検索するという事は可能でしょうか? つまりxの中にフィールドの要素があるかを検索するという事です。
table a +----+-------+ | id | value | +----+-------+ | 1 | test | | 2 | hoge | | 3 | hoge | | 4 | test | +----+-------+ table b +----+-------+ | id | a_id | +----+-------+ | 1 | 1 | | 2 | 2 | | 3 | 2 | +----+-------+ select a.id,count(b.id) from a left join b on a.id=b.a_id group by b.id; +----+---------+ | a.id | count(b.id) | +----+---------+ | 1 | 1 | | 2 | 2 | | 3 | 0 | +----+---------+ この場合countが0のものを全て含めて抽出するにはどうすれば良いでしょうか? 上の場合 +----+---------+ | a.id | count(b.id) | +----+---------+ | 1 | 1 | | 2 | 2 | | 3 | 0 | | 4 | 0 | +----+---------+ という結果を得たいのですが。
806 :
NAME IS NULL :2008/10/29(水) 15:35:28 ID:lpDzQooS
訂正 table a +----+-------+ | id | value | +----+-------+ | 1 | test | | 2 | hoge | | 3 | hoge | | 4 | test | +----+-------+ table b +----+-------+ | id | a_id | +----+-------+ | 1 | 1 | | 2 | 2 | | 3 | 2 | +----+-------+ select a.id,count(b.a_id) from a left join b on a.id=b.a_id group by b.a_id; +----+---------+ | a.id | count(b.a_id) | +----+---------+ | 1 | 1 | | 2 | 2 | | 3 | 0 | +----+---------+ この場合countが0のものを全て含めて抽出するにはどうすれば良いでしょうか? 上の場合 +----+---------+ | a.id | count(b.a_id) | +----+---------+ | 1 | 1 | | 2 | 2 | | 3 | 0 | | 4 | 0 | +----+---------+ という結果を得たいのですが。
>>805 ,806
group byを適用する前にどうなるか見てみればわかるが、
a_idはbにない要素についてはNULLになってしまうので
よくない。
mysql> select * from a left join b on a.id=b.a_id;
+----+-------+------+------+
| id | value | id | a_id |
+----+-------+------+------+
| 1 | test | 1 | 1 |
| 2 | hoge | 2 | 2 |
| 2 | hoge | 3 | 2 |
| 3 | hoge | NULL | NULL |
| 4 | test | NULL | NULL |
+----+-------+------+------+
5 rows in set (0.00 sec)
a.idを使えばいいと思われる。そもそもgroup byに使ってない
カラムを集約関数なしでselectするのは本来は反則だしね。
mysql> select a.id,count(b.id) from a left join b on a.id=b.a_id group by a.id;
+----+-------------+
| id | count(b.id) |
+----+-------------+
| 1 | 1 |
| 2 | 2 |
| 3 | 0 |
| 4 | 0 |
+----+-------------+
4 rows in set (0.00 sec)
>>808 ありがとうございます。
NULLになってNULLで集約されてしまっているのはわかっていたんですが、方法が思いつきませんでした。
助かります。
810 :
804 :2008/10/29(水) 17:01:05 ID:???
>>807 すいません。%を入れることで自己解決しました
811 :
NAME IS NULL :2008/10/29(水) 17:07:50 ID:YN+eYbRE
すいません質問させて下さい カウンターをmySQLで作ったのですが、現状は セレクトで数字を出し PHPで1を足して アップデートで入れてます。 これで不便は無いのですが カラムからレコードを取り出さずに直接中の値を加算する事はできないですか? できたら便利かと思って。
UPDATE table SET col = col + 1 WHERE ・・・
update テーブル名 set 変数名 = 変数名 + 1 でもカラムからレコードを取り出さないとカウンタ表示できないでしょ?
ストアドで加算しつつ取り出すこともできないことはないが・・
815 :
NAME IS NULL :2008/10/29(水) 18:20:13 ID:YN+eYbRE
>>812-814 ありがとうございます
さっそく今から試してみます
表示が必要なカウンタは結局取り出さなきゃいけませんが
ファイルのダウンロード数をカウントして自分だけで見るカウンタもあるので、そういうのに使ってみます。
メールサーバ専用のサーバで postfixをmysqlにて使っているのですが、 クエリで SELECT forward FROM postfix WHERE username='%s' AND active='Y' と、基本的には、AND でフラグで有効なユーザを絞り込んでいるのですが、 activeフィールドは、1と0のvarcharなのですが、 このフィールドにはインデックスを指定したほうがいいのでしょうか? 4時間稼働した状態で、phpmyadminでは Handler_read_rnd_next 11 k データファイルの次の行を読み込んだリクエストの数。 この値が高いのはテーブルスキャンを大量に実行しているためです。 一般にこれはテーブルのインデックスが不適切か、 クエリがインデックスを利用するように書かれていないことを意味します とあるのですが、 ユーザアカウントには、usernameだけをインデックスに指定しています。 どのように行えば、このエラーが少なくなるのでしょうか?
817 :
788 :2008/10/30(木) 10:09:43 ID:???
>>790 ありがとうございます。
非常に助かりました。
>>816 usernameにインデックスがあるんだからそれは使われそうだけどね。
ほんとにそのqueryでHandler_read_rnd_nextがカウントアップされてる?
819 :
798 :2008/10/30(木) 17:28:02 ID:???
もう一点質問させてください。 CREATE TABLE `diary` ( `id` bigint(20) NOT NULL auto_increment, `date` date NOT NULL, `mid` varchar(10) NOT NULL, `title` varchar(200) NOT NULL, `comment` text NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `mid_date` (`mid`,`date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `comment` ( `id` bigint(20) NOT NULL auto_increment, `diary_id` bigint(20) NOT NULL, `wtime` datetime NOT NULL, `mid` varchar(10) default NULL, `mname` varchar(30) NOT NULL, `comment` text NOT NULL, PRIMARY KEY (`id`), KEY `mid` (`mid`), KEY `diary_id_id` (`daiary_id`,`id`) CONSTRAINT `comment_diary_id_fk` FOREIGN KEY (`diary_id`) REFERENCES `diary` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SELECT d.id,d.title,c.diary_id,c.mname,c.comment FROM comment c, diary d WHERE d.id = c.diary_id AND d.mid='hoge' ORDER BY c.id DESC LIMIT 5; 日記用のテーブルとそのコメント用のテーブルの結合なのですが、 以上のクエリのORDER BYでUsing temporary; Using filesortとなってしまいます。 この場合は複合KEYで対応できないのでしょうか? テーブル設計自体に問題があるのでしょうか。
>>819 その構成だととりうる動作は以下の2つ
(1) d.mid='hoge'をmid_dateインデックスを使って抽出
→対応するcommentをdiary_id_idを使って抽出
→全部拾い出してd.idでソート
(2) commentのidがprimary keyなのでお尻からさかのぼって
対応するc.diary_id=d.idのレコードのmidがhogeなのを
ひろっていく
どっちが選ばれるかよくわからないが普通は(1)になるかなぁ。
インデックス使用を強制すれば(2)にはできるかもしれないけど
当たりのレコードがまばらだと5個そろえるのに相当なめないと
いけないかもしれないから実行時間で得になるかどうかは場合
による。
スピード重視ならデータ的には重複するけどcommentにもd.mid
に相当する値を格納して複合インデックスを作ればそこだけみて
抽出できるので速くなると思う。
821 :
816 :2008/10/30(木) 18:34:16 ID:???
>>818 ありがとうございます。
explainでは、usernameを使っているのはわかりました。
Handler_read_rnd_nextがカウントアップされているかどうかはどのように見つければいいでしょうか?
postfixなんで常に接続が来るので、断続的に増えるのであれば、postfixのクエリだと思うのですが、
意外にphpmyadminのランタイム情報のリロードで増えていくことはありませんでしょうか?
>>820 ありがとうございます。
(1)だと期待する結果ではないので使えません。(あくまでコメントの最新5件を拾いたいため)
(2)は当方のテーブルでは逆に時間がかかりそうです。
クエリを二回にわけると、どうなのでしょうか?以下のようにすると速度的には早くなるのですが。
SELECT c.id FROM comment c ,diary d WHERE d.id=c.diary_id AND d.mid='hoge';
SELECT * FROM comment WHERE id=○ OR id=○ OR ・・・ ORDER BY id DESC LIMIT 5;
d.midをcommentテーブルにも作成しようと思ったのですが、正規化という呪縛にとらわれてしまって・・・
そもそもテーブルをわけない方がいいんですかね?
>>822 (1)と(2)は元のクエリをmysqlが実行するときの内部動作の説明でした。
わかりにくかったらすいません。
d.midをcommentにつくるのは正規化には反するかもしれません。重複
するデータをあちこちに持ちたくないというのはわかります。私もどうして
も速度を稼ぎたいときにしかやりたくないです。mid='hoge'から拾い出される
commentの数がそれほど多くないなら今のままでもなんとかなるんじゃ
ないでしょうか。
>>823 勘違いしました。
現在でもmid='hoge'の該当数が多い場合があるので最適化してるんですが、期待の結果を得るにはd.midを重複させるしかないみたいですね。
あまり正規化にとらわれずにやってみます。
ありがとうございました。
>>811 ロックしなくてもいいのかな?
Apacheだから複数プロセスが走っているような。。。
実用上問題なしかも。
カウンターが正確である必要ないなら。
詳しくは竹村健一先生に聞いてください。
この順番でやればおk begin; update counter set count = count + 1; select count from counter; commit; こっちでもおk begin; select count from counter for update; update counter set count = (PHPで計算した値); commit;
update counter set count = count + 1; この時点ではアトミックだからロックとかいらないでしょ 読み出した値を元にいろいろするなら別だけど
828 :
NAME IS NULL :2008/10/31(金) 03:55:16 ID:zbhYdBxe
MySQL5.1でInnoDBを使っているのですが、 参照専用で、更新は数ヶ月に1回のテーブルがあります。 参照の回数が非常に多いので、このテーブルを同じ構造のMEORYテーブルを作って、 そこにアクセスするようにしたのですが、これって、クエリーキャッシュという機構があるので、 まったく無駄なことでしょうか? クエリーキャッシュが働くことによって、MEMORYテーブルを作ったのと同じように、 ディスクアクセスが無くなるということで正しいでしょうか? 作ってしまってから、ディスクキャッシュという機構を知ったので、 いまどうしようか、悩んでいるところです。
クエリキャッシュは、一度処理したクエリの結果を保持しておくもの。 MEMORYはDBをオンメモリで持っておくもの。 一度も処理してないクエリはクエリキャッシュでは高速化できない。 よって、クエリのばらつきが多い場合はMEMORYのほうが有利と言える。 ただしMEMORYといえど検索コストはかかるので、 特定のクエリばっかりの場合は逆にクエリキャッシュのほうが有利とも言える。
MySQL User Conference 2008 よかった
フィールドの移動ってできないのかな? idってフィールドを3番目に作ったんだけど、 これを1番目に表示するようにしたいんだよね
user pass id 今の表示は↑これなんだけど、これを id user pass にしたい。
alter table test modify column user varchar(10) after id, modify column pass varchar(10) after user;
だいたいやね。
835 :
NAME IS NULL :2008/11/01(土) 15:36:15 ID:qrtLarIM
すみません、質問です 今、料理のメニュー表みたいなのを作ろうとしてて、料理カテゴリ管理用のTABLE(「スープ」とか)と それに属するメニュー管理用のTABLE(「コーンスープ」「ポタージュ」とか)を作ってます 今までは、カテゴリ名登録ページでカテゴリ登録した後に、メニュー登録ページでメニューを登録 してたんですが、二つに分けるのは面倒なのでページを統合したいです。 そうすると二つのTABLEに同時にクエリすることになると思うんですが、 カテゴリTABLEへのクエリが終わったあとにエラーが発生してメニューTABLEへの処理が出来なくなる ような事態を防ぎたいと思います どうしたらいいんでしょうか? また、賢いクエリ文を教えてくれたらうれしいです、自分では以下のような処理しか思いつきません $rs = mysql_query("insert into cateTable `cateName`={$cateName} and `id`=0", $conn); if($rs){ $cateId = mysql_affected_rows(); mysql_query("insert into menuTable `menuName1`={$menuName1} and `cateId`={$cateId} and `id`=0", $conn); } 環境はphp5とmysql5です、よろしくお願いします。
すみません、以下のように修正します insert into cateTable (`cateName`,`id`) value('スープ',0) insert into menuTable (`menuName1`,`cateId`,`id`) value('ポタージュ',{$cateId},0)
エラーが発生しているのにメニューテーブルへの処理を続行すること自体がおかしい。 どういう異常パターンで何がしたいの?
838 :
NAME IS NULL :2008/11/01(土) 18:15:46 ID:qrtLarIM
>>837 どうもありがとう
カテゴリTABLEへの登録がちゃんと済んだときのみ、メニューTABLEにも
登録するようにしたいんです
自分としては
>>835 のプログラムで対応を考えてるんですが、、
あれだと、2つめのクエリ(メニューTABLE)が成功するとは限らないし、
失敗した場合は結局 1つめだけ成功・2つめ失敗になります
その辺の対処をどうしたらいいのか、出来ればSQL文の簡単なサンプルと
あわせて教えてもらえるとうれしいです。
そもそも正規化しすぎじゃない? という気がするが。 丸ごとtry&TRANSACTIONかしら。
840 :
NAME IS NULL :2008/11/01(土) 18:48:11 ID:qrtLarIM
>>839 どうもありがとうございます
知識不足でtry&TRANSACTIONが良く分からないんですが、、
一つのテーブルにまとめたほうがいいんでしょうか
メニューテーブルの構成を
id, cateName, menuName, priceにして、cateNameに同じ値が延々入るのは
しかたないと開き直ったほうが賢いんだろうか
PHPに限らず、try-catchによる例外処理と データベースのトランザクションについては、 いまのうちに勉強しといたほうがいいと思います。 try { begin; insert 1個目; insert 2個目; commit; } catch (例外) { rollback; }
>>841 ありがとうございます!
それ、勉強してみます!
843 :
NAME IS NULL :2008/11/02(日) 00:21:30 ID:WnUJTCju
アンケートフォームを作ろうと思ってます。 それで、質問項目自体も管理側で自由に設定するとして、 基本の質問 (1)名前(2)性別(3)年齢 に加えて、自由質問も設定できるとします。 そうすると、 (4)好きな食べ物 のときも (4)最近旅行した場所 のときも出てきて 答えがどの質問に対する回答なのかわからなくなり、集計画面を作るときに困ります 最終的には質問ごとの回答をグラフ表示できるようにしたいんですが、、 どうやって回答を収めるテーブルを作るべきでしょうか? col1 = "山田太郎", col2="男", col3="25歳", col4="好きな食べ物,ラーメン" みたいに質問と答えをまとめて登録するのもいいかなぁと思いますが 正規化を 考えると良くないですよね すみませんが、スマートなテーブルの作り方、データの収め方をアドバイスお願いします。 (テーブルは、質問格納テーブル と 回答格納テーブルがあるとしてください)
MySQL直接関係ないじゃないか。 質問([質問ID], 質問文) 回答([回答ID], 名前, 性別, 年齢, 質問ID, 質問回答)
>>833 サンキュー
これってphpmyadminのSQL文の中で
実行してもいいのかな?
>>833 サンキュー
MS-DOSプロンプトでやったらできたよ
これってphpmyadminの中からでもできるの?
847 :
NAME IS NULL :2008/11/02(日) 02:03:56 ID:WnUJTCju
>>844 なるほどー
質問テーブルを ID,Q1,Q2,Q3,Q4 って考えてたのがまずかったんだなぁ
勉強になりました ありがとうございます
>>845 適当なテーブル作って試してみればいいじゃん。
なんでも聞けばいいってもんじゃないだろ。
849 :
NAME IS NULL :2008/11/02(日) 20:40:21 ID:qFcTtU4O
一度sjisで入れたデータを全てEUCに変える事ってできますか? 今メモ帳でサイト作ってるんですが、全部できあがったらEUCに変えたいのです。
メモ帳やめて秀丸でやればいいんじゃね
ただのおまけのメモ帳なんて使ってる人いるんだね
板違いだったらすいません。 質問なのですが、二つの表があり、直積演算や選択演算を計算しなさいという問題では どのように答えたらいいのでしょうか?
直積や選択をした結果どういうレコードが得られるか、 表形式で書いてあげればいいんじゃね。 板は合ってるがスレ違い
OSはubuntu 8.10でMySQL 5.0.67を使用しています。 Checking for corrupt, not cleanly closed and upgrade needing tables. と表示されてmysqlが起動しないので、mysql_upgradeを行い、doneと表示されました。 ですが、上のメッセージが消えず、OS起動時にmysql serviceがfailedとなってしまいます。 どうすれば上のメッセージが表示されない状態になるのでしょうか?
855 :
852 :2008/11/03(月) 07:23:25 ID:???
>>853 アドバイスありがとうございます。
参考書のぞいても載っていなかったもので、どうしようかと思っていました。
参考にさせていただきます。スレ違い申し訳ない。
856 :
NAME IS NULL :2008/11/03(月) 13:39:20 ID:Y+xjwnxz
windows power shellではダンプはできるのですがリストアができません。 多分古いタイプのコマンドツールならできると思うのですが、うちのXPには入ってないようです。 みなさんが何でリストアしてるのかを教えて下さい。 それがダウンロードできる場所も教えてくれるとありがたいです
>>851 ばっかおっめurlストリームも直接開けるんだぜ。
文字コードだって95時代からunicodeに対応してるんだぜ、たしか。
最も困る点といえばメモリ適当に食うからでっかいファイル読むとしんどいことかな!
858 :
NAME IS NULL :2008/11/04(火) 16:57:04 ID:ZVeUnEqM
複数のカラムから検索する時って select * from テーブル where カラム1=検索用語 or カラム2=検索用語 or … ってするよりシンプルで簡単な方法ない?
WHERE 検索用語 IN (カラム1, カラム2,・・・) って書けるけど、MySQLはどかなあ、、、バージョンによるかも?
860 :
NAME IS NULL :2008/11/04(火) 17:57:37 ID:ZVeUnEqM
>>859 ちょっとやってみる。
検索するカラムが多いとsql文が長くなりすぎるんだよな。
カラムの結合とかして検索してもいいの?
結合の意味がよく分からないんだけど。
>>860 長丁場になるならな、一時テーブルつくってそこに検索カラムをスペース区切りでぶっこむ。
フルテキストインデックス作る。
あらまぁなんて早いんざんしょ。
日本語だとひとひねりいるらしいじゃん。
862 :
NAME IS NULL :2008/11/05(水) 15:01:20 ID:RPtkmb8j
分からない事があるのですが、blobにバイナリ(画像)が入らないので、 insertする前にset names ujisとした所、ちゃんと入りました。 (mysqlの設定では入力出力全てsjisです) しかし取り出すときには set names ujisとしてもsjisとしても画像はブラウザに表示されます。 バイナリの出力時は文字コードは関係ないのでしょうか? それともDBの中にはujisで入っていても、出す時に (set names ujisとクエリを送ったとしても)DBが自動でujisをsjisに変えてくれてるのでしょうか?
863 :
NAME IS NULL :2008/11/06(木) 13:38:54 ID:d2/MPlBE
インデックスとフルテキストインデックスの違いが分からんのだが 文字数制限があるのがインデックスで カラム内全ての文字がインデックス対象になるのがフル?
864 :
NAME IS NULL :2008/11/06(木) 16:12:36 ID:d2/MPlBE
過疎?
全然違うわボケ
866 :
NAME IS NULL :2008/11/06(木) 19:11:45 ID:d2/MPlBE
ちょっと質問なんだが カラム1を検索対象にしてそこに文を入れます。 ワイルドで検索すると「です。ます。」とかでも出てきてしまうんですが 出ないようにするにはフルテキスト検索にするしかないんのか? ちなみにPHPです。 別カラムにキーワードだけ入れておくのはめんどくさいからいやです。 教えて下さい。
>>866 わかち書きして別カラムに入れろ。それしかない。
868 :
NAME IS NULL :2008/11/06(木) 20:16:37 ID:d2/MPlBE
>>867 そうすると単語の区切りを把握するためにソフトがいりますよね。
PHPとmysqlなんですが、どんなソフトがよろしいですか?
mecab
870 :
NAME IS NULL :2008/11/06(木) 21:40:36 ID:d2/MPlBE
MySQLを勉強しようと思ってるんだが、お勧めの参考書とかある?
オライリー
>>871 公式のマニュアルだけで十分。
公式だけあって間違いが無いし、しかもタダ。
874 :
NAME IS NULL :2008/11/07(金) 18:56:17 ID:SI9b5mDK
バイナリが入ったテーブルをうまくダンプするコツってありますか?
--hex-blob ではだめ ?
876 :
NAME IS NULL :2008/11/08(土) 06:40:23 ID:vE51FDTx
じゃあ、私も me to
oがいっこたらんかった
はじめまして。 グーグルでマイマップの担当をしております。 質問よろしいでしょうか。 グーグルのマイマップのデーターが 削除したはずなのに、勝手に復活してしまいます。 データーベースのどこの設定を見直せば いいのでしょうか?
改訂新版 基礎PHPという本を見て初めてWEB+DBアプリを作ろうとしているのですが、 この本に載っている「カンマ区切りで複数テーブルの一括UPDATE」がうまくいきません。 SQL文でいうと、 UPDATE TABLENAME SET TITLE='HOGE', DESC='HOGE' WHERE ID='HOGE'; といった感じにSETの部分をカンマで区切って複数記述すれば記述したぶんだけ更新対象になるはずなのですが、 実際にこのSQL文をコンソールから発行すると、 #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 'DESC='HOGE' WHERE ID='HOGE'' at line 1 といったようにカンマで区切った直後からシンタックスエラーになってしまいます。 初心者ながら疑っているのは、この本で説明されているMySQLのバージョンが4.2であるということです。 実際に動かしているのは5.0.67-communityです。 御指南願います。
5.0.45でふつうに動くよ。 ただのタイプミスな予感。 mysql> update dept set dname = 'a', loc = 'b' where deptno = 10; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0
882 :
880 :2008/11/09(日) 12:43:18 ID:???
>>881 descというカラム名をdescriptionに変えたら普通に動きました。
どうやらdescという名前は先に予約されているようで。desc2とかでも動きました。
いずれにせよ勘違いでご迷惑をおかけしました。
>>754 再現試験してみたいから、ミニマムなテーブル構成を教えて。
DATETIMEと自動インクリメントのIDだけのテーブルだと
抜けは発生しなかった。
>>882 あーそうか。気づかなかった。
MySQLで予約語とのバッティングを避ける場合
テーブル名、カラム名をバッククォートで囲むのがお作法。
mysql> update test set `desc` = 1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
シングルクオート ' アクサングラーブ ` ダブルクオート " シングルクオートとアクサングラーブの違いってなに?
887 :
NAME IS NULL :2008/11/09(日) 19:57:14 ID:iU37Z7xj
勉強しまっせ
889 :
NAME IS NULL :2008/11/10(月) 11:41:53 ID:3VXeAzu2
質問なんだけど カラム1に数字を入れておいて 大きい順や小さい順に並べるのではなく あるレコードが全体の何番目の順位なのかを出せる? 例 レコード1 : 250 レコード2 : 655 レコード3 : 157 レコード4 : 924 レコード2は全体の何位か?(3と表示させたい)
>>889 レコード2より小さい値のレコードの数を数えて+1すればいい
891 :
NAME IS NULL :2008/11/10(月) 16:52:48 ID:RN2rB+yA
自分でビルドして提供してやれよ
893 :
NAME IS NULL :2008/11/10(月) 17:48:40 ID:3VXeAzu2
>>890 ありがと。
あと別の質問なんだけどMeCabの使い方がよく分かりません。
文をわかち書きにして、それをmysqlのフルインデックスのカラムに入れればいいだけなの?
本当にそんなので検索が早くなるんですか?
たったそれだけでいいの?
単純なLIKEより数十倍速いよ。 わかち書きがベストかどうかはケースバイケースだけど。 当て方によってはNgramのほうがいいかも知れない。
>>893 何をしたいかによるだろう。
単位切り(「わかち書き」)するのは、「近鉄」で「本日近鉄の株価は」は引きたいけど「最近鉄道がよく止る」は引きたくないときとか。
或いは「近鉄」から「近畿日本鉄道」を引くための辞書引きをしたいとか。
面倒な事はいやで全部お任せがいいなら lucene でぐぐる。
896 :
NAME IS NULL :2008/11/10(月) 23:43:38 ID:4lZdswNB
DBから値が取得できません。下記の設定のどこがまずいのでしょうか? エラーにもなりません。教えてください。 【web.xml】 <web-app> <resource-ref> <res-ref-name>aiueo</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app> 【server.xml】 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="/testtest" docBase="testtest" > <Resource name="aiueo" auth="Container" type="javax.sql.DataSource" /> <ResourceParams name="aiueo"> <parameter> <name>username</name> <value>myusername</value> </parameter> <parameter> <name>password</name> <value>mypassword</value> </parameter> <parameter> <name>driverClassName</name> <value>com.mysql.jdbc.Driver</value> </parameter> <parameter> <name>url</name> <value>jdbc:mysql//localhost/testdb?autoReconnect=true&characterEncoding=ujis</value> </parameter> </ResourceParams> </Context> </Host>
897 :
NAME IS NULL :2008/11/11(火) 12:11:29 ID:wu2CFRsa
えっといつもpostgresqlを使っていたがmysqlをスキルアップで使ってみた 文字化けしまくりじゃない?おかしくない?これ糞じゃない?
899 :
名無し募集中。。。 :2008/11/11(火) 12:48:24 ID:irtGfUWp
>>899 いろいろやってみましたがだめだったので午後から5.1を入れてみて
それでもだめだったらあきらめます
何やっても無駄だから、さっさと諦めてバイト行った方がいいよ。
>>900 その問題って6.0から修正される予定だからもうちょっと待ったほうが良いよ。
904 :
NAME IS NULL :2008/11/12(水) 08:55:53 ID:wlLozbBr
或るテーブルについて、create table した日時を取得する方法ってある ? mysql 5.0.51a
>>904 show table status の Create_time とか。
おお、知らなかった。有難う!
907 :
NAME IS NULL :2008/11/12(水) 13:05:59 ID:ZiD1HHcX
質問させてください。 set names が有効なのはバージョンMySQL4.1以降と複数の場所に書いてあったのですが、本当でしょうか?? 自分は今ロリポップのレンタルサーバでMySQLを使っていて、バージョンは4.0.24のようなのですが、プログラム側からset names を使わないと意図したとおりに動かない部分があります。 そもそもset namesは使わない方がいいというのを知って(でもset names sjisの場合だけ?)いろいろ調べてたのですが・・ ご教示頂けると幸いです。
有効かどうか(っていうか文字コードが変更されたかどうか)は set namesしてからstatusしたらわかることじゃね?
既存のテーブルのあるカラムに対して Alter文でforeign key制約を付加すると なぜかMUL制約になってしまいます。 何か原因として考えられることはあるでしょうか? FKとMULは何の関係も無いと思うのですが。
910 :
907 :2008/11/12(水) 17:54:51 ID:ZiD1HHcX
そうなんですが、ロリポップのサーバを使っているので・・ $db->query("status"); はうまくいかなかったので、 $db->query("show variables"); でPHPからアクセスしてブラウザに出力させてみたのですが、charcter関連の環境変数は character_setとcharacter_setsとconvert_character_set だけで、character_set_clientとかcharacter_set_serverなどの値はありませんでした。 set names utf8 してから show variablesしてブラウザに出力させてもcharacter_set は ujis で表示されました。 よく分かりません・・。
911 :
NAME IS NULL :2008/11/13(木) 17:44:54 ID:URLtXCYR
ダンプする時のオプションに-hex-blobをつけると出力サイズが2倍になってしまうのですが仕様ですか? mysqldump -u root -p -x -hex-blob --opt db_nane > "C:/test.spl"; としています。
ascii の1バイトのAを hex で書くと何バイトになる ?
>>912 どのくらい増えるかよく分からんけど増えるもんなのか…。
ダンプせず、mysqlのdataフォルダをコピーして保存した方がいいな。
ふつう圧縮するよね? $ mysqldump (略) | gzip - > backup.sql.gz
MyODBC日本語変換機能版というのがなくなっているのですが EUCで登録されているDBをODBCで見るにはどうしたらよいでしょうか? 普通のmyodbcだと文字化けしています。
916 :
NAME IS NULL :2008/11/14(金) 12:34:19 ID:j6IY8X/S
どこで質問していいか分からないのでここで質問させて下さい。 mecabをPHPで使う為、パイプを使って解析後のデータを取得したのですが 下記のようになります。 原文 「ラーメン食べたい」 希望 「ラーメン 食べたい」 実際 「ラーメン 名詞,*,*,ラーメン食べたい,動詞,*,*EOF」 これだとラーメン(読み)と食べたいの間に改行が無いため PHPを使って分割する事もできません。 コマンドプロンプトで行うと ラーメン 名詞,*,*,ラーメン 食べたい,動詞,*,* EOF のように改行がでるのですが、パイプで出力させると改行がありません。 改行を出す方法か、mecabで名詞,*などを出さない方法の方がいましたら教えて下さい。
$string = explode(',', $in); $list = array(); foreach ($string as $val) { if (false === strpos($val, '*') continue; list($list[], $dummy) = explode(' ', $val); } $out = implode(' ', $list); print $out; 即興で書いたから動くかはしらん
mecab とか mysql とか無関係。 「PHP でパイプ使ってLFを拾う方法」をPHPスレで聞けば。
919 :
NAME IS NULL :2008/11/14(金) 20:01:47 ID:j6IY8X/S
>>917 ありがとうございます。
が、それだと改行の所が切り離せないんです。
原文
「寿司大好き」
結果
「寿司 名詞,*,スシ大好き 名詞,*,ダイスキ」
というように
読みの「スシ」と、本来次の行の頭である「大好き」がくっついてしまってるので
explodeで切り離せないんです。
もう分からないので切り離さず文字置き換え関数で「名詞」とかだけ消して
そのままレコードとして保存しようかとも思いましたが
サイズもでかくなるし。
例えば,ユーザ名・IPアドレス・アクセス日時が記録されたアクセスログのテーブルで, 「select ユーザ名,IPアドレス,アクセス日時 from アクセスログテーブル group by ユーザ名」 とやると,重複したユーザ名は無視されるけど,アクセス日時が一番古いものしか取り出せない. これを,一番最近アクセスしたものを取り出して,かつ重複したユーザ名は無視する場合はどうすればいいでしょう? 「order by アクセス日時 desc」を先にやってgroup byやるとエラーになるし. どなたかお願いします.
922 :
921 :2008/11/15(土) 00:48:46 ID:???
自己解決しました
mysqlのだめな所は my.iniを勝手に複製している点だよね。 ウンコ。
924 :
伊藤 誠 :2008/11/15(土) 14:57:19 ID:4dEjJwLu
つまらない質問かもしれませんが、 あいう,1,0,11,2,a1,abc というような、レコードが格納されたカラムを 0,1,2,11,a1,abc,あいう という順序でselectするには、どのようなselect文 を書けばよいのでしょうか? どうか、ご教示ください。
MySQLとか以前の問題だ。 まずは、SQLの入門書読めw
926 :
伊藤 誠 :2008/11/15(土) 16:42:29 ID:4dEjJwLu
>>925 質問に対する答えはアンカーを付けていただけませんか?
(答えになっていませんけど)
もしかして、僕の質問のことですか。
925さんには難しかったようですね。
アンカーが付いていないのでこれ以上は
言えませんが・・・
誰か他に分かる方はおられませんか?
927 :
伊藤 誠 :2008/11/15(土) 16:49:54 ID:4dEjJwLu
>>925 僕に対する答えと受け取って、
追加説明します。
入門書レベルの誤解として
カラムの型を文字列もしくは
カラムを文字列にキャストし
昇順で並び替えたら?
と、簡単に返すとしたら
それこそSQLの腕は入門書レベルですね。
その様にして並び替えれば、
0,1,2,11,a1,abc,あいう
ではなく
0,1,11,2,a1,abc,あいう
となります。
その横に並んでいるのはカラムじゃなくてレコードなのか そりゃ答える方も誤解するわ
929 :
伊藤 誠 :2008/11/15(土) 17:09:26 ID:svuXBrLZ
>>928 もう一度924読んでください。日本語も理解で来ませんか?
930 :
伊藤 誠 :2008/11/15(土) 17:24:58 ID:svuXBrLZ
>>927 あげ足を取るならば、下記の様に訂正します。
(テーブル作成時に)カラムの型を文字列(とする)もしくは
カラム(に該当するレコード)を文字列にキャストし
とします。因みに924では正しく書いています。
日本語理解で来てなかったよ。 すまんすまん
いずれにせよ、回答する気にならんな
933 :
伊藤 誠 :2008/11/15(土) 17:34:00 ID:???
まったく揃いも揃って使えない連中ばかりですね。 分からないなら分からないと言えばいいのです。 僕はこれから出かけます。 2時間程したらまたここに来ますので、それまでに回答しておくように。 頼みましたよ。
934 :
伊藤 誠 :2008/11/15(土) 17:56:19 ID:svuXBrLZ
>>933 代弁ありがとうございます。2時間後に拝見します。
おお、私も疑問に思ってたことがでている。私はPostgresqlなんだが、 order by substr(住所,1,1),substr(住所,2,1),... ,substr(住所,n-1,1),substr(住所,n,1) の様なことを平気でやってる。もっと洗練された表現はないものか。
テーブルにデータをinsertとupdateした時に、 MySQL側で自動的に作成日時と更新日時が更新されるよう、 以下のカラムにしたんですが、insert時に、アプリ側で created = NULLを指定しないといけないのでちと面倒です。 `created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' , `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , MySQL側で全部処理するのが理想なんですが、 ほかにもっとスマートなやり方ってありますでしょうか?
トリガ?
938 :
伊藤 誠 :2008/11/16(日) 09:17:05 ID:rXBUq5sa
>>935 少なくとも、924-934で僕とやり取りした方には
分からないようですよ。
上げ足を取ることには長けておられるようですが。
もう少しSQLの方に長けておられる方
返信お持ちしております。
伊藤 誠 がバカなのは解ったけど、明日の日経平均は上がるかなぁ?
940 :
伊藤 誠 :2008/11/16(日) 09:41:30 ID:rXBUq5sa
>>939 僕は一向にかまわないが、遠まわしに936さんを
馬鹿呼ばわりするのはいかがなものかと?
941 :
伊藤 誠 :2008/11/16(日) 09:42:41 ID:rXBUq5sa
>>924 > あいう,1,0,11,2,a1,abc
> というような、レコードが格納されたカラムを
> 0,1,2,11,a1,abc,あいう
何をしたいか解らん、一体全体、どんな規則で並び替えたいんだ?
文字列型をその時の気分で並び替えたいなら、その時の気分で手動で入れ替えるしか無いんじゃないか?
943 :
伊藤 誠 :2008/11/16(日) 10:12:45 ID:rXBUq5sa
>>942 数字と文字列が混在した場合、数値として識別されるものは
その大小順、文字列として識別されるものは辞書順ということ
になります。
ちなみに、テーブル作成時のカラムの型は文字列となります。
>>943 > 数値として識別
主語がないけど、MySQLが識別するってこと?
文字列なんだから勝手に識別はしてくれないでしょ
945 :
伊藤 誠 :2008/11/16(日) 10:27:17 ID:rXBUq5sa
>>944 そうですね。
関数での識別等を検討しましたがうまくいきません。
今のところorder byで処理しようとしているのですが・・・
内容的にはこういうことでしょうか。
>>945 mysql> CREATE TEMPORARY TABLE strings (
-> string TEXT
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO strings (string) VALUES
-> ('あいう'),('1'),('0'),('11'),('2'),('a1'),('abc');
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> SELECT string FROM strings
-> ORDER BY
-> string REGEXP '^-?[0-9]+$' DESC,
-> CAST(string AS SIGNED),
-> string;
+-----------+
| string |
+-----------+
| 0 |
| 1 |
| 2 |
| 11 |
| a1 |
| abc |
| あいう |
+-----------+
7 rows in set, 3 warnings (0.00 sec)
あるいはもっと性能を出したいのであれば、
該当するカラムが「数値」であるかどうかを登録前に別のプログラムで判断して、
`is_numeric`のようなカラムに入れておくのがいいんじゃないでしょうか。
>>946 "109ビル4FランジェリーショップLOVE" とか "2008年Xmas" とかも、同様に並べ替えれるの?
948 :
NAME IS NULL :2008/11/16(日) 12:57:11 ID:Q2ekdbiC
MyISAMで、key_buffer_sizeを、よく言われているように、 すべてのインデックスファイルが収まる程度にしているのですが、 インデックスファイルがこれを超えても、スワップが頻繁に発生したりはしていません。 OS側のキャッシュが働いているからだと思います。 OS側でキャッシュが働くなら、バッファサイズ関係のパラメータは 特に気にはしなくていいということなのでしょうか? インデックスのサイズが巨大になりすぎて、物理メモリに載らなくなると、 さすがにマズいと思いますが。
>>946 それ見て思い出したけど、XP以降(2000は忘れた)のExplorerは、ファイル名昇順にするとその並びになるね。
950 :
伊藤 誠 :2008/11/16(日) 13:44:51 ID:rXBUq5sa
>>946 REGEXPは2バイト文字には完全に対応していないらしいです。
951 :
伊藤 誠 :2008/11/16(日) 16:42:43 ID:rXBUq5sa
>>946 この整列の場合、日本語(2バイト文字)云々はあまり関係ありませんでしたね。
実装して、動作を確認しました。整列時の正規表現を取り入れる方法は
頭になかったので、大変参考になりました。
重ねて、お礼申し上げます。ありがとうございました!
952 :
928 :2008/11/16(日) 16:44:33 ID:???
>>946 のregexp使わない&warning出さない版。
drop function get_int;
delimiter $$
create function get_int (str varchar(100)) returns int
begin
declare num int;
declare continue handler for 1292 set num = null;
set num = cast(str as signed);
return num;
end;
$$
delimiter ;
select * from test1115
order by
get_int(data) is null,
get_int(data),
data
;
+-----------------------------------------------+
| data |
+-----------------------------------------------+
| 0 |
| 1 |
| 2 |
| 11 |
| 0text0 |
| 109ビル4FランジェリーショップLOVE |
| 2008年Xmasは中止 |
| a1 |
| abc |
| あいう |
+-----------------------------------------------+
7 rows in set (0.00 sec)
953 :
伊藤 誠 :2008/11/16(日) 16:47:24 ID:rXBUq5sa
しかし、これを入門レベルと言われるのは 僕にとっては、酷です。
中止かよ、暗い年末だな
酷っても、質問の意味を伝える事が出来なきゃ、入門以前で始まらない。
956 :
伊藤 誠 :2008/11/16(日) 16:53:45 ID:rXBUq5sa
>>952 ストアドファンクションまで使えるんですね。
ある意味、order byはなんでもありというか・・・
整列に幅が広がりそうです。
原理は946と同じですね。
>>947 「同様」の定義によると思います。
>>952 で作ってもらった結果でよさそうであれば、伊藤さん的には同様だと。
>>950 解決されたのであればなによりです。
>>952 ありがとうございます。
まじめに対応しててワロタ
959 :
伊藤 誠 :2008/11/16(日) 17:43:03 ID:rXBUq5sa
>>909 仕様です。
FKEY満たしているかチェックするために
INDEXがあったほうが便利なので、
自動で作られているだけですよ
Server version: 5.0.51a です あるユーザーで入っている時に別ユーザーでコマンドを実行したい時って 一旦抜け出して、そのユーザーで入り直さないと駄目ですかね? suで切り替える…見たいな事が出来たら良いなと思ったりするんですが。
MySQLに対応しててサーバに直接接続してフォーワード・リバースできる ER図執筆ソフトってある? dbdesignerとか2年間開発とまってるし
無料のやつで。
dbdesignerなら出来るんだけどね 確かオープンソースだから誰か開発引き継げばいいのに
mysql workbenchは?
無料で、って言ったのはその選択肢はもう調べましたって意味だわな
ML Tuchida MAO もうしゃべんな。 場違い、スキルなし、調べる能力なし。
おもしろいやつがわいてるっw
971 :
NAME IS NULL :2008/11/19(水) 10:48:26 ID:XpAwnT72
mysqlってもしかしてjoinしたviewにinsertって出来ないのですか? ルールとかなし? マニュアル見ても無さそうだけど
それはどっちかというとPostgreSQLが変態。
order byでソートした順番で保存したい場合は 新しくテーブル作ってそこにコピーするしか方法はないんですか?
順番で保存って・・・ どうして? ORDER BY じゃだめですか? しかも、エンジンによってはINSERTした順番に保存されるのが保障されてなかったりしそうだけど。 各章はないけど。 なんか「順番に保存」っていう発想がDBっぽくない、とか言ったらダメですか?
読み出し順序が保証されてない以上、順番に保存する意味もない。
order byつけたビュー作れば?
主キーがついてるデータを消すとそこの主キーの番号が抜けちゃいますよね? それより後ろの主キーが一つずつ自動で下がってくれたりなんかしませんよね? なんか落ち着きません
お茶でも飲めばいいんじゃね
値がNULLのデータがあればそこに、値がNULLのデータがなければ order byしたソートのデータにいれるって条件式どうやったらできますか?
981 :
NAME IS NULL :2008/11/20(木) 03:23:13 ID:laS2bxPS
だれかTritonnのFreeBSD用の野良portsを作ってください。
DateTime型とTimeStamp型がありますが、 どのように使い分けるのでしょうか? たとえば現在の時刻を取得してDBに保存するプログラムの場合は ネットや本で見る限りTimeStampが多いですね。 でもDateTimeでも代わりに使えると思いますし、DateTimeにすることで マイナスになるようなことも無いように思います。 単純に慣習なのでしょうか?
今卒研としてjavaとMySQLを組み合わせて文書検索システムを作ろうと思っているんですが MySQLに文書の中身(文字列)を登録するのは容量的に大丈夫なんでしょうか? 最初は Luceneなどでファイルから直接キーワード検索 としようとしたんですが、 色々な種類のファイルを同時に読み込めるかということに疑問を感じたので @txt.pdf.docから文字列を読み込み→AMySQLに登録→BMySQLからキーワード検索 のほうが自分のレベル的にもできると思ったのでこの仕様で大丈夫かお聞きしました。
20文字程度のを1つ2つなら容量的に大丈夫 1文書が3TBのを100万オーダーで入れ込みたいなら難しい
卒研ならもう少しマシなシステム組まない? MySQLじゃ研究というより勉強じゃね?
987 :
NAME IS NULL :2008/11/21(金) 16:44:01 ID:Hi3D4ul/
mysqlで複数行のinsertってアトミックになりますか? たとえばauto_incrementなidにしていた場合、一回のSQL発行時には 必ず連番のidになるのでしょうか。
複数テーブルをFROM句に含めた状態でFOR UPDATEをかけた場合って、FROM句に書いた全てのテーブルがロックされるのでしょうか?
そもそも書けたっけ?
990 :
984 :2008/11/22(土) 02:12:17 ID:???
レスありがとうございます。
>>985 すいません多分自分の言葉足らずで違う意味で理解されてしまったと思いますが
20文字程度を例に上げられるってことはMBサイズの文書を登録はやめたいいということしょうか?
>>986 メインはJAVA部の機能です。教授にDB勉強兼ねろ。といわれ
DB勉強がてらにMySQLを使用したのですが(都合がつけばこのまま)
やはり他のDB使ったほうがいいということでしょうか?
本心を言うとJAVA部で既に飽き、性能悪くてもとっとと終わらせたいと思ったので
MySQLの検索機能を利用できるならそっちを使おうかと思いました。
ふーん。フルテキストインデックスを貼っておけば、そこそこ動くと思うけどね。 教授がそれでいいと言うなら、いいのかしら。 あるいはそもそも、MySQLでは日本語全文検索が使い物にならないという巧妙な罠だったりして。
>>989 select * from department d inner join employee e on d.dep_id = e.dep_id for update;
こんな感じのクエリ投げてみたら普通に通ったは通った。
inner join しなくてFROM句にテーブル名並べても同じ。
ただ、この時ロックがかかってるのかどうかは分からん。
誰か詳しい人いたら教えてください。
>>983 TIMESTAMP型のメリットは、
INSERT,UPDATE時に自動で日時を設定してくれることと、
サイズが小さいことくらい。
workbenchでビュー作ると 間違いがなさそうなのにsyntax errorって言われる テーブル名指定してるところが赤くなってるんだけど、でもそのテーブルもworkbench上で定義してるのに workbenchでビュー書けた人居ますか?
workbenchで作ったテーブル定義が実際のDBでエラーになったことがある わりと品質悪そう バグ報告しちゃえば?
997 :
NAME IS NULL :2008/11/23(日) 18:42:32 ID:UerS0rap
一つのテーブルに45000枚もエロ画像入れたのにselect一瞬で驚き。 正直Oracle使ってるやつは何が良くてOracle選んでるの?って思う。 mysqlは神だね。爆速。
1件のデータ容量なんて関係ないからね バイナリに対する検索じゃなければ。 45000はDBとしては全然少ないし
1000
1000 :
1000 :2008/11/24(月) 04:00:41 ID:???
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。