2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

MySQL 総合 Part14

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
【関連ツール及びユーティリティ】

[phpMyAdmin] http://www.phpmyadmin.net/
[phpMyBackupPro] http://www.phpmybackuppro.net/
[MySQLCC] http://www.mysql.com/products/mysqlcc/
[MySQL-Front] http://www.mysqlfront.de/
[mytop] http://jeremy.zawodny.com/mysql/mytop/
[Common SQL Environment] http://www.hi-ho.ne.jp/tsumiki/cse_1.html

MySQL ABでの各種GUIツールはMySQL GUI Toolsとして統合されています
(WorkbenchはGUI Toolsから独立しました。)
http://dev.mysql.com/downloads/gui-tools/5.0.html
・MySQL Administrator
・MySQL Query Browser
・MySQL Migration Toolkit

http://dev.mysql.com/downloads/gui-tools/5.0.html#Workbench
・MySQL Workbench

【関連書籍】

[MySQL Books]
http://dev.mysql.com/books/
http://www.amazon.co.jp/exec/obidos/search-handle-url/ix=books-jp&fqp=keywords%01MySQL
http://www.amazon.co.jp/exec/obidos/search-handle-url/ix=books-us&fqp=keywords%01MySQL


3 :NAME IS NULL:2008/06/13(金) 13:28:13 ID:???
InnoDB使える安価なレンタルサーバー教えてください

4 :NAME IS NULL:2008/06/13(金) 13:37:00 ID:???
すみません誤爆です

5 :NAME IS NULL:2008/06/13(金) 13:39:25 ID:???
MySQLのデータを一時的に退避させて
テーブル構成を変更してからもう一度中に入れたいのですが
何か良い方法は無いでしょうか?
mysqldumpコマンドだとデータをいじるのが大変そうです。
エクスポート/インポートの定番のツールなどはありますか?

6 :NAME IS NULL:2008/06/13(金) 13:43:26 ID:???
データはどの位あるの?

7 :5:2008/06/13(金) 14:00:00 ID:???
>>6
現在のデータ量はそれほどでもないのですが、
顧客データなのでこれから増えていくことも考慮して
多くのデータ(数千〜万行)を操作できるようなツールを探しています。

8 :NAME IS NULL:2008/06/13(金) 15:40:42 ID:???
最近、数万件のデータをその様にコンバートかけた事あるけど、
ツールを探したり、検証する時間がもったいないから、PHP で自分で作った

9 :NAME IS NULL:2008/06/13(金) 16:24:22 ID:???
というかテーブル構成変えてデータを元に戻してもテーブルにデータ入るわけないじゃん
馬鹿なの?

10 :NAME IS NULL:2008/06/13(金) 16:34:48 ID:???
どっちが馬鹿なんだか。質問の意味を理解してないみたいだな。
失笑を買う。

11 :NAME IS NULL:2008/06/14(土) 06:10:45 ID:???
>>5
SELECT INTO OUTFILEやLOAD DATA INFILEじゃダメなん?


12 :NAME IS NULL:2008/06/14(土) 07:43:13 ID:???
RHEL apache2 mysql5.0.41 php5.2.1 で
where col = '日本語文字列'
がマッチしないケースがあり困ってます

mysql, php ともに utf8 で col は日本語のマルチバイト文字列 (varchar) で
mb_check_encoding で true です。

teraterm から select した場合はマッチするのですが、php からの場合には
なぜかマッチせず、結果がnullになってしまいます。

どなたか思い当たらないでしょうか。

13 :NAME IS NULL:2008/06/14(土) 09:33:23 ID:???
これを実行してなかったという落ちじゃないよね?
http://jp.php.net/manual/ja/function.mysql-set-charset.php

14 :NAME IS NULL:2008/06/15(日) 13:40:20 ID:???
テーブルのカラムの位置ってselectしたりする際に何か影響があったりしますか?
例えば、よく参照するカラムは上のほうに配置した方が早いなど。

15 :NAME IS NULL:2008/06/15(日) 14:08:11 ID:???
カラムが行単位で繋がってると思う?

16 :NAME IS NULL:2008/06/15(日) 15:03:08 ID:???
SQL ServerやOracleでは、NULLになる可能性が高いカラムを後ろにすると、
1ブロックに格納できる行が増える場合があるけど、MySQLは知らん。

17 :NAME IS NULL:2008/06/15(日) 18:45:54 ID:???
このおばちゃんは元気でやってるの?
この画像がニュースで流れて以来、情報が無いのですが
ちゃんと避難できたでしょうか?
http://2chart.fc2web.com/2chart/obachannnigeteeeeeeeee.html

18 :NAME IS NULL:2008/06/17(火) 12:33:32 ID:???
すみませんが、質問です。

MySQL5.0でクエリキャッシュを無効にするには、どうしたらよいでしょうか?
巨大データのテーブルで検証したいことがあるのですが、キャッシュが効いて
しまって2回目以降のテストができないのです。
mysqldを再起動しても、どうもキャッシュは無効にならないようです。

環境はCentOS release 5 (Final)、64BITです。

19 :18:2008/06/17(火) 12:34:04 ID:???
ageときます。

20 :NAME IS NULL:2008/06/17(火) 18:33:11 ID:???
>>18
select SQL_NO_CACHE field from table ...;
select 文はいじりたくないなら
set query_cache_size = 0;

21 :18:2008/06/17(火) 21:18:35 ID:???
>>20
ありがとうございます。
5.1のマニュアルを斜め読みしたのですが、基本的に同じなのですね。
http://dev.mysql.com/doc/refman/5.1/ja/query-cache-configuration.html

22 :NAME IS NULL:2008/06/18(水) 05:36:21 ID:UtvFT/hw
cronで1日一回メンテナンスしているのですが
バックアップログを見ると、あるテーブルが、毎日修復されています
myisamchk -r
で修復は成功するのに、次の日になるとまた壊れているといった状態です
myisamchk -o
で直してみましたが、やはり次の日には壊れていました
インデックスとデータファイルの間に齟齬があるのだと思いますが
どういう処理をしたらいいでしょうか?

23 :NAME IS NULL:2008/06/18(水) 07:30:03 ID:???
>>22
もうだめぽ。Oracleに乗り換えるしかないよ。

24 :NAME IS NULL:2008/06/18(水) 09:30:28 ID:???
的外れだったら申し訳ないんですが、質問失礼します。

現在、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のエラーなのでしょうか・・・


25 :NAME IS NULL:2008/06/18(水) 09:47:44 ID:???
>>24
もうだめぽ。Oracleに乗り換えるしかないよ。

26 :NAME IS NULL:2008/06/18(水) 14:40:00 ID:???
>>22
MyISAMをやめる

27 :22:2008/06/19(木) 04:07:08 ID:???
myisamchkでなく、
repair tableを使うと壊れなくなりました
マニュアルには両者はほとんど同じだと書いてありますが
微妙に違うみたいですね

28 :NAME IS NULL:2008/06/19(木) 20:28:04 ID:???
>>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も見つけてしまって、どれが正解かさっぱりワカンネ

30 :NAME IS NULL:2008/06/19(木) 23:34:35 ID:???
>>29だけど。

バイナリだと、
http://dev.mysql.com/downloads/mysql/5.0.html#linux-rhel5-x86-32bit-rpmsから

SQLノード
MySQL Server
MySQL Client

データノード
Cluster Storage Engine

マネージメントノード
ClusterStorageEngineManagement
ClusterStorageEngineBasicTools
ClusterStorageEngineExtraTools

をダウソしてインスコすりゃいいんだけど、それぞれに対応する
tar玉がどれになるのかが把握できん…

31 :NAME IS NULL:2008/06/20(金) 06:21:57 ID:bhQIeTGR
mysqldを止めずにmyisamのバックアップをするにはどうするのがいいですか?
今はmysqldを止めて、関連ファイルをそのままコピーしています

32 :NAME IS NULL:2008/06/20(金) 07:09:35 ID:???
mysqldump --lock-all-tables --hex-blob --result-file=name-of-backup.mysql -B specific-dbname
全部バックアップなら -B 以下は不要。

33 :NAME IS NULL:2008/06/20(金) 14:34:55 ID:???
だ〜っ!
遂に、mysql.bkbits.net のでソースコード公開停止か?
今までブックマークしてた各ページにアクセスしたら、どこも404 NotFoundになっちった。

34 :NAME IS NULL:2008/06/20(金) 15:10:44 ID:lE+0a2Do
MySQL終了のお知らせキタコレ

35 :NAME IS NULL:2008/06/20(金) 23:07:16 ID:???
MySQL4.0.24のテーブル結合なんですが、同じ列名が両テーブルに存在するときはどのように
結合すればいいのでしょうか?
一応多重結合するのでTEMPORARYテーブルを作成しようとしてるのですが
Duplicate column〜といわれてしまいます。

36 :NAME IS NULL:2008/06/20(金) 23:12:47 ID:???
tbl1.col=tbl2.col・・・

37 :NAME IS NULL:2008/06/20(金) 23:17:46 ID:???
>>36
イコールの関係ではない列の列名が同じなのだが。。。
そういう場合は不可能でしょうか?
SQLiteだったら、テーブル名.カラム名と結合された列名が作成されてたのですが、MySQLではそういう出力方法は不可能なのでしょうか?

38 :NAME IS NULL:2008/06/20(金) 23:35:19 ID:???
。。。←この読点は何?日本語不自由なの?

39 :NAME IS NULL:2008/06/21(土) 00:01:28 ID:???
>>38
そりゃ句点だ。

40 :NAME IS NULL:2008/06/21(土) 00:13:48 ID:???
>>37
select tbl1.col,tbl2.col・・・ で普通に取れるけど・・・。
又は、tbl1.col as some1,tbl2.col as some2 みたいにするか。
この方法だと後ろで、where,having,group by,order byとかも自由自在。
(たしかにselect *で取ると、結果一覧には、同名のカラムで出力されるけど。)

41 :NAME IS NULL:2008/06/21(土) 05:59:42 ID:???
38 :NAME IS NULL:2008/06/20(金) 23:35:19 ID:???
。。。←この読点は何?日本語不自由なの?

39 :NAME IS NULL:2008/06/21(土) 00:01:28 ID:???
>>38
そりゃ句点だ。

42 :NAME IS NULL:2008/06/21(土) 06:34:28 ID:???
>>33-34
Bazaar に移ったってアナウンスされてるでしょ
過去のリリースのソースコードも全て移行したらしいよ
これでリポジトリ管理も完全にオープンソースになったんだとか

http://blogs.mysql.com/kaj/2008/06/19/version-control-thanks-bitkeeper-welcome-bazaar/

43 :NAME IS NULL:2008/06/21(土) 07:35:05 ID:???
>>32
ありがとうございました

44 :NAME IS NULL:2008/06/21(土) 09:10:40 ID:pOUskDmd
MyISAMで作ったテーブルって、1000万行(3GB以上)になると、
頻繁に壊れますね。REPAIRで修復していたのですが、
ついにその修復も不能のなってしまって、相当落ち込みました。

これからは、すべてのテーブルをInnodbにするつもりなのですが、
Innodbでも修復不能になった経験お持ちの方はいらっしゃいますか?
ぜひ、経験談をお聞きしたいです。

45 :NAME IS NULL:2008/06/21(土) 12:20:42 ID:???
修復不可能ってマジっすか!?
怖いなぁ・・・・

46 :NAME IS NULL:2008/06/22(日) 06:01:56 ID:???
>>42
おお、サンクス。
そうなのか、知らなかったぜ。

しかし新しいレポをちょっと見に行ったけど、今までみたいにバージョンリリースごとにあった
Tagで検索したり指定したりするやり方が出来るのかようわからん。(全部リビジョン番号みたいのになってる)

それに5.1のディレクトリがバラバラになってて、どれ取って来ていいかわからん。
(前もいくつかに分かれてたけど、一応メインと思われる、mysql-5.1/ってのがあったと思うんだが)

47 :NAME IS NULL:2008/06/22(日) 12:33:04 ID:???
>>29-30にしても>>46にしても



  M  y  S  Q  L  の  リ  リ  ー  ス  の  分  か  り  に  く  さ  は  異  常



 

48 :NAME IS NULL:2008/06/22(日) 15:07:39 ID:???
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は加算されっぱなしだよね?
消した分だけ減らしたいんだけどいい方法ない?


50 :NAME IS NULL:2008/06/22(日) 22:36:23 ID:???
>>48
ソース見失ってしまったが
たしか消しちゃだめのはず


51 :NAME IS NULL:2008/06/22(日) 23:46:12 ID:???
>>48
ibdataファイルには、テーブルの実データだけでなく、ほかに色々な情報が入ってたはずなんで、消したらダメ。
どうしても気になるって言うんなら、一旦現状の全データをdumpしつつ、mysqldを停止して
my.cnf(my.ini)でibddataのファイルサイズを小さく設定して(でもゼロには出来なかったはず。最低いくらだったか忘れた)
再度全テーブルを構築し直す、ってくらいしかないんじゃないか。
(それでも多分、小さくなったibdataファイルに、いくらかの読み書きは発生すると思うけど)

>>49
これも上のと似たような話になるけど、deleteした後必要な部分だけdump→truncateでtable再作成
→(auto_incrementカラム以外の)データ再インポート
ってやりかたなら出来なくもないけど、メンドクセすぎか。(人間的にも、マシン、ソフト的にも)

それにこのやり方だと、消したところのレコード番が飛び飛びになってる行は、その値が変わってしまう。
その消した(飛び飛びになった)行番を再利用したい ってことなら、それはauto_incrementの特性上不可能。

52 :NAME IS NULL:2008/06/22(日) 23:59:33 ID:???
Falconに期待

53 :NAME IS NULL:2008/06/23(月) 23:55:55 ID:???
最近のリリースではMyISAMじゃなくてInnoDBがデフォルトになってるのね。
それだけ、(多機能だっていうだけじゃなくて)スピード面でもInnoDBが進歩したってこと?


54 :NAME IS NULL:2008/06/24(火) 00:12:48 ID:???
innodbって普通のファイルコピーでバックアップできないのが嫌
使ってる人バックアップツール買ってんの?

55 :NAME IS NULL:2008/06/24(火) 01:30:13 ID:???
> innodbって普通のファイルコピーでバックアップできないのが嫌
> 使ってる人バックアップツール買ってんの?

レプリケーションすればいいだろ。

56 :NAME IS NULL:2008/06/26(木) 19:15:06 ID:???
mysqlのDNS処理部分に詳しい人情報きぼんぬです。

Linuxサーバにipalias で eth0に複数IP割り当てて
全部逆引きで hoge.example.jp と設定しました。
nslookupなどで逆引きチェックなどを行っても設定した
全IPで正常に逆引きが行える。

しかし、どうしても mysqlの認証で user@hoge.example.jp
というユーザの認証がクリアできません。
Host '(IPアドレス)' is not allowed to connect to this MySQL server
とか表示されちゃう。
そのmysqlサーバからnslookupなどを行ってももちろん該当IPの
逆引きはできてる。でもなぜかmysqlサーバだけちゃんと名前解決しようと
しない。
ためしにuser@(IPアドレス)ってやったら問題なくログインできる。
とりあえず名前解決の問題ということは断言できる状態です。

あとは
/etc/hostsをいじったり
/etc/resolv.conf を何回もチェックしたり、別DNSに変えたり
繰り返してますがかなりはまってます。

どなたかヘルプミー


57 :NAME IS NULL:2008/06/26(木) 21:15:48 ID:???
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が出ます

59 :NAME IS NULL:2008/06/28(土) 06:29:52 ID:???
>>56
ちゃんと hoge.example.jp が正引きできてる?
あとは、skip-name-resolve で mysqld が動いているというオチとか…。

60 :NAME IS NULL:2008/06/28(土) 14:00:51 ID:???
◆◆◆◆◆毎日新聞社による日本人女性への誹謗中傷◆◆◆◆◆

・母親は受験勉強をする息子の学力向上のためにフェラチオをする
・日本人女性の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

61 :NAME IS NULL:2008/07/02(水) 11:42:26 ID:???
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文で検索出来ません。
どこの設定がおかしいのでしょうか?

64 :NAME IS NULL:2008/07/02(水) 18:06:29 ID:???
>>63
テーブル名になにか記号入ってない?
-(ハイフン)とか

65 :NAME IS NULL:2008/07/02(水) 18:14:56 ID:???
>>62
>>62
あてずっぽだけどphpMyAdminの認証方法はどうしてますか?
例えばcookieにしてたら、それが途切れてログインページにとばされるとか。

通常の使用でも一定時間操作しないでいると、クッキーの有効期限がきれて
ログインページにとばされたと記憶

66 :63:2008/07/02(水) 18:22:27 ID:AFk/IFVn
>>64
ご助言ありがとうございます。
小文字の英字3文字です。『day』みたいな感じです。


67 :NAME IS NULL:2008/07/02(水) 19:08:33 ID:???
>>65
返信ありがとうございます
ずばりそれだと思います!phpmyadminの.iniも
cookieの設定にしてあります

MYSQLにてショッピングカートを使っていたんですが
そちらの管理画面にもログインできなかったので一度
HDDに残っていたクッキーを全て削除してから
不具合が生じてきてしまっている状態です
今もサイトで調べているんですが全く分からなくて
解決策などあれば何卒お願い致します


68 :NAME IS NULL:2008/07/02(水) 19:55:21 ID:???
>>61
真と偽

69 :NAME IS NULL:2008/07/02(水) 21:45:45 ID:???
ワロタ。プログラム未経験者だな

70 :NAME IS NULL:2008/07/03(木) 00:19:56 ID:???
>>66
「day」みたいな…じゃなくて、本当のテーブル名を書くのが吉。たぶん予約語。

71 :NAME IS NULL:2008/07/03(木) 21:02:20 ID:???
MySQLからSunと合体したっていうメールが来た。ビックラこいた。

72 :NAME IS NULL:2008/07/03(木) 21:22:44 ID:???
GRANT ALL PRIVILEGES ON monmon.* TO 'user1'@'192.%' IDENTIFIED BY 'hogehoge';

と設定したらこれは192.0.0.0/255.0.0.0からアクセスOKということですよね?

73 :NAME IS NULL:2008/07/04(金) 03:05:20 ID:???
質問です。

1週間ほど前からサーバーの反応が異常に遅くなり、2日ほど原因を調べていたところ
MySQLへのログインに時間がかかっているということまでわかったのですが、
どうすればよいかわかりません。

もうひとつ、sockstatすると外部からmysqlのポートにアクセスしている形跡があります

おたすけを。。

74 :NAME IS NULL:2008/07/04(金) 06:23:37 ID:???
開いたままのプロセスが沢山溜まっているとか
/usr/bin/mysqladmin -u root -p processlist

原因は、バグとか DoS とか、さまざま

>もうひとつ、sockstatすると外部からmysqlのポートにアクセスしている形跡があります

そもそも、どうして「外部」に向けてmysqld のポートを開けてあるんだろう。
(「外部」って、www サーバとかじゃないよね?)

75 :NAME IS NULL:2008/07/04(金) 13:12:33 ID:???
>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

76 :NAME IS NULL:2008/07/04(金) 13:53:00 ID:???
以前だろうが何だろうが、穴を開けること自体が間違っている。
平文パスワード垂れ流しですよ? API化するか、せめてVPNに乗せるべきだ。

77 :NAME IS NULL:2008/07/04(金) 13:55:50 ID:???
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は、そのまま残っているようですが、
これを別の同名フォルダに入れてしまえば、同じようなデータベースが作られるのでしょうか?
破損が怖くて試せません。

どうか詳しい方、お力を貸して下さい。

79 :NAME IS NULL:2008/07/04(金) 15:36:16 ID:???
show variables like 'sql_big_selects';

が OFF になっているのかも。

>show (global) variables like 'max_join_size';
>で見ても 4294967295 がセットされてます。

それは「adjusted」された後の値だから当然。

80 :NAME IS NULL:2008/07/04(金) 16:09:30 ID:???
>>75
localhost のみで良いなら

[mysqld]
bind-address = 127.0.0.1
port = 3306
socket = /tmp/mysql.sock

だな。他にもルータで遮断するとか OS のパケットフィルタ使うとかあるでしょ。

81 :NAME IS NULL:2008/07/04(金) 16:36:21 ID:???
> サルベージしたところ、
> \xampp\mysql\dataは、そのまま残っているようですが、
> これを別の同名フォルダに入れてしまえば、同じようなデータベースが作られるのでしょうか?
> 破損が怖くて試せません。

そのディレクトリを DVD-R とかに焼くといいよ。
そしたら気が済むまでチェックできるでしょ!

82 :NAME IS NULL:2008/07/04(金) 17:17:14 ID:???
>>79
sql_big_selects は ON になっていました。

また、起動オプションや my.cnf 上でmax_join_size の値を他の値(100000 とか)に
指定して起動してもログに全く同じエラーが出力されますが、
show variable で見ると、値自体は指定したもの(100000 とか)になっています。


83 :NAME IS NULL:2008/07/04(金) 17:56:01 ID:???
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%);

84 :NAME IS NULL:2008/07/04(金) 18:50:27 ID:???
>>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のプロバからは書き込み規制中なんで、携帯からカキコ。
改行が変になっちった。

86 :NAME IS NULL:2008/07/04(金) 19:00:01 ID:???
>>78
InnoDBならダウト

87 :NAME IS NULL:2008/07/04(金) 19:37:43 ID:???
>>83 >以下のようにデータは取れるのですが

その select 文や where 句、通るの ?
t_tag, str_name, str_name_kana とか、謎のフィールドもあるし…

88 :NAME IS NULL:2008/07/04(金) 21:12:25 ID:???
>>76

以後気をつけます!

>>80

ありがとうございます!


89 :NAME IS NULL:2008/07/04(金) 23:50:26 ID:???
>>73
--skip-name-resolve

90 :NAME IS NULL:2008/07/05(土) 10:38:14 ID:???


91 :NAME IS NULL:2008/07/05(土) 13:56:48 ID:???
5.1の全文検索って全角だろうが頭についてる記号無視するようになったのな
固有名詞だと頭が記号のやつ結構あるのでこれ仕様だったら安定版出ても5.0からのりかえられない
せっかく速かったのになあ

92 :83:2008/07/05(土) 14:19:00 ID:???
>>87
すみません。
間違えました
(str like %hoge% || name like %hoge% || name_kana like %hoge%);
でした。

別テーブルにカウント数を保存しておくくらいしか手はないでしょうか?

93 :NAME IS NULL:2008/07/05(土) 14:54:24 ID:???
頻繁にアクセスするなら memcached とかでキャッシュすればよくね。

94 :NAME IS NULL:2008/07/05(土) 15:33:43 ID:???
memcachedは不安定という印象しか無いのは某サイトのせい

95 :NAME IS NULL:2008/07/05(土) 15:51:30 ID:???
某サイトってどこ?

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)では出来ないものでしょうか?


98 :NAME IS NULL:2008/07/06(日) 09:10:15 ID:???
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ではなくても大丈夫です


103 :NAME IS NULL:2008/07/07(月) 15:58:45 ID:???
2つのテーブルからマッチする値をとる際、1テーブル(one)のidの値とマッチしないid番号のみ2テーブル(two)からマッチするかチェックさせたいのですがどのようにできるでしょうか?

select * from one where id like '%hoge%'
これでマッチしない値
select * from one_option sub_id like '%hoge%'

できれば1文で結合したいです。
お願いいたします。

104 :NAME IS NULL:2008/07/07(月) 16:32:26 ID:???
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

のエラーが出ます。

なにかクライアント側で設定がたりないのでしょうか?

106 :NAME IS NULL:2008/07/08(火) 21:31:35 ID:???
なぜかrootの権限消失してしまって、何度インスコしなおしても戻らん。
OSから入れなおしか?


107 :NAME IS NULL:2008/07/08(火) 21:36:01 ID:???
何言っているの?定義ファイルが壊れているだけだろ。何回インストールしてもだめだろ。

108 :NAME IS NULL:2008/07/08(火) 21:56:47 ID:OZY8zwK5
linux上で使っているけど各データのサイズはどうやって確認出来る?
っていうかどこに格納されてる?ファイルシステム自体が違うのかな?

/var/lib/mysql/データベース名/テーブル名.frm
は行数違っても全部8.5Kって表示されてる(ls -lh)

だれか教えてくれ

109 :NAME IS NULL:2008/07/08(火) 22:04:35 ID:???
色々と意味不明。エスパー頼む

110 :NAME IS NULL:2008/07/08(火) 22:06:23 ID:???
>>108
du

111 :108:2008/07/08(火) 22:09:25 ID:OZY8zwK5
あーすまん。適当に書きすぎた

初歩の初歩なのだが
linux上でmysqlにアクセスしていろいろとデータ追加したりしている

で、mysql上で追加したり削除したりすることがディスクにどれだけ
負担になっているか調べたいのだが、どこにデータが格納されているのか
よくわからん。

/var/lib/mysql/データベース名/ 以下に作ったテーブル名.frm
っていうファイルがあるが、ls -lhでそれらのサイズを見ても
全部8.5Kだったから、たぶんデータそのものじゃない(データのサイズは
明らかに違うはず)

っつーことで、どこを見たらそういう情報見れるかな?っていう
質問です。わかりづらくてすまん

112 :NAME IS NULL:2008/07/09(水) 00:30:27 ID:???
>>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データベースは、各々、別のデータベースに
分けた方が良いのでしょうか。
それとも一つのデータベースに、両方格納しても問題ないのでしょうか。

よろしくお願いします。



115 :NAME IS NULL:2008/07/09(水) 17:10:18 ID:???
>>114
判断に必要な情報が足りていない。

【クライアントが入力したデータ】とやらの性質が分からない限りなんともいえない。

116 :108:2008/07/09(水) 17:32:35 ID:1CS4UrgO
> 112
教えてくれてありがとう

.MYD と.MVIは/var/lib/mysql/mysql以下にたくさんあった。
でもデフォルトでinnodb使うようにしてる。トランザクション処理
使いたいから

っでたしかにidbdata1っていうファイルが、それらしき大きさだった。
たぶん実体はこれだろう。っでも、なんかls とかduとかでファイルサイズ
を確認しようとしても、そこへの反映が遅い。っで、わすれたころに
30MB増えたりして、わかりづらい。。。

117 :NAME IS NULL:2008/07/09(水) 18:06:12 ID:???
パフォーマンス考えれば、ちまちま容量増やすわけ無いじゃんw

118 :NAME IS NULL:2008/07/09(水) 18:44:53 ID:???
>>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
>>1

> http://kakaku.com/specsearch/0075/

そろそろ削除でどうだ?

122 :NAME IS NULL:2008/07/10(木) 14:29:03 ID:VzcOpQyE
>>1

> http://makimo.to/cgi-bin/search/search.cgi?D=db&q=MySQL&sf=0&link2ch=on

404

123 :NAME IS NULL:2008/07/11(金) 01:14:23 ID:???
>>120
すべてについて常識の範囲内で想定するとしてだ。
単純に、コスト(金と手間)とセキュリティリスクの見合いになると思うなぁ。

最大でも数万レコード程度にしかならず、
かつ何らかの操作ミス等で漏洩しても許容できるような内容なら
統合しといたほうがいいと思う。

このレベルを超えるなら、こんな所で聞いてないで信頼できるベンダーに外注しなさい。

124 :120:2008/07/11(金) 13:09:27 ID:TCuAt9gA
>>123
レスありがとうございます

125 :NAME IS NULL:2008/07/11(金) 17:07:46 ID:???
>>120
顧客の個人情報が含むなら、万全の対策をすべきだな。
漏出すると会社が潰れかねない。

例えば、等身大ラブドール販売会社ドールスコートはwinnyで顧客情報を流出させた。
ttp://sakura02.bbspink.com/test/read.cgi/adultgoods/1142163387/26-125

それが致命傷になり現在ではこんなことになっている。
ttp://doll.surpara.com/

126 :NAME IS NULL:2008/07/13(日) 14:37:50 ID:???
5.1.26出たけどまだRCなのか
最初に出すって言ってからもうすぐ1年だよ
いつGAになるんだ

127 :NAME IS NULL:2008/07/13(日) 15:05:50 ID:nXfDUouf
インデックスの名前空間ってテーブル名と一緒だっけ?テーブル毎?

128 :NAME IS NULL:2008/07/15(火) 14:13:35 ID:???
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くらいです。

アドバイスを頂けると助かります。よろしくお願いします。

130 :NAME IS NULL:2008/07/16(水) 19:32:49 ID:???
ごくごく単純に言って、
マスタには書き込んだ分の読み取りが発生するので、読み取り量が1.5倍になる。読み取りを均等に分散させるとして、1:2のまま。
スレーブには書き込んだ分の書き込みが発生するので、読み取りを均等に分散させるとして、1:1になる。

ところで、そもそも君は何故レプリケーションする必要に迫られているか?

パフォーマンスの問題を解決したいなら、オーバーヘッド分を犠牲にしてでもレプリケーションするべきだろう。
フェイルオーバーしたいなら、オーバーヘッド分を犠牲にしてでもレプリケーションするべきだろう。

つまり君には、レプリケーションのオーバーヘッドに関わらず、
もはやレプリケーションする道しか残されていないのです。

ただ、単純なレプリケーションでは更新の分散はできないので、1:2なんつー状況で打てる手は少ないと思う。
マスタの分割をセットで考えたほうがいいだろう。

131 :NAME IS NULL:2008/07/16(水) 20:27:36 ID:???
5.1はいつGAになるんですか?
Sunに買収されたんだしロードマップくらい用意して欲しいです。

そろそろ出るって言われ続けて相当引っ張ったWindows NT 5.0
(Windows 2000)を思い出します。10年位前の話。

132 :NAME IS NULL:2008/07/16(水) 22:16:10 ID:???
春のカンファレンスで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の走査対象が増えるからだと思います。


135 :NAME IS NULL:2008/07/18(金) 00:35:23 ID:???
>>131
ttp://lists.mysql.com/announce/537
MySQL 5.1.26-rc is slated to be the last release candidate before we
declare MySQL 5.1 as "production ready" (GA).

…だそうです。

その後のお願いメール。
http://lists.mysql.com/announce/539

136 :NAME IS NULL:2008/07/18(金) 00:39:39 ID:???
>>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を作成しましたが、やはり結果は同じでした。
どなたか助けてください。

139 :NAME IS NULL:2008/07/19(土) 16:44:17 ID:???
reboot

140 :NAME IS NULL:2008/07/20(日) 10:14:01 ID:???
>>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`)
等も試してみたのですが、構文エラーや思った結果が得られず行き詰まっております。
どうかお力添え頂けないでしょうか。
宜しくお願い致します。

142 :NAME IS NULL:2008/07/22(火) 02:43:47 ID:???
副問い合わせの基本パターンだ。

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
レス有り難う御座います。
早速試しながら調べてみます。

144 :NAME IS NULL:2008/07/22(火) 09:10:15 ID:???
>>141
>としてみたのですが、これではMAX(`i_img_disp`)時の`i_img_no`を取得してくれず

それより、その select は普通のSQLではエラーになるので、御注意。
普通の SQL では、group by があるときは、group by の対象フィールドか、集計関数の結果しか select できないので。

145 :NAME IS NULL:2008/07/22(火) 18:08:14 ID:???
23k程度のファイルの内容(文字列)をTEXT型のカラムに保存しようとしています。(UTF-8)
ですが、INSERTすると途中までしか入りません。
UTF-8なので3byteになる文字があるとはいえ、
TEXTの上限である約65kに収まらない理由がピンと来ません。
厳密には内容によって変わると思いますが
23kのファイルがTEXT型には収まらない可能性はある、といった経験則のある方いらっしゃいますか?

また、収まらないのであればmediumtextかと思ってるのですが、上限がかなり大きいです。
MySQLでデータ型を決めるとき、大容量のデータ型のカラムを確保しておくだけでロスが生じる、
ということはないと考えて大丈夫でしょうか?
プログラムでINTかLONGかで確保するメモリが違うというような意味合いなんですが・・・

146 :NAME IS NULL:2008/07/22(火) 20:16:14 ID:???
んとね、MySQLでは照合順序がUTF8のときは、全ての文字が3byteになるの。
よって、入らないというのが正解で、正常す。

大容量のデータ型だと、確かInnoDBでは超無駄になったと思う。

フルテキストインデックス使わないならTEXT型のメリットって知れてるし、
バイナリとして格納しちゃえば?

147 :NAME IS NULL:2008/07/22(火) 20:54:20 ID:???
>>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,,,,としたいのですが、特定のフィールドのみにテキストからデータを挿入するやり方がわからずに質問させていただきました

150 :NAME IS NULL:2008/07/23(水) 11:24:09 ID:???


テキストを整形して
新しいフィールドだけをUPDATEするSQLの塊を作って流し込めばいいじゃない。
もしくは、運用中でなければ
別テーブルに全部流し込んでおいて、
現行テーブルを削除→別テーブルをリネームで、そっくり入れ換えるとか。

151 :NAME IS NULL:2008/07/23(水) 11:29:41 ID:???
??
そのフィールドに入る値は、全レコードで共通なの?
レコードごとに違うなら、きちんとキーを見て update するなりしないと、無茶苦茶になるのでは…

152 :NAME IS NULL:2008/07/23(水) 12:00:32 ID:???
レスありがとうございます。恥ずかしながらSQLはほとんど初心者で、今まではJavaでデータベースをいじってました。
今回数百万以上のデータをプリペアステートメントで流し込もうとしたら、恒例の
OUT OF MEMORY
解放など、コードを書き換えるより直接データを入れようと思い・・・
データはテキストを順番に上から入れていけば既存データと一致します。
>>150
テーブルを結合させると言う感じでしょうか?

やっぱりSQLも本かって学ばないとダメですね・・・

153 :NAME IS NULL:2008/07/23(水) 12:16:19 ID:???
>データはテキストを順番に上から入れていけば既存データと一致します。

まず、その「順番に」という処が、大いに問題でね…
データを入れた「順番」が、(auto_increment とか他の何かの)キーで残っているならいいが、
そうでないなら、その「順番」自体は、データベース上では分からない、という事が分かってるか ?

154 :NAME IS NULL:2008/07/23(水) 13:38:00 ID:???
Excelと混同してるな。
MySQLにおいてすべてのデータは、順不同で格納されている。
ORDER BYを指定して抽出しない限り、結果の順序は保証されない。
格納順に抽出できているように見えるのは、偶然に過ぎない。
よって、上から順番に入れるという処理は、順不同に入れるのと同義であります。

155 :NAME IS NULL:2008/07/23(水) 13:39:50 ID:???
結合じゃなくて置き換え。
とりあえずphpMyAdminでも使ってろ。

156 :NAME IS NULL:2008/07/24(木) 09:22:12 ID:???
数百万レコードですか…コワ

157 :NAME IS NULL:2008/07/24(木) 09:37:38 ID:???
400万レコード突っ込んでるけど、怖くてできん。

158 :NAME IS NULL:2008/07/24(木) 18:51:38 ID:BZXqjCKH
同じスキーマのテーブル間で差分を取るツールってありませんか?
できれば異なるデータベースにある同じスキーマのテーブル間で取りたいです.

レプリケーションが切れたまま動き続けてバイナリログも消えてしまい,
う〜む,どうしたものか,と.

159 :NAME IS NULL:2008/07/24(木) 23:39:19 ID:???
>>158
mysqldump して diff

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 って名前のテーブル作って,
ことごとくアクセスに失敗するので一晩悩んだ.
皆さんそういう経験ありませんか?



162 :NAME IS NULL:2008/07/25(金) 08:44:12 ID:???
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キー連打とかしても戻ってきません

164 :NAME IS NULL:2008/07/25(金) 13:55:32 ID:???
&

165 :163:2008/07/25(金) 14:05:17 ID:fXx7t9ol
>>164
引数に追加したら動きました。
すごい基本的なことなのに教えて下さってありがとうございます。

166 :NAME IS NULL:2008/07/25(金) 19:41:50 ID:Pb40YC/J
クラウド向け軽量MySQLプロジェクト「Drizzle」がスタート
http://opentechpress.jp/opensource/opensource/article.pl?sid=08/07/25/0427259

167 :NAME IS NULL:2008/07/26(土) 10:53:55 ID:???
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のツールとかが同梱されているかどうかってことじゃね?
あと,開発用のライブラリとかヘッダファイル群とかも.

169 :NAME IS NULL:2008/07/26(土) 19:05:31 ID:???
ちょっと教えてください。

ODBCドライバーをイントールしたいのですが
http://dev.mysql.com/downloads/connector/odbc/5.1.html#win32
ここには「download」が無いのですが
どこからダウンロードするんでしょうか?


170 :NAME IS NULL:2008/07/26(土) 19:17:31 ID:???
ごめんなさい。できました。

171 :NAME IS NULL:2008/07/26(土) 23:33:59 ID:???
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:???



175 :NAME IS NULL:2008/07/27(日) 00:57:42 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すると勝手に「\」が
混入したり、文字化けしちゃうのですが、何とかなりませんか?
表示は正しいのですが、データには「\」が混入しているのか、
検索がうまくいかないなども。



177 :NAME IS NULL:2008/07/27(日) 01:50:53 ID:???
最新版にしたほうがいいんじゃ

178 :NAME IS NULL:2008/07/28(月) 01:10:12 ID:???
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に流しています。

180 :NAME IS NULL:2008/07/28(月) 18:27:44 ID:???
打つときじゃねーよ
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ですね……

182 :NAME IS NULL:2008/07/28(月) 19:22:58 ID:???
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
照合順序の変更が反映されるまで時間かかりすぎだろうんこ野郎め

185 :NAME IS NULL:2008/07/29(火) 21:14:12 ID:???
DR:BD って何ですか

186 :185:2008/07/29(火) 21:44:16 ID:???
http://www.drbd.org/
に説明がありました。ブロックデバイスをネットワークごしにコピーするみたいですね。

187 :NAME IS NULL:2008/07/29(火) 22:04:22 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 文の順序は
一定ですか?それとも順序については異なる可能性がありますか?

190 :NAME IS NULL:2008/07/30(水) 19:57:56 ID:???
異なる可能性があります。

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
二つのスキーマは同じでレコードがビミョーに違うテーブルで
構成されているデータベース同士の差分を取りたいんだ。

193 :NAME IS NULL:2008/07/30(水) 21:03:43 ID:???
>>188
レプリケーションか、定期的に mysqldump とリストア

194 :NAME IS NULL:2008/07/30(水) 23:20:46 ID:???
ダウンロードページにいってみたんだけど
どれインスコすりゃいいの?

195 :NAME IS NULL:2008/07/30(水) 23:32:17 ID:3/KaeSae
自分の環境に合わせて好きなンインスコすればイイ。んなことも判らんのか?

196 :NAME IS NULL:2008/07/31(木) 09:17:05 ID:???
>>191
1行1要素になるように整形してソートすればdiff使えるよ。

197 :NAME IS NULL:2008/07/31(木) 10:50:13 ID:???
時間のかかるSELECTのボトルネックはexplainで想像できるけど
updateとdeleteのボトルネックは何で計測すればいい?

198 :NAME IS NULL:2008/07/31(木) 11:22:26 ID:???
DBサーバから受け取る検索結果のバイト列を、圧縮して受けたいんだが、定石はありますか?
compress()/uncompress() 関数はあるが、これは mysql 内部。やりたい事は
  select long_long_string from a_table;
とかやったquery結果を圧縮して送出し、それを別のサーバで受けて、展開して使う。
query 時間より結果の転送時間の方が長いという洒落にならない状態なので、何とかしたい。
サーバ間は 1GB bps イーサネット。

199 :NAME IS NULL:2008/07/31(木) 11:36:33 ID:???
>>198
長い文字列がひとつあるだけで結果セットの行数は少ないんなら、圧縮したのを格納すりゃ
いいんじゃない? ディスクの節約にもなるよ

200 :NAME IS NULL:2008/07/31(木) 12:36:43 ID:8xEIvs4r
my.cnf での指定とコマンドラインオプションへの指定では
アンダースコア _ とハイフン - が違うのでしょうか?

たとえば --hoge-hoge=10 というオプションの指定を my.cnf で
やりたい時には hoge_hoge = 10 とすべきなのでしょうか?

このあたりの規則について
マニュアルのどこに書いてあるのかが見つけられません…

201 :NAME IS NULL:2008/07/31(木) 13:06:28 ID:???
>>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サーバとの通信線自体を圧縮する方法がないものかと…。
そうすれば、今使っている諸ルーチンは一切書き替えず、データベースもそのままで使えそうなので。

203 :NAME IS NULL:2008/07/31(木) 14:18:07 ID:???
>>198
いちおう、圧縮プロトコルがあります。
http://www.mysqlperformanceblog.com/2007/12/20/large-result-sets-vs-compression-protocol/

あとはSSHで圧縮かけてフォワーディングするとか。


204 :198:2008/07/31(木) 14:37:03 ID:???
おおお、早速有難うございます。php ではないけど、関連で探して早速テストしています。
教えて頂いたページでは giga-bit ether だと圧縮のオーバヘッドの方が上回るとあるけど、
うちのはCPUが暇してるせいか、giga-bit でも少し速くなっている気が… w
有難うございました。

205 :NAME IS NULL:2008/08/01(金) 03:18:33 ID:???
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
データベースのハンドリングって何ですか?

209 :NAME IS NULL:2008/08/03(日) 21:33:49 ID:???
>>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つのフィールドを除いてすべてが複合キーってのは変ですか?

212 :NAME IS NULL:2008/08/04(月) 15:27:40 ID:???
実データでやってみないとわからないが、全然パフォーマンスが出ない場合もあるだろう。

おそらくあらゆる引き方でインデックスが使われるように
あらゆる複合インデックスを張っておこうという魂胆だろうが、
それでうまくいく場合もあれば、行かない場合もある。
この場合は12通りのインデックスになる。

しかし、無闇にインデックスを増やすことで
MySQLが使用するインデックスの決定に失敗して効率が落ちる場合もあるし、
分散が少ないフィールドは変にインデックスを使わないほうが速い場合もある。
あるいはテンポラリを避けるため、問い合わせを複数に分けなければならないかも知れない。
書き込みパフォーマンスも悪化する。

一つ一つのクエリについて、論理的に考え、テストしながら張り方を考えるべきです。
考え方が逆なんだ。

213 :211:2008/08/04(月) 16:12:48 ID:???
>>212
どうもありがとうございます。

「あらゆる引き方でインデックスが使われるように」というより、値段以外のフィールドの
組み合わせは一意じゃなきゃいけないので、複合プライマリーキーにしようと思ったんですけど、
UNIQUEインデックスとかの方がいいんですか?

検索は銘柄ID・時刻の組み合わせ+フェーズ値が最大、というクエリーがメインだと思います。
通常は最新のデータしか興味がないので。

214 :NAME IS NULL:2008/08/05(火) 16:18:21 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に値を入れても何も表示されません。
どうかご教授ください。

216 :NAME IS NULL:2008/08/05(火) 19:58:43 ID:???
}elseif(!$c==""){

217 :NAME IS NULL:2008/08/05(火) 20:25:52 ID:???
>>216
あ、他にif文とかがあるのです。
何が間違ってるんだろう…

218 :NAME IS NULL:2008/08/05(火) 20:38:14 ID:???
>>216
大変申し訳ありませんでした。
elseifをelseにしたら表示がされました。
平に平にご容赦ください。

219 :NAME IS NULL:2008/08/06(水) 05:38:31 ID:???
>>218 else で title.catt='$c' とかインジェクションしそうだな。

220 :NAME IS NULL:2008/08/06(水) 07:01:22 ID:ihVuWEE/
MySQLを最大5億件のレコードを扱うことを予定しているのですが、
こんな大量のレコードを扱っている人いますか?
インデックス付けても、検索が遅くて使い物にならないか懸念しています。

Googleなどが、MySQLを使っているのは知っていますが、
Googleの場合はMySQLの内部コードをいじっていると聞いています。
私の場合、そこまでの技術力はないので、そのまま使います。

ちなみに、InnoDBです。アドバイスよろしくお願いします。

221 :NAME IS NULL:2008/08/06(水) 07:34:30 ID:???
恐らく無理。というか、データ捏造してやってみれ。
差し支えなければ、何を扱ってそんなデータ量になるのかちょっとkwsk

222 :NAME IS NULL:2008/08/06(水) 07:43:26 ID:???
ああ、ちなみに、無理っていうか、MySQLだけの問題じゃ済まない規模だから
難しいという意味に修正してくだしあ。色々と検証すべきポイントがあると思う。

223 :NAME IS NULL:2008/08/06(水) 07:56:08 ID:ihVuWEE/
>>221>>222
アドバイスありがとうございます。

>差し支えなければ、何を扱ってそんなデータ量になるのかちょっとkwsk
クライアントが某研究機関(といってもスパコンを使うような規模じゃなくて、規模は中小)で、
実験データを処理するために使うとのこと。

そのための支援プログラムを作っているのですが、
5億件入ったデータにUPDATEをガリガリ掛ける処理です。

本当はメモリー上でやりたいのですが、さすがにメモリーオーバーです。
で、DBを使ってというところなのですが・・・

難しいというのは、例えばMySQLでtmporaryテーブルを作られてしまった時に、
メモリーオーバーになるとかそういうことでしょうか?

224 :NAME IS NULL:2008/08/06(水) 08:23:07 ID:???
>>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
そのクラッシュの原因がMySQLのせいなのか
ファイルシステムの問題だったのかわからないけど,
念のため一方向レプリケーションしておくとかで
バックアップ代りにならないかな?

バックアップ目的ではないけど,
Facebook では巨大なデータベースを
西海岸側と東海岸側でレプリケーションしているみたいだよ.
http://www.sqlplex.com/articles/mysql/announcements/keeping-up-facebook-scaling-and-replication-with-mysql.html
ちょっと作りこみは入ってるみたいだけど.

228 :NAME IS NULL:2008/08/06(水) 09:48:25 ID:???
>>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.

原因わかります?

229 :NAME IS NULL:2008/08/06(水) 11:08:10 ID:???
ローカルならロック機構とかいらねぇし、大抵MyISAMのほうがいいんじゃないの?
インデックスをきちんと張って、メモリが足りてれば捌ける。問題なし。

うちの会社ではMySQL4を改造してパラレル化してン100億レコード突っ込んでるけど、
ディスクエラーが出るなんつーことはない。他に原因があるはずだ。

億単位のレコードのレプリケーションはお勧めしない。
時間がかかるし、レプリケーションが壊れたときの復旧や増築が大変すぎる。
全部ダンプする羽目になるんだぜ?
MyISAMにしてファイルコピーのほうが楽。

230 :NAME IS NULL:2008/08/06(水) 12:05:24 ID:???
・MyISAMにする
・メモリを2GB以上積む
・HDDをRAID1+0にする
・C2D/3GHzぐらいにする
・10万レコード程度のテストで、最も高速なSQLを吟味する

231 :NAME IS NULL:2008/08/06(水) 12:10:34 ID:???
がりがりアップデートするのにMyISAM?

232 :NAME IS NULL:2008/08/06(水) 12:22:44 ID:???
>>231
だめな理由をどうぞ

233 :NAME IS NULL:2008/08/06(水) 16:21:41 ID:???
バッチなら問題ないかも。すまん。
ユーザのアクションに対して書き込むようなのだと、待ちが頻発して面倒だったんだ。
あと、concurrent_insertsがfixedじゃないと駄目な気がしてた。違ったけど。
dynamicだとoptimizeが大変だなーとか、そんな程度。

234 :NAME IS NULL:2008/08/06(水) 21:56:58 ID:???
>>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万件の規模です。

236 :NAME IS NULL:2008/08/06(水) 23:25:52 ID:???
2GB の壁があるとしたら、それは OSと ファイルシステムの問題、
あともしかしたら O_LARGEFILE の問題?

237 :NAME IS NULL:2008/08/07(木) 00:33:41 ID:Ozd0b/vL
すいません。

リレーションを組む必要ってあるのでしょうか。
JOINで対応することは設計する上では煩雑となるのでしょうか。

238 :NAME IS NULL:2008/08/07(木) 08:49:41 ID:???
>>237 要件に合わせて好きにしれ。拡張性、保守性なんかも考えてね。

239 :NAME IS NULL:2008/08/07(木) 08:52:25 ID:???
ヒント
・使われるインデックスは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をエラーにするにはどのようにしたらよいのでしょうか?


242 :NAME IS NULL:2008/08/07(木) 15:36:21 ID:???
if(sizeof($hoge)<10)exit;

243 :NAME IS NULL:2008/08/07(木) 16:23:41 ID:???
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は毎コマンドでクリアはされないのでしょうか?

私のプログラミングミスなのかな・・・?


246 :NAME IS NULL:2008/08/08(金) 12:00:04 ID:???
>>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 の対象ではないのですか?

249 :NAME IS NULL:2008/08/09(土) 14:53:41 ID:???
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
しかしダウンロードすんのめんどくさいな。。
いつからこんなごちゃごちゃになったんだ?

253 :NAME IS NULL:2008/08/12(火) 01:13:55 ID:???
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です。

254 :NAME IS NULL:2008/08/12(火) 06:02:53 ID:???
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:???
もしかして・・・バグ?
http://d.hatena.ne.jp/tohokuaiki/20080801/mysqldump

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
テンポラリテーブル使う処理でスロークエリが多発しているため、
調べていて、次のブログを見つけました
http://www.mysqlperformanceblog.com/2007/01/19/tmp_table_size-and-max_heap_table_size/
英語で、ちょっと正確には意味が分かってないのですが、
TMP_TABLE_SIZEとMAX_HEAP_TABLE_SIZEの小さい方の値が、
一時テーブル用のメモリ領域として使われるということでしょうか?

259 :NAME IS NULL:2008/08/13(水) 03:15:51 ID:3lWVFElR
MySQLで「テンポラリテーブル」という言葉は二つの文脈で使われている。
CREATE TEMPORARY TABLEで作成されるものと、
MySQLの内部で作成されるもの。
前者は通常のテーブルと同じく、ディスク上に作成される。
後者はHEAPテーブルなので、通常はメモリ上に作成される。
TEXTやBLOBを使う等、HEAPテーブルの限界から出た場合は、ディスク上に作成される。

こういう認識であってますか?

260 :NAME IS NULL:2008/08/13(水) 03:31:36 ID:???
あってます。

内部で作成される一時表は、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で
インデックスがないクエリもスロークエリログに記録した時、
ログを見るだけでは、それがスロークエリなのか、インデックスがないクエリなのか、
あるいはその両方なのかが分かりません
何かいい方法はないでしょうか?

263 :NAME IS NULL:2008/08/13(水) 09:44:56 ID:???
explain

264 :NAME IS NULL:2008/08/13(水) 10:40:46 ID:???
確かにexplainでも分かりますが
スローなクエリはexplainもスローになるので
運用環境ではしたくないです
log-queries-not-using-indexesで残すログに
何らかの印を残してくれたら一番スマートだと思うのですが・・

265 :NAME IS NULL:2008/08/13(水) 11:32:05 ID:???
一般クエリログから
不足しているインデックスを検出することは出来ますか?

266 :NAME IS NULL:2008/08/13(水) 12:51:47 ID:???
ログに出たクエリを開発環境で explain してみればいいじゃん

267 :NAME IS NULL:2008/08/14(木) 19:59:58 ID:???
エクスポートしたデータのインポートについて質問です。
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 です。

269 :NAME IS NULL:2008/08/17(日) 17:28:52 ID:???
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です。

270 :NAME IS NULL:2008/08/17(日) 18:31:30 ID:???
>>269
テーブルを作成する create の中でなんで検索に使う like を使うの?
ってか何をしたいのか判らんのだけど。

271 :NAME IS NULL:2008/08/17(日) 19:42:28 ID:???
>>269
create table new_t like old_t の構文は 4.1 から。

>>270
既存のテーブルと同じ構造の新しいテーブルを作る構文。

272 :NAME IS NULL:2008/08/17(日) 19:44:35 ID:???
>>269
create table T1 like T0 は、4.1 からみたいです。

http://dev.mysql.com/doc/refman/4.1/en/create-table.html
>In MySQL 4.1, you can also use LIKE to create an empty table based on the definition of another table,

273 :NAME IS NULL:2008/08/17(日) 19:44:59 ID:???
うお、ダブリすまぬ。

274 :270:2008/08/17(日) 20:20:04 ID:???
>>271
おお、tnx

275 :NAME IS NULL:2008/08/18(月) 02:13:56 ID:???
SQL初心者で今後学んでいきたいと思っている者ですが、
ひとつの勉強方法として参考までに聞かせてください。

皆さん最初は何やってきました?
【 例 】
無駄にSQLたたいてみたり。
自分でテーブル作ってデータ抽出してみたり。
無駄にサブクエリ使ってみたりなど・・・。


お願いします。

276 :NAME IS NULL:2008/08/18(月) 02:45:26 ID:???
学習など不要。実践あるのみ。

277 :NAME IS NULL:2008/08/18(月) 02:50:10 ID:i7lKKnR7
>>275
おれも、>>276と同じで必要に迫られて使っているうちに一通り覚えてしまった。
機能面から色々いじるのではなく、用途面からアプローチしていく方が効率的。

278 :NAME IS NULL:2008/08/18(月) 05:43:01 ID:???
最初にOracle Masterとった。

279 :NAME IS NULL:2008/08/18(月) 06:41:15 ID:???
>>275
自分で作りたいアプリケーションがあったので、それを作るためには
どうしたらいいか勉強した。
仕事でやらされるのでなければ、こうでもしないとモチベーション上が
らない。 w

280 :NAME IS NULL:2008/08/18(月) 12:35:32 ID:???
MySQLの資格取りたいんですが、
資格に関連した本なさそうなんですが、資格取るためのお勧めの本とかありますか?


281 :NAME IS NULL:2008/08/18(月) 12:40:44 ID:???
>>275
DBやSQLなんてなーんも知らないときに、Postfixとかその他のアカウント認証を
MySQLバックエンドでやる仕事があって、CSVレベルの扱い方から覚えた。

そこそこの概念的な理解とSQL叩ける知識が出来てからは、プライベートで
変なもん作ったりして少しずつ覚えたな。株価データベースとかw

282 :NAME IS NULL:2008/08/18(月) 12:43:21 ID:???
プライベートで題材がないときは住所録が王道だな。
住所もベタベタに保存しないで、郵便番号テーブルと
リレーションしたりすれば十分楽しめるお題かと。

283 :NAME IS NULL:2008/08/18(月) 13:08:07 ID:???
ちょっと教えてください。

CPIという鯖のMySQL5なんですが、文字セットがUTF-8とあります。
で、このDBでXOOPSをEUC-JPでインストールしたところ
「@」や「〜」という機種依存文字だけ「?」になってしまいます。
XOOPSのコミュニティで相談したのですが答えはでず・・。
このスレで聞くのもどうかと思ったのですが
MySQL側で何かよい対策あるかもしれないので
みなさんの知恵をお借りすべく質問させていただきました。
よろしくお願いします。

284 :NAME IS NULL:2008/08/18(月) 13:17:52 ID:???
http://www.google.co.jp/search?hl=ja&safe=off&q=XOOPS+UTF&lr=lang_ja

285 :NAME IS NULL:2008/08/18(月) 21:28:02 ID:???
>>281
>株価データベースとかw

ギクッ w

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;

このように書いて失敗しました。

287 :NAME IS NULL:2008/08/18(月) 22:32:24 ID:???
order by

288 :275:2008/08/18(月) 23:15:56 ID:???
>>276-279,281,282
ありがとうございます。
参考にして取り組んでいこうかと思います。

289 :NAME IS NULL:2008/08/19(火) 01:12:03 ID:???
マジで質問なんですが
PHPとMYSQLでデータベース作ったのですが
TEXTのフィールドに→'(半角のダッシュみたいなやつ)が入りません。
インサートする直前にS-JISに変えるクエリも送ってます。なんでですか?

290 :NAME IS NULL:2008/08/19(火) 04:00:10 ID:???
SQLの仕様

SQL的に意味のある記号は\でエスケープしないといけない。
http://phpspot.net/php/man/php/function.mysql-real-escape-string.html

291 :NAME IS NULL:2008/08/19(火) 04:19:12 ID:???
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の方に重複がないデータができそうですが、
データが膨大な量があるので、できれば、
テーブルコピーをせずにやりたいのです。

アドバイス宜しくお願いします。

293 :NAME IS NULL:2008/08/19(火) 09:59:35 ID:???
一発でなきゃだめ?
削除指定するための指定で両者を区別できないとどっちも消しちゃうけど。

294 :NAME IS NULL:2008/08/19(火) 10:35:45 ID:???
そんなに膨大な量があるなら、大事なテーブルなんだろうから、なおさら直接削除はやめた方がいいように思うんだが…
俺が、小心者なだけか。

295 :NAME IS NULL:2008/08/19(火) 10:40:30 ID:???
全カラム指定でGROUP BYしてCOUNTいれてhavingで2以上なら別テーブルにコピー
同じ指定でコピーの代わりに削除したうえで、別テーブルからもってくれば、、、
3回(+別テーブルのCREATEとDROPの2回か)かかるけど。

296 :NAME IS NULL:2008/08/19(火) 10:52:59 ID:???
新テーブルを create してはいけない 、という条件じゃなかったか ? w
どうせ create するのであれば、簡単に
create table new_table as select * from the_table union select * from the_table;
でいいのでは。

297 :NAME IS NULL:2008/08/19(火) 10:57:33 ID:???
>>293-296
色々考えて下さってありがとうございます。
やはり一発のSQLというのは無理そうですね。

GROUP BY, HAVIGN, LIMIT, INとかをつかって何とかならないかなぁとか、
甘く考えていたのですが、新テーブルを作ってやる方が安全そうですね。
ちょっと、その方向性で準備してみます。

ありがとうございました。

298 :NAME IS NULL:2008/08/19(火) 17:51:52 ID:???
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の場合はグループ化しないようにする方法ってあるのでしょうか?

300 :NAME IS NULL:2008/08/20(水) 01:13:08 ID:???
(SELECT * FROM hoge WHERE id != 0 GROUP BY id) UNION (SELECT * FROM hoge WHERE id = 0 GROUP BY id)

・・・ということかしら。

301 :NAME IS NULL:2008/08/20(水) 01:14:43 ID:???
まつがえた

(SELECT * FROM hoge WHERE id != 0 GROUP BY id) UNION (SELECT * FROM hoge WHERE id = 0)

302 :NAME IS NULL:2008/08/21(木) 13:53:46 ID:???
>>298
REPLACE INTO じゃだめ?

303 :NAME IS NULL:2008/08/21(木) 15:56:01 ID:89zb0qJQ
web+DBのサーバー構成が2台ありまして、
両方にアクセスログをMySQLに保存しています。
で、両方のサーバーからのアクセスログをローカルにダウンロードして解析しようとすると、
キー重複でinsertが出来ません。

auto_incrementしているのでキーが重複してしまうのですが、
DTATTIME型にしても、やはり同時刻にアクセスがあると重複してしまいます。
サーバーが違うデータ間で一意にするキーを設定するには、どうすれば宜しいですか?

304 :NAME IS NULL:2008/08/21(木) 16:27:58 ID:???
サーバ名+インクリメントでいいんじゃない?

305 :NAME IS NULL:2008/08/21(木) 18:00:05 ID:???
>>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に短時間で比較的大量の処理を実行させると、
自動的に再起動が掛かります。どうしてか分かりますか?
エラーログにもその痕跡がないのですが。

308 :NAME IS NULL:2008/08/22(金) 14:16:27 ID:???
エスパー募集スレと聞いて

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と名前にしているのですが、
それが問題でしょうか。



310 :NAME IS NULL:2008/08/22(金) 14:46:45 ID:???
mysqld が動いている ServerU == localhost なのかどうかを、まずはっきりさせてほしいが。

311 :NAME IS NULL:2008/08/22(金) 15:39:23 ID:???
落ちるところまでは良いとして、再起動って何故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だけ落ちて自動的に再起動がかかります。

頻度は月に一回で、アクセスが集中するときに発生します。

これでどこの部分をいじれば解決すれば分かりますか?

313 :NAME IS NULL:2008/08/22(金) 17:40:29 ID:???
落ちてる理由は Out of memory だな。MySQL が要求したメモリが足りずに
OS にぬっ殺されてる。

原因としては、mysqld に割り当てているメモリ量が少ないか、SQL がヘタクソ
すぎて膨大なメモリを消費しているかどっちか。

314 :NAME IS NULL:2008/08/22(金) 17:51:48 ID:???
SELECT * FROM xxx
で膨大なデータ読んでるんだろうか

315 :NAME IS NULL:2008/08/22(金) 17:59:20 ID:???
カーソル使うのはどう?

316 :NAME IS NULL:2008/08/22(金) 17:59:57 ID:???
ありがちなのはソートだな。

317 :NAME IS NULL:2008/08/22(金) 18:03:20 ID:???
膨大な抽出はディスク上で処理されるのでOOMの原因にはならないはず。
野良ビルドしてない? MySQLだけは公式バイナリ使った方がいいと思うよ。
ちゃんと検証されてるから。

318 :NAME IS NULL:2008/08/22(金) 18:07:47 ID:???
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になっていないので・・・。

320 :NAME IS NULL:2008/08/22(金) 19:03:50 ID:???
以下のコマンドの結果キボン

top -b | head -5
ps uU mysqld
limits -a -U mysql

321 :NAME IS NULL:2008/08/22(金) 19:05:15 ID:???
間違えた 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

323 :NAME IS NULL:2008/08/22(金) 19:42:17 ID:???
>>322
ありがと。とりあえず OS 的にメモリすかすかで余裕があることは分かった。
あとは再現したときにどういう状況になってるのか・・・だねぇ。

324 :NAME IS NULL:2008/08/22(金) 19:46:36 ID:???
http://dev.mysql.com/doc/refman/5.1/ja/gone-away.html
http://dev.mysql.com/doc/refman/4.1/ja/gone-away.html

325 :NAME IS NULL:2008/08/22(金) 19:48:09 ID:???
http://mysql.sd2.mirrors.redwire.net/doc/refman/4.1/ja/out-of-memory.html

326 :NAME IS NULL:2008/08/25(月) 03:44:28 ID:???
   ∩___∩
   | ノ      ヽ/⌒) あばばばばばば
  /⌒) (゚)   (゚) | .|
 / /   ( _●_)  ミ/    ∩―−、
.(  ヽ  |∪|  /    / (゚) 、_ `ヽ
 \    ヽノ /      /  ( ●  (゚) |つ
  /      /      | /(入__ノ   ミ   あばばっあびゃばびゃばば
 |       /       、 (_/    ノ
 |  /\ \       \___ ノ゙ ─ー
 | /    )  )       \       _
 ∪    (  \        \     \
       \_)

327 :NAME IS NULL:2008/08/25(月) 15:47:23 ID:???
VIEWでつけた名前を忘れたのですが、調べる方法はありますでしょうか?

328 :NAME IS NULL:2008/08/25(月) 17:54:12 ID:???
SHOW FULL TABLES

329 :NAME IS NULL:2008/08/25(月) 18:42:35 ID:???
>>328
d

330 :NAME IS NULL:2008/08/26(火) 19:07:37 ID:???
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ずつ加算して更新する

と言うような事って出来るのでしょうか?

332 :NAME IS NULL:2008/08/26(火) 21:48:19 ID:???
UPDATE table
SET sort = sort + 100
WHERE sort > 100

333 :NAME IS NULL:2008/08/26(火) 23:08:32 ID:???
>>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 がいいという意味なのでしょうか?


335 :NAME IS NULL:2008/08/27(水) 16:06:23 ID:???
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のコードが長くなったり、処理が増えて悩んでいます。

337 :NAME IS NULL:2008/08/27(水) 18:01:22 ID:???
そのキーや検索結果が膨大になる場合、
複数のSQLでやるほうが大変だと思うよ。
まあケースバイケースで。

338 :NAME IS NULL:2008/08/27(水) 18:45:19 ID:???
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個あれば足りますが・・・)

もう決め打ちで動作テラモッサリ覚悟で行くしかないのか。


339 :NAME IS NULL:2008/08/27(水) 18:51:24 ID:???
>>335
すみません。
サブクエリを使うことで、自己解決しました。
スレ汚し、失礼いたしました。

340 :NAME IS NULL:2008/08/27(水) 20:24:23 ID:???
>>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


助かりました、ありがとうございます!

342 :NAME IS NULL:2008/08/28(木) 06:25:22 ID:???
シェルの話になると思うのですが、
ダウンロードした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を作成しています。

343 :NAME IS NULL:2008/08/28(木) 10:30:10 ID:???
>>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を利用しています。

345 :NAME IS NULL:2008/08/28(木) 21:03:34 ID:???
GROUP BY

346 :NAME IS NULL:2008/08/28(木) 21:37:27 ID:???
ちょっとお聞きしたいんですが
画像を表示させる場合
<img src="$pic">でもいいんですかね?

347 :NAME IS NULL:2008/08/28(木) 22:32:01 ID:???
ダメだと思うよ

348 :NAME IS NULL:2008/08/29(金) 10:26:36 ID:???
誤爆か

349 :NAME IS NULL:2008/08/29(金) 17:39:25 ID:PbXS3bYh
このような質問ですみませんが、
ファイルをジャンル分けしようと思っています。

ジャンルごとにテーブルを作成するのと
一つのテーブルに全て詰めてしまうのとでは
どちらの方がパフォーマンス、効率がいいのでしょうか?

ジャンルごとに対象のファイル名を抜き出す場合は
やはりジャンルごとにテーブルを作った方がいいですよね。
こういった場合に一つのテーブルに詰める事の優位な点などはあるのでしょうか。

350 :NAME IS NULL:2008/08/29(金) 18:07:04 ID:???
>>348
誤爆っていう言い方は訂正するべきでしょ。

原爆症で苦しんでいる方がいるのに、
こういう終戦の月に無教養・非常識すぎるんじゃないの?

351 :NAME IS NULL:2008/08/29(金) 18:07:28 ID:???
普通は
>ジャンルごとにテーブルを作成
これはありえない。

352 :NAME IS NULL:2008/08/29(金) 18:08:13 ID:???
一発だけなら誤射かもしれない

353 :NAME IS NULL:2008/08/29(金) 18:09:17 ID:???
>>350
そういうのはこっちで。
http://etc7.2ch.net/denpa/

354 :NAME IS NULL:2008/08/29(金) 19:39:38 ID:PbXS3bYh
>>351
なるほど、では一つのテーブルで頑張ってみようと思います。
どこかで50万件ぐらいでデータベースが悲鳴を上げることは無い、
というのを見たのですが、検索の効率が悪いならば、と思ったのですが安心しました。

ありがとうございます。

355 :NAME IS NULL:2008/08/29(金) 21:21:38 ID:???
んとね、そこはクエリに対するインデックスの張り方がキモなわけでして。
適切に張ってある限りはテーブルを分けようが一緒だろうが
パフォーマンスはほとんど変わんないよ。

356 :NAME IS NULL:2008/08/29(金) 22:24:38 ID:PbXS3bYh
>>355
なるほどです。

>354の後からしばらく考えていたのですが、
実装としてはXMLの方が簡単そうな気がしました。
検索効率や、ファイルを削除した時の管理の楽さなどはdbの方が良さそうな気はしますが。

本当に参考になりました、ありがとうございます。
まだしばらく考えてみてみます。

357 :NAME IS NULL:2008/08/29(金) 23:05:49 ID:???
>>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の優位性などがよく分かってないので、
思考があっちらこっちら行ってしまってます。

解答の回答がおぼつかなかったりしてすみません。

359 :NAME IS NULL:2008/08/30(土) 11:26:45 ID:???
MySQLのチューニング関連の本って出てる?

360 :NAME IS NULL:2008/08/30(土) 11:32:20 ID:poqNHsYq
出てるけど、ほとんどのものはパラメーターの解説ぐらいなもの。
ただで読める、公式のレファレンスを読んだほうがいいのでは?

361 :NAME IS NULL:2008/08/30(土) 11:35:32 ID:???
>>360
d


362 :NAME IS NULL:2008/08/30(土) 11:42:02 ID:???
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
ならサーバに接続できることが分かったのですが、パスワードオプションを
つけるととたんにダメになってしまいます。
なぜなのか分からずに途方に暮れています。どうかお知恵を貸して下さい。


363 :NAME IS NULL:2008/08/30(土) 13:48:23 ID:???
GRANT ALL PRIVILEGES ON *.* TO bbsuser@localhost IDENTIFIED BY '********'

ON *.* だとユーザを分離する意味が薄れるんで、ON bbs.* とかに制限した方がイイ

364 :362:2008/08/30(土) 13:56:46 ID:???
>>363
ありがとうございます!早速やってみたらできました。
それと、ユーザが一部のデータベースにしかアクセスできないようにもしました。
本当にありがとうございます。

365 :NAME IS NULL:2008/08/30(土) 14:12:38 ID:???
>>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から引き出せば効率がいいんですね。

やはり文字列よりも整数で抜き出す方が壮大に早いんですね。
ありがとうございます、そうします。

367 :NAME IS NULL:2008/08/31(日) 09:58:12 ID:???
> やはり文字列よりも整数で抜き出す方が壮大に早いんですね。

当たり前だろ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のレコードがリストの何番目になるのかを知りたいのです。

369 :NAME IS NULL:2008/09/01(月) 09:24:43 ID:???
たぶんoracleのrownumのようなものを期待しているのだろうけれどありません。
何とかする方法はFAQなのでmysql rownumでググれ。

370 :NAME IS NULL:2008/09/01(月) 11:25:43 ID:knw+y/WY
order byを書かずにselectした場合の順番って順不同ですか?
あるいは、insertされた順でしょうか。
内部的に時刻情報を保存しているのは無駄だから、やっぱり順不同…?

371 :NAME IS NULL:2008/09/01(月) 11:28:11 ID:???
順不同というか、単なる集合でしょ。

372 :NAME IS NULL:2008/09/01(月) 11:49:34 ID:???
集合なので順番という概念はないとすると、そもそもORDER BYの存在自体が意味不明でしょ。
現実的なデータハンドリングを考えないと。

で、結論だけど、データの発見順とでもいうところか。
無駄にランダマイズしているわけでもないので、環境と状況が同じなら順番も同じではある。
しかし環境と状況に依存するということはつまり、順不同と考えておくべきである。

373 :NAME IS NULL:2008/09/01(月) 11:54:50 ID:???
>>372
名答だ。

374 :NAME IS NULL:2008/09/01(月) 12:04:22 ID:Sur8/I/j
lsとかglobみたいな感じか

375 :NAME IS NULL:2008/09/01(月) 12:12:30 ID:???
ありがとうございました

376 :NAME IS NULL:2008/09/05(金) 04:24:49 ID:???
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 にアクセス可能か確認することで、
攻撃の成否を確認し、サーバが脆弱であるか確認を行っていると考えられます。

377 :NAME IS NULL:2008/09/05(金) 15:24:45 ID:???
以下の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する

378 :NAME IS NULL:2008/09/05(金) 16:52:38 ID:???
MySQLです。
重いSQL文を発行してしまったときなど、ctrl+Cで発行したSQLをキャンセルする
ことがありますが、このキャンセルをSQLの発行で実現することはできないでしょうか。
自作のアプリケーションでデータベースにアクセスするため、
ctrl+Cを使うことができないのです。
よろしくお願いします

379 :NAME IS NULL:2008/09/05(金) 18:12:03 ID:???
ctrl-cでキャンセルできるんだっけ?
プロセスリストでも見て、killしなよ。

380 :NAME IS NULL:2008/09/05(金) 18:37:50 ID:???
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を大きいと見なすか小さいと見なすかを指定することはできますか?



381 :NAME IS NULL:2008/09/05(金) 18:42:46 ID:???
>>378 Ctrl+C = SIGINT

382 :NAME IS NULL:2008/09/05(金) 18:46:56 ID:???
>>377
たぶん1文だと無理

383 :NAME IS NULL:2008/09/06(土) 13:37:47 ID:???
>>380
union

384 :NAME IS NULL:2008/09/07(日) 02:09:33 ID:MSRnUF0+
データーベースをバックアップからもどしたら、
権限が書きかわってしまって、、、
PHPmyAdminのSQLでクエリを実行したいのですが、
どういう文で権限をもとにもとせるのでしょうか。。。



385 :NAME IS NULL:2008/09/07(日) 03:26:28 ID:???
元にもとすことはできない。

386 :NAME IS NULL:2008/09/07(日) 04:23:02 ID:???
>>384
データのリストアって、結構トラブル多いよね。
リストアする経験ってあまりないし、たいがい急いで作業してるし。

387 :NAME IS NULL:2008/09/07(日) 09:36:17 ID:???
>>384 grant

388 :NAME IS NULL:2008/09/07(日) 13:48:57 ID:???
SIGINTだとmysqlクライアントごと死ぬけど
クエリーの処理だけを止めるにはどうしたらいいかな

389 :NAME IS NULL:2008/09/07(日) 14:25:09 ID:???
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'
という式をなんとか考えました
もっとスマートな式があればお願いします

392 :NAME IS NULL:2008/09/08(月) 09:28:39 ID:???
そんなSQLは書いちゃいかん。
SQLはプログラム言語じゃないんだぞ。

数だけが問題なら、格納する時に数自体も格納しておくとか。

393 :NAME IS NULL:2008/09/08(月) 09:50:36 ID:???
select で一々文字列関数呼び出してたら、かなりコストがかかるのではないか。
>>392 の言うとおり、数を数えて別フィールドに格納しておくのがよいように思うんだが。

394 :NAME IS NULL:2008/09/08(月) 23:33:40 ID:???
>>388
ちょ、sega って…。

KILL でクエリを中止できる。

395 :NAME IS NULL:2008/09/09(火) 15:31:48 ID:???
wwww

396 :NAME IS NULL:2008/09/10(水) 08:15:24 ID:???
regexpつかう

397 :NAME IS NULL:2008/09/11(木) 00:40:22 ID:???
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の設定かなにかの問題だと思うんだけど

401 :NAME IS NULL:2008/09/11(木) 12:39:39 ID:???
ファイルサイズが1024KBなの?
base64エンコードってことは4/3倍だよね、1677215文字以内に収まってる?

402 :NAME IS NULL:2008/09/11(木) 12:51:24 ID:???
>>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
今外なので帰ったらググってみます。
エラーはフォールズ以外出し方分からないです。
いつもはエラーをプロンプト画面で見てますが
とても手打ちは無理なので諦めました

404 :NAME IS NULL:2008/09/11(木) 17:30:59 ID:???
ログっつーもんはないのか

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にしておいてバイナリ入れたりするのは邪道ですか?

407 :NAME IS NULL:2008/09/12(金) 20:43:32 ID:???
>ファイルをDBに格納する場合、BLOB型ならbase64エンコードをしなくて
>そのまま突っ込んでもいいという事ですか?

いいですよ。そのための BLOB です。なお、prepared statement 使って下さい。

>BLOBにしておいて文字のデータ入れたりTEXTにしておいてバイナリ入れたりするのは邪道ですか?

compare しないなら、どっちも同じ。
compare するなら、text の方は characte set が効いてくるので、予期しない結果になるかも。

408 :388:2008/09/13(土) 13:18:09 ID:???
>>394
もちろんkillで殺すんですが知りたかったのは
クエリだけを停止するのは何のシグナルかということです


409 :NAME IS NULL:2008/09/13(土) 16:49:47 ID:???
検索結果が1行だとわかっているときって LIMIT 1 付けたほうが速いのかな

誰も実験したこと無いなら実験してみる

410 :399:2008/09/13(土) 19:07:14 ID:QFclDkB+
>>407
ありがとうございます。BLOBでデータ入れる事にします。

とりあえずPCの中にエロ画像が20万枚位あるので全部放り込んでみます。
一つのテーブルに20万枚入りますか?
テーブル分けたらいいんだけど、一つのテーブルってどの位のレコードが限度なんですか?
PCの能力に左右されるんですかね?
知ってる人教えて

411 :NAME IS NULL:2008/09/13(土) 20:16:39 ID:???

LIMIt $st , $lim;

$st = ($p -1 ) * $lim;
$next = $p + 1;
$rev = $p -1;
if($rev < 1){
$rev = 1;
}

412 :NAME IS NULL:2008/09/13(土) 20:20:18 ID:???
あの、すいません。
MYSQLに画像を入れようとして、BLOB型で入れたんですが
WINDOWSのコマンドで確認してみると、エラー音とともに
バイナリ文字が大量に出てきました。
それをPHPで取り出して、ヘッダー(Content-type: image/gif)を
入れると画像として表示されるんですが
どこかおかしいですか?

413 :NAME IS NULL:2008/09/13(土) 22:12:58 ID:???
どこもおかしくないんじゃない

414 :NAME IS NULL:2008/09/14(日) 00:42:16 ID:???
>>408
http://dev.mysql.com/doc/refman/5.0/en/kill.html

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レコード返るのか教えていただきたいです。

417 :NAME IS NULL:2008/09/14(日) 05:51:39 ID:???
内部的にこんなふうに動いてるみたい。
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までしか表示できなくて困っています。
設定ファイルとかあるのでしたら、教えてください。

419 :NAME IS NULL:2008/09/14(日) 22:24:38 ID:???
MySQL 5.1.28-rc has been released
http://dev.mysql.com/downloads/mysql/5.1.html
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-28.html

最初のRC(5.1.22、2008/09/24)が出てからもうすぐ1年(´ー`)

420 :NAME IS NULL:2008/09/14(日) 22:25:32 ID:???
× 2008/09/24
○ 2007/09/24


421 :NAME IS NULL:2008/09/15(月) 00:41:11 ID:???
select文とexplainの結果を食わせて
どうしたらいいかのヒントまでくれるような
そんなソフトってないかな

422 :NAME IS NULL:2008/09/15(月) 13:13:20 ID:???
インデクスがあるのに何で使ってくれないんだー、ばかー、というとき、理由の 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に到達したら、
遅くなっても良いので、ディスクに書き込んで欲しいです。


424 :NAME IS NULL:2008/09/16(火) 07:21:27 ID:???
whereで分散とかダメ?

425 :NAME IS NULL:2008/09/16(火) 09:58:46 ID:???
>>424
さっそくのレスありがとうございます。
whereで分けるというアイデアは気づきませんでした。
で、先ほどやってみました。
で、うまくいきました、とご報告したかったのですが、
こんどは別のSQLのGROUP BYで同じくOut Of Memoryで落ちました。

結局、相当な数のSQL文に手を入れることになりそうです。
もう、テストも終わりを迎えておりまして、
これを全部対応しようとすると、再度テストをやり直す羽目になりそうです。

パラメータを変更するなどの運用でなんとかするというのは難しいでしょうか。
数万件でOut Of Memoryが多発すると考えていなく、誤算でした。

426 :NAME IS NULL:2008/09/16(火) 10:31:28 ID:???
メモリあるんならsort_buffer_sizeでいいんじゃねーの?

本当にそんぐらいないと足りないソートが走るようなら遅いとか
別の問題がありそうだが.

427 :NAME IS NULL:2008/09/16(火) 10:36:08 ID:???
数十万件のソートは普通にできますが、僅か数万件のソートで問題が生ずるのなら、
むしろソートする1レコード(キーとか色々含む)が巨大で、それが sort_buffer_size を
上回るとかの問題ではないかという気がします。(ソート自体はtemp fileを使うはず)。

「Needed 2095128 bytes」と言われたなら、素直に my.cnf に
sort_buffer_size=10MB
とか書いておけばよいのではないかと思いますが…。

ただ、もし本当にレコードが巨大なら、それを丸ごとソートする事自体を考え直す方がいいかも。

428 :NAME IS NULL:2008/09/16(火) 11:27:14 ID:???
>>426 >>427
詳しくお返事ありがとうございます。
ちょっと言葉が足らずにすみません。

sort_buffer_sizeの設定を見直そうと考えたのが、
接続がmax_connections近くになると、
それもOut Of MemoryでMySQLサーバー毎落とされるという現象がきっかけでした。

それで、sort_buffer_sizeではなく他のパラメータなどで見直せないかと思っておりました。
>>427さんの仰られるとおりで、TEXTフィールドを含むテーブルで、
テーブル全体の量としては大きいです。

ソートする列は、単純な6桁の番号や5文字のCHARなので、大丈夫だと思っていましたが、
ソートする場合は、該当する列だけではなく、その他のデータも含まれるんですね。
これも勘違いしていました。そう考えると対応が難しいですね。

429 :NAME IS NULL:2008/09/16(火) 11:43:50 ID:???
>ソートする列は、単純な6桁の番号や5文字のCHARなので、大丈夫だと思っていましたが、
>ソートする場合は、該当する列だけではなく、その他のデータも含まれるんですね。

いや、一行目の理解で正しいんじゃないでしょうか。
なんだか、ソート以外の処で引っ掛かっているような気がします。

430 :NAME IS NULL:2008/09/16(火) 11:53:44 ID:???
>>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

431 :NAME IS NULL:2008/09/16(火) 11:56:36 ID:???
連投ですみません。Memory異常が発生しているテーブルはInnodbです。
MyISAMは、殆ど使っていません。

432 :NAME IS NULL:2008/09/16(火) 11:58:44 ID:???
ほんと、なんどもすみません。積んでいるメモリーは2GBです。
innodb_buffer_pool_size + key_buffer_size + max_connections * (sort_buffer_size + read_buffer_size) + max_connections * 2 MB
で計算すると1520MBで、Apacheと共存して使っています。

433 :NAME IS NULL:2008/09/16(火) 13:00:03 ID:???
OSは何?
Windows 32bitだと普通に限界近いよね。

434 :NAME IS NULL:2008/09/16(火) 14:22:59 ID:???
>>433
Cent OS4です。
で、あれから色々やってみましたら、
innodb_buffer_pool_size = 256M
から
innodb_buffer_pool_size = 128M
にしたところ、エラーが出なくなりました。
また、テストケースが残っているので、なんとも言えませんが、
今まで出ていたテストケースでエラーが無くなったのは収穫です。

Out Of Memoryで割当をどんどん増やしていきましたが、
逆に下げるべきだったでしょうか???謎です。
まだ残っているテストケースをやってみます。

簡単ながら、ご報告まで。

435 :NAME IS NULL:2008/09/16(火) 19:54:58 ID:???
ふつうに32bitの壁っぽいね。
64bitにするとか、
上位層からの同時接続数を絞ってもらうよう
交渉するとか。

436 :NAME IS NULL:2008/09/17(水) 11:49:53 ID:???
MySQLのレコードの処理は4万件でも10万件でも100万件でも
基本的に問題ないよね?チューニングしてれば。

でも、エラーになりやすい事を考えると、
レコードが増えていったら、テーブルを分ける方が良いのだろうか?

437 :NAME IS NULL:2008/09/17(水) 12:34:50 ID:???
問題ないすよ。

エラーになりやすいかどうかは一般化できないし、
それに対してテーブル分割が適しているかどうかも一般化できないと思うけど。

テーブル分割のメリットって、検索範囲を絞る必要が軽減されて
SQLやインデックスで考えるパラメータが減りますよね、とか
インデックス張り直す速度が向上しますよね、って程度しか思い付かない。
その代わりに柔軟性が落ちて、出来ない検索が増える、と。
あんまメリット無くない?

438 :NAME IS NULL:2008/09/17(水) 12:54:01 ID:???
2chのように1日に何万回も書き込みが発生する規模の掲示板を作っているのですが、こういったことにデータベースは不向きでしょうか?
レンタルでの運営なので全体では2ch規模になると思われます。

検索機能もほしいのでできればデータベースでレス1つ1つを保持したいのですが莫大なログの読み書きは現実的に可能でしょうか?
ロードバランスなどの負荷対策は行います。

439 :NAME IS NULL:2008/09/17(水) 13:07:48 ID:???
>>438
板毎にテーブルを作成するの?

2ch規模だと、板毎にサーバが必要になるだろうけど、
まぁそんなアクセスは無いと思うから、普通に大丈夫だと思うけど。

440 :NAME IS NULL:2008/09/17(水) 14:49:45 ID:???
板をまたいだスレタイ検索ならともかく、
板をまたいだスレの内容(レス)検索って、あっても相当使いにくそうな気がする。

441 :NAME IS NULL:2008/09/17(水) 14:58:24 ID:???
>>439さん

レスありがとうございます。
同一テーブル内で一意な掲示板IDをふって分ける形になります。
携帯のレンタル掲示板なのですべてのアクセスを合算すれば2ch規模になることもありえます。
負荷対策はプロキシかませてごちゃごちゃやることになると思います。

ログ自体はdatファイルで保存して検索されうるデータだけDBに入れておいてDBは検索の時のみ使うのが最適でしょうか?
すべてのレスが同じテーブルに格納されているのでビジーになってしまう気がして…
ご教示お願い致します。

442 :NAME IS NULL:2008/09/17(水) 15:10:14 ID:???
>440さん

レスありがとうございます。
全体検索はスレタイのみでもごまかせると思いますが、
画像や着うたの投稿も実装するのでできればレス検索も想定しておきたいです。

おそらくレス検索は別サーバに全レスデータいれてsennaでぶんまわす感じになるとは思います。

443 :NAME IS NULL:2008/09/17(水) 18:07:55 ID:???
>ログ自体はdatファイルで保存して検索されうるデータだけDBに入れておいてDBは検索の時のみ使うのが最適でしょうか?

俺もそれでいつも悩むんだけど、ログ=検索されうるデータじゃないのか?
例えば、スレタイ・レスと登録日のテーブルを分けるとしても
結局、必要なデータなわけだから、DBに入れるのもdat化するのも
同じ事のように思うんだが。

444 :NAME IS NULL:2008/09/17(水) 18:28:28 ID:???
DATのほうが使いやすいと思う・・・。データベース鯖のこと考えなくて済むし。
掲示板レンタルならなおさらじゃない?

445 :NAME IS NULL:2008/09/17(水) 20:02:10 ID:???
でも、ログを検査する時、大量に読み込まなきゃいけないだろ?
実質無理じゃないか?負荷がかかりすぎて。

446 :NAME IS NULL:2008/09/17(水) 20:15:21 ID:???
書き込みをdatにしまうときに、senna に掛けて検索用キーだけDBに入れる、という意味じゃないの?

447 :NAME IS NULL:2008/09/17(水) 20:24:19 ID:???
検索用キーを入れても、取り出す時に
ファイルを読み込まないといけないのでは?俺の知識不足かな。

448 :NAME IS NULL:2008/09/17(水) 20:34:58 ID:???
grep(ry

449 :NAME IS NULL:2008/09/17(水) 20:39:03 ID:???
>>447
そりゃそうだが、読む必要があるのは表示する分だけだから、ごく少量でしょ。

450 :NAME IS NULL:2008/09/17(水) 21:27:49 ID:???
>読む必要があるのは表示する分だけだから

ってことなら、やっぱりDBでいいんじゃないか?

451 :NAME IS NULL:2008/09/17(水) 21:33:59 ID:???
その用途でDBはオーバースペックなんじゃね?

452 :NAME IS NULL:2008/09/17(水) 21:45:58 ID:???
なんでもかんでもRDBMS使おうとすんなよ。
sennaの結果をキーにしてレス番引くハッシュDB+共有メモリだ、この野郎。

453 :NAME IS NULL:2008/09/17(水) 22:16:43 ID:???
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に該当するデータではない場合には、そのまま待たされずに実行されるということでしょうか?

実験してみたかぎりでは、そのような感じを受けるのですが、
いまいち確信が持てません。宜しくお願いします。

455 :NAME IS NULL:2008/09/18(木) 08:06:13 ID:???
> 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に変更する方法があれば教えて下さい。

鯖は一台です。別の鯖に移したいということではないです

458 :NAME IS NULL:2008/09/18(木) 15:29:32 ID:???
>>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
>>458

レスアンカー忘れた

462 :NAME IS NULL:2008/09/18(木) 22:30:24 ID:???
>>457
つ「mysqldump」

463 :NAME IS NULL:2008/09/19(金) 04:16:28 ID:???
>>460
それって単に新規テーブル作成するだけじゃないのか?

464 :457:2008/09/19(金) 12:38:01 ID:iYQHTpJc
とりあえずmysqldumpは分かったんですが
このコマンドってどうやって使うんですか?

mysql >
って書き方じゃないからPHPのクエリ送る関数では無理ですよね?

となるとプロンプト画面からだけなんですか?
めんどくさい…。

465 :NAME IS NULL:2008/09/19(金) 14:04:39 ID:???
LOAD DATA INFILEやINTO OUTFILEに日本語のファイル名が使えないのですが、
これは仕様なのでしょうか。

466 :465:2008/09/19(金) 15:16:39 ID:???
自己解決しました。

467 :NAME IS NULL:2008/09/19(金) 21:27:59 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\ |
+--------------------------+--------------------------------+


469 :NAME IS NULL:2008/09/20(土) 00:13:52 ID:???
>>468
コマンドプロンプト上ではSJIS(cp932)

470 :NAME IS NULL:2008/09/20(土) 00:18:33 ID:z861H5yU
>>469
「chcp 65001」コマンドで文字コードを変換しても駄目なのでしょうか?

471 :NAME IS NULL:2008/09/20(土) 02:03:44 ID:???
> 「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は忘れて下さい。あんまやるとスレ違いにもなっちゃうので。
スレ汚し失礼しました。

473 :NAME IS NULL:2008/09/20(土) 03:00:51 ID:???
chcpは知らんかったが、コンソールの文字コードを変えるのではなく、

mysql> set names sjis;
で、クライアントの方を変更するのではだめなのかな?



474 :NAME IS NULL:2008/09/20(土) 10:23:59 ID:???
chcpはなんか変換されないで空白になるのも多いから
utf-8になるコンソールでもあればいいんだけどね

475 :NAME IS NULL:2008/09/20(土) 22:36:32 ID:CkpTAsfp
なんでだろー なんでだろー
なんでだなんでだろー


カラムをtextからblobにしても
やっぱりJPG画像などのバイナリデータは
base64encodeしないと入らないのは何でだろ〜


base64encodeしないと入らないの?
なんで?
教えて!
ちゃんとPHPでrealストリング関数かけて、'とかエスケープしてるのに。
なんで?
blobの意味ないし。

476 :NAME IS NULL:2008/09/20(土) 23:17:46 ID:???
LAN{スレ行けばいいんじゃね

477 :NAME IS NULL:2008/09/21(日) 06:18:52 ID:???
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のサイトを運営していますが、まったく支障はありません。
これより、もっともっとヘビーな運用していらっしゃる方いますか?

479 :NAME IS NULL:2008/09/21(日) 16:13:33 ID:???
・クエリキャッシュの有無
・SQLの複雑さ
・バッファキャッシュへのヒット率
・ネットワーク経由かどうか

といった要因で性能は1〜2桁変わるから、
人の聞いても意味ないよ。

意味ないことを示すために手元のノートPC(Core2Duo 2.0GHz)で
8735.9 query/s 出してみた。


480 :NAME IS NULL:2008/09/21(日) 16:14:45 ID:???
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秒

481 :NAME IS NULL:2008/09/21(日) 16:54:04 ID:???
テーブル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にしたいことって
あるじゃないですか?

こういう場合どうしてます?
ホスト言語側で対応するよりしょうがないですか?

483 :NAME IS NULL:2008/09/21(日) 22:10:51 ID:???
ふつうはトリガ使うんじゃないの

484 :NAME IS NULL:2008/09/22(月) 12:02:25 ID:???
http://www.century21macao.jp/jp/property-for-investment/villa-de-mor/tower1.html?gclid=CL3-sKu07pUCFQ5aegodaDQ7eA

このページ見ると、
Warning: mysql_result() [function.mysql-result]:
Unable to jump to row 0 on MySQL result index 6
in /home/century/public_html/mainpages.php on line 42

こんなエラーばっかしなんだけど、
どうしてかな?

485 :NAME IS NULL:2008/09/22(月) 12:37:15 ID:???
データをUTF-8で入れているのですが、すべてのデータをujis(euc-jp)に変えることは可能でしょうか?
今、考えつく方法はmysqldumpしてエディタで文字コードを変えていれるくらいです
コマンドでできる等ありましたらご教示お願いします

486 :NAME IS NULL:2008/09/22(月) 13:31:25 ID:???
euc-jp で表現できない文字は、どうするの

487 :NAME IS NULL:2008/09/22(月) 14:26:35 ID:???
>>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
今はじめて、>>1のAAが絵に見えた。

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に対応してないようで困っています。
何かいい方法はありませんか?
会社のサーバですのであまり環境を変えない方法がいいです。
よろしくお願いします。

493 :NAME IS NULL:2008/09/22(月) 19:39:36 ID:???
492です。
コマンドの最後に\Gを入れることでよく見えるようになりました。
ありがとうございます。

494 :485:2008/09/22(月) 19:47:05 ID:???
>>486
表現できない文字も強制的に変換してしまいたいです。文字化けすると思いますが

495 :NAME IS NULL:2008/09/24(水) 00:25:05 ID:???
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
↑成功しているように見えるのに変化しません・・・。どうすればいいんでしょうか?

496 :NAME IS NULL:2008/09/24(水) 02:59:01 ID:???
nkf使うとか(違

497 :NAME IS NULL:2008/09/25(木) 00:44:47 ID:???
>>485
alter table tblname convert to character set ujis;
とか?

498 :485:2008/09/25(木) 13:51:14 ID:???
>>497
ありがとうございます!
そのコマンドを実行してみましたが、データはutf8のままのようです。

499 :NAME IS NULL:2008/09/25(木) 14:19:02 ID:???
レプリケーションで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分程度で終わります。

詳細は「現場指向のレプリケーション詳説」で検索すれば出てきます。



503 :NAME IS NULL:2008/09/26(金) 11:47:17 ID:???
500じゃないんですけど、常時結構な量の書き込みがあって
ロックするとコネクションが溢れちゃうんだけど
どうしたらよいでしょう。
そんな設計すんなよ、というのはそのとおりなんですけども。

504 :NAME IS NULL:2008/09/26(金) 11:59:35 ID:???
スレーブを一つ止めてそっからコピーでできるといいのにね。スレーブもマスターのどこまで
レプリケーションできたかの情報もってるからできそうな気もするけどよくわからん。

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になってしまいます。

508 :NAME IS NULL:2008/09/26(金) 19:58:44 ID:???
レプリケーションの便乗質問

マスターの古いバイナリログを消すと新しいスレーブ追加するとき面倒?
今は全部あるから面倒なくスレーブ追加できるけどさすがにログが増えすぎたんで消したいんだけど



509 :NAME IS NULL:2008/09/29(月) 10:31:33 ID:???
BOLBってなに?

510 :NAME IS NULL:2008/09/29(月) 11:34:34 ID:???
BLOBの間違いだろう、たぶん

511 :NAME IS NULL:2008/09/29(月) 13:32:09 ID:???
それそれ。
名前から機能がまったく推測できないから、
かんたんに説明してもらえる?

512 :NAME IS NULL:2008/09/29(月) 13:37:01 ID:???
そのぐらいぐぐれよ

Binary Large OBject

サイズの大きなバイナリデータを入れるときに使う。

513 :NAME IS NULL:2008/09/29(月) 13:54:13 ID:???
サイズの大きなバイナリデータ。
jpgの画像とか?
ありがとね。

514 :NAME IS NULL:2008/09/29(月) 13:55:04 ID:???
xamppいれて、
cakephp入れて、
phpmyadminで
mysqlのデーターベース作成して
やってるんだけど、
おぼえることがおおくてしにそうです

515 :NAME IS NULL:2008/09/29(月) 14:20:25 ID:???
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を付けてたら楽だったのですが、現在はつけておりません

517 :NAME IS NULL:2008/09/30(火) 02:32:04 ID:???
>>516
select * from table where id<10 ORDER BY id DESC LIMIT 1;
select * from table where id>10 ORDER BY id LIMIT 1;

って一気にか。そりゃ無理だな。

518 :NAME IS NULL:2008/09/30(火) 02:32:57 ID:???
と思ったけど、無理じゃなかったな。
出来たよ

519 :516:2008/09/30(火) 10:01:31 ID:???
>>518
どのように書けばよいのでしょうか?

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レプリケーションが簡単なのがいいんだよなあ。

522 :NAME IS NULL:2008/09/30(火) 12:35:50 ID:???
すげえ
ひろゆきってmysqlも使えるんだ!


ひろゆき「DBで消しました」
http://namidame.2ch.net/test/read.cgi/news/1222744117/

523 :NAME IS NULL:2008/09/30(火) 12:36:22 ID:???
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

524 :NAME IS NULL:2008/09/30(火) 20:44:15 ID:???
>>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使えばいいでしょ。


525 :NAME IS NULL:2008/09/30(火) 23:36:58 ID:???
>>524
なるほどそんな手があったのですね。
OKに書いてあったのは、同じテーブルの別の行をってことですね。
ありがとうございました。


526 :NAME IS NULL:2008/10/01(水) 01:13:22 ID:???
すみません。下記環境で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を使うみたいな方法とか
可能なのでしょうか?

もしかしたら(おそらく)頓珍漢な質問なのかもしれませんが
ご教授よろしくお願いします。

530 :NAME IS NULL:2008/10/01(水) 16:45:23 ID:???
>>529
ttp://xoops.smej.com/
mysql以外にアパチ、PHPもついてるけどインストルは不要
これでは駄目?

531 :530:2008/10/01(水) 17:04:44 ID:???
>>530
素早いレス有り難うございます

さっそくGoogleで調べてみたのですが
なんとも漠然として良く解らないのですが
このXOOPSってものはUSBメモリーに入れて
WindowsPCのUSBコネクタに刺すだけで
ポータブルアプリのように使用することが
出来るのでしょうか?

532 :NAME IS NULL:2008/10/01(水) 17:20:13 ID:???
>>531
xoopsはタンたるオープンソースの名前なので、ダウンロードするソフトはこちら
ttp://xoops.smej.com/modules/mydownloads/

どのソフトもインストールいらずでダブルクリックでアパッチとmysqlサーバーが立ち上がる
mysqlのバージョンは4.0系だからちと古い

533 :531:2008/10/01(水) 17:57:08 ID:???
>>532
ありがとうございます。

紹介していただいたサイトにアクセスして
ダウンロードを試みたのですが
今の私のネット環境が、ファミレスから
ノートPCで、auの通信(定額)カードからアクセスしているもので
通信速度が不安定なためうまく落ちません(時間がかかる)

家に帰って光環境で改めてダウンロードしてみたいと思います。

それまでしばらくxoopsってものを検索してみます
ありがとうございました。

534 :NAME IS NULL:2008/10/01(水) 19:57:49 ID:???
xamppじゃだめなの?

535 :NAME IS NULL:2008/10/02(木) 12:03:25 ID:???
>>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していますが、改行コードをいれると、コマンドプロンプト上で
激しく見えにくくなるのでなんとかならないかと悩んでいます。



537 :NAME IS NULL:2008/10/03(金) 15:41:53 ID:???
>>518
> 出来たよ

俺も知りたい。
「前へ」と「次へ」がやりたい。



538 :NAME IS NULL:2008/10/03(金) 16:24:03 ID:???
>>536
フィールド内に改行(LF)を入れるのは perl でも何ででもできるが、
それをコマンドプロンプトから桁揃えして見せようというのは無理だと思う。

539 :NAME IS NULL:2008/10/03(金) 16:43:00 ID:???
>>537
UNIONじゃね?

540 :NAME IS NULL:2008/10/03(金) 16:43:46 ID:???
前へ次へと>>518は違うと思うんだけど。

541 :NAME IS NULL:2008/10/03(金) 16:53:17 ID:???
>>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

543 :NAME IS NULL:2008/10/03(金) 17:52:48 ID:???
それidがuniqだし、どうがんばっても1件しか取れないじゃないか

544 :NAME IS NULL:2008/10/03(金) 17:56:59 ID:???
entry に id_before, id_next とか入れておいて join すれば

545 :NAME IS NULL:2008/10/03(金) 19:09:51 ID:???
http://orochi.iiichan.net/unc/res/2239.html
http://orochi.iiichan.net/unc/res/3276.html
http://orochi.iiichan.net/unc/res/3780.html
http://orochi.iiichan.net/unc/res/3547.html

546 :NAME IS NULL:2008/10/03(金) 21:25:05 ID:???
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でリストア
こんなもので可能なんでしょうか?



548 :NAME IS NULL:2008/10/04(土) 14:23:09 ID:???
id>=9 and id<=11 じゃあダメなのか?

549 :NAME IS NULL:2008/10/04(土) 14:41:27 ID:???
それはidに抜けがないことが保証されてないとな。

550 :NAME IS NULL:2008/10/04(土) 15:04:59 ID:???
okokじゃあこれだな

id >= (select max(id) from entry where id < 10) and id <= (select min(id) from entry where id > 10)

551 :NAME IS NULL:2008/10/04(土) 18:01:59 ID:???
このスレ、アホばっかだな
質問もアホなら答える奴もアホ

>>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を使っています。

555 :NAME IS NULL:2008/10/05(日) 12:32:22 ID:???
>>553
SELECT * FROM table WHERE 登録日 < DATE_ADD(NOW(), INTERVAL -3 DAY)

こんなじゃない?

556 :553:2008/10/05(日) 14:07:14 ID:???
>>555
上手く目的通りできました。ありがとうございました。

557 :NAME IS NULL:2008/10/05(日) 16:11:11 ID:???
>>555
おいおい、そのSQLパフォーマンス的には最悪だぞw
動けばいいとか思っている奴や趣味でやっている奴ならいいが。

558 :NAME IS NULL:2008/10/05(日) 16:53:54 ID:???
じゃ、お前が例文出してみろよ。

559 :NAME IS NULL:2008/10/05(日) 17:38:13 ID:???
自分ならプログラム側で処理しちゃうかなあ。

>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日からということでいいのか?
日数か週ベースで計算するべきでないか?
とか余計なこと考えちゃったよ。

562 :NAME IS NULL:2008/10/05(日) 23:53:56 ID:???
>>561

すいません。説明が足りませんでした。

値  登録日
値1、2008-09-24
値2、2008-09-25 *ヒット
値3、2008-10-01 *ヒット
値4、2008-10-24 *ヒット
値1、2008-10-25

とテーブルから値を引きたいんです。PHP側でやった方がよいでしょうか。。。

563 :NAME IS NULL:2008/10/06(月) 00:06:20 ID:???
今日の日付 - INTERVAL 1 MONTH でたいていはいけると思うけど、
前の月に対応する日がない場合があるから注意。

以下のような動作になるのでそれで困る場合はさらに考えてくれ。


MONTH 、YEAR_MONTH 、または YEAR を加え、結果の日付が新しい月の最大日数より大きな日を持つ場合、その日は新しい月の最大日数に調整されます。

mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> '1998-02-28'

564 :NAME IS NULL:2008/10/06(月) 00:11:20 ID:???
>>563

先月の出し方
select date_add(curdate(),interval -1 month);
2008-09-05

たしかに、先月はいけるんですが、日が今日になってしまいます。
日付は25日固定にしたいんです。
2008-09-25 にしたいんですが、方法がわからず。。。

でも、ありがとうございました。

565 :NAME IS NULL:2008/10/06(月) 00:22:05 ID:???
DATE文の質問が続いているけど、
557が言うようにSQLだけで処理するべきじゃないの?
俺はいつもそうしてるんだがw

PHPで処理するとしたら、一度登録データと照合して
それを配列に入れてまた出力…って感じでこっちの方が重そうだが。

566 :NAME IS NULL:2008/10/06(月) 00:35:04 ID:???
先月の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)


567 :NAME IS NULL:2008/10/06(月) 03:49:08 ID:???
>>566

ぬぉーーー!!!

ありがとうございます(T.T)

感謝感激です=3=3=3=3

そっか、そういう手があったんですね。ほんとありがとうでした。

568 :NAME IS NULL:2008/10/06(月) 12:46:52 ID:???
MYSQLとSQLliteってどうちがうの?

569 :NAME IS NULL:2008/10/06(月) 13:05:53 ID:???
AというデータベースにあるテーブルをBというデータベースに移したいのですが簡単に移せるコマンドなどあるでしょうか?
どちらも同じサーバです。


570 :NAME IS NULL:2008/10/06(月) 13:09:40 ID:???
mysqlはライセンスが糞だけどsqliteは真に自由

571 :NAME IS NULL:2008/10/06(月) 13:16:38 ID:???
○思想的な
MySQLはデータを保管するサーバ。
多数のプロセスやリモートサーバからアクセスされる前提で作られている。
SQLiteはローカルファイルを読み書きするライブラリだと思っておけばよい。
ネットワーク越しのアクセスは想定されていないし、ユーザ管理もできない。

○ライセンス的な
MySQLは有料を含む特殊なライセンスで縛られている。
SQLiteはパブリックドメインなので何をしても良い。

○技術的な
MySQLはセットアップもチューニングも複雑で、バックアップもSQLダンプせにゃならんので使いこなしが大変。
SQLiteは大規模な用途には不向き。メモリが溢れる。でも全OS共通のファイルベースなのでハンドリングが楽。

こんなところか?

572 :569:2008/10/06(月) 15:24:01 ID:???
おねがいします

573 :NAME IS NULL:2008/10/06(月) 15:42:43 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 〜


575 :NAME IS NULL:2008/10/07(火) 10:51:38 ID:???
サーバのバージョン: 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

そこでそれぞれの特徴とか長所短所とか理由とか他のカッコイイ方法などを
教えていただけるととてもうれしいです、教えてください。

576 :NAME IS NULL:2008/10/07(火) 13:57:55 ID:???
テーブルごとに分割って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に関する情報が少ないので、
詳しい情報を持っている方がいらしたら教えて下さい。

578 :NAME IS NULL:2008/10/07(火) 18:46:42 ID:???
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をつくってくれる)、
どんどん使っていいんじゃないだろうか。

579 :NAME IS NULL:2008/10/07(火) 19:45:52 ID:???
登録月から今月まで何ヶ月経過しているか出したいのですが、以下の様にテスト
していますがうまくいきません。(日でなく月の値です)

登録日は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

どこが悪いのでしょうか?お知恵を拝借させて下さい!

580 :NAME IS NULL:2008/10/07(火) 19:58:06 ID:???
なんか根本的にまちがってる気がしてきた。
上のやり方だと、成功したとしても先月の日付はでるけど、1にはならない。。。orz

頭が混乱してきました。。。今夜中に終わるのか。。。

581 :NAME IS NULL:2008/10/07(火) 20:04:37 ID:???
自己解決しました!

select month(current_date)-month('2008-09-07 00:00:00');
1

で行けました!ありがとうございました!

582 :NAME IS NULL:2008/10/07(火) 23:51:45 ID:???
http://www.sanisoft.com/blog/2007/07/18/related-tags-search-by-tags-in-cheesecake-photoblog/
の下のほうのWHERE IN使ってるほうで
ソーシャルブックマークの関連タグ機能を作ってるんですけど
WHERE INのせいなのかサブクエリのせいなのか
すごい遅いんですけど
早くする方法ないですか?

583 :NAME IS NULL:2008/10/08(水) 00:26:43 ID:???
>>581
一人上手乙。

ところで、そのクエリだと登録日が去年の12月とかだと -2 にならない?

584 :NAME IS NULL:2008/10/08(水) 00:50:44 ID:???
すみません詳しい人教えてください。
MySQL5.1でrawデバイスの上にDB乗せた人はいますか?やっぱり速いですか?
MyISAMよりInnoDBのほうが効果てきめんですか?
ttp://www.thinkit.co.jp/free/article/0608/1/2/
とか見るとファイルシステムなんてそもそも不要なInnoDBに効果あり一本という気がするのですが。。。


585 :NAME IS NULL:2008/10/08(水) 01:39:55 ID:???
ケースバイケース。
ただ、Rawdeviceの方は、運用上のデメリットが大きいから、あまり使われないと思うが。
SolarisZFSだと、RawDeviceにしてもパフォーマンス上がるどころか落ちるみたいだし。


586 :575:2008/10/08(水) 08:49:10 ID:???
>>576 >>578
返答、情報ありがとうございます。
実は前にfile_per_tableで一度トラブって、最近はビビってdump、restoreしてました。
もう一度勇気とテスト環境を出してがんばってみます。

587 :NAME IS NULL:2008/10/08(水) 09:40:16 ID:???
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にしたいんだけど、どすればいいんでしょーか (´・ω・`)

実装前にここ見に来てよかった・゚・(つД`)・゚・

589 :NAME IS NULL:2008/10/08(水) 16:49:02 ID:???
そりゃ年も考慮して差をとらないからだろ。

590 :581:2008/10/08(水) 18:02:23 ID:???
>>589

うん。

でどやってとるの?。。。

591 :NAME IS NULL:2008/10/08(水) 18:05:43 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:???
色々ググって見ました。
ttp://jp.superuser.co.kr/home/lecture/index.php?cateNo=3&secNo=16&theNo=46&leccode=328
とか見ると5%くらいしか性能違わないみたいですね。
Windowsの例があんまりないのが寂しいが。。。
ああちょっとがっかり。


595 :NAME IS NULL:2008/10/09(木) 16:34:52 ID:???
ある特定のカラムに1, 2, 3, ..., nまでをinsertとかupdateするにはどうしたらいいですか?
sqlとストアドプロシージャのどちらに解決方法があるかわかんなくてここで質問・・・、ここ総合だけどいいのかな!


現在プライマリキーを外部のプライマリキーと一致させようとしてまして、
外部キーがnullのところは1から順に採番させようとおもっています。先の方にデータが無いやつでして。

いったんあるカラムにプライマリキーっぽい列をつくって制約を変更させようとしています。

596 :595:2008/10/09(木) 20:13:05 ID:???
解決しました

597 :NAME IS NULL:2008/10/09(木) 20:44:44 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で文字化けしない方法はあるのでしょうか?

599 :NAME IS NULL:2008/10/10(金) 03:36:29 ID:???
目に見えるもが真実とは限らない。
コードが何か調べてみよう。
$ 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を使っています。

603 :NAME IS NULL:2008/10/10(金) 22:13:14 ID:???
>>602
両方ともprimaryにしておきゃ良いんじゃない?

604 :NAME IS NULL:2008/10/10(金) 22:19:38 ID:???
>>603
それだと片方重複でNGになっちゃう。

条件分岐はSQLではやらないほうがいいと思うけど。

605 :NAME IS NULL:2008/10/10(金) 22:27:20 ID:???
>>604
NGって?
エラー無視しておけば良いだけでは?

606 :602:2008/10/10(金) 22:30:05 ID:???
>>603-605
あくまでも「両方共に一致する場合」なんです。
例えばidが2でnameがaaaだと登録出来るようにしたいのです。
primaryだとそれは無理なのではないでしょうか?

PHPを使って、1回毎にSELECTで登録されているか否かを判定して
対処しようとも思ったのですが、件数が増えると負荷がかかりすぎるので
なんとかSQLで対処出来ないものか?っと悩んでいます。

607 :NAME IS NULL:2008/10/10(金) 22:39:57 ID:???
存在するかどうかを判定する部分と挿入する部分はアトミックにしておかないと。
存在しないと思っている間に、
   他の人が存在しないから挿入。
挿入しようとして、、、エラーか二重挿入か。。。
となるよ。


608 :NAME IS NULL:2008/10/10(金) 22:51:41 ID:???
そんなものは、書き込みロックだコノヤロウ。
読み取りは複合インデックスで間に合うだろ。常識的な量なら。

609 :NAME IS NULL:2008/10/11(土) 00:19:00 ID:???
>>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 |
+------+

611 :NAME IS NULL:2008/10/11(土) 05:41:02 ID:???
複合キーが使えるとは限らないのでは?
直接SQL叩くわけじゃなからろうから。

612 :602:2008/10/11(土) 09:29:31 ID:???
みなさん、ありがとうございます!複合キーの存在を知りませんでした。

複合キーを指定すれば、双方に一致する重複キーは登録出来ませんでした。
ソースも提示していただき、ありがとうございました。勉強になりました。

613 :NAME IS NULL:2008/10/11(土) 10:10:03 ID:???
>>611
別にコンソールから出なくても
phpMyAdminとかでも普通に設定できるんだけどね。


614 :NAME IS NULL:2008/10/12(日) 23:24:51 ID:???
phpmyadminていうのは、
もしかして、データーベースの設計はできるけど
その中にデータ-を突っ込むのはphpのコードを
書かないとできないの?

615 :NAME IS NULL:2008/10/13(月) 16:36:39 ID:???
>>614
できるよ
CSVぶっかけとかもいける

616 :NAME IS NULL:2008/10/13(月) 21:50:48 ID:???
下の様なテーブル構成のテーブルがあったとして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時の速度にどんな影響が出るでしょうか?

617 :NAME IS NULL:2008/10/14(火) 05:29:11 ID:???
text(id,type,text) にどんなINDEXを張るかによる

618 :NAME IS NULL:2008/10/14(火) 09:29:20 ID:???
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の問題だったのですが、そんなのでしょうか?

お願いいたします


621 :NAME IS NULL:2008/10/14(火) 13:07:15 ID:???
>>320
5.0.62で再現しない。
バージョンいくつ?

622 :621:2008/10/14(火) 13:07:51 ID:???
間違えた。
>>621>>620 宛て。

623 :620:2008/10/14(火) 15:23:35 ID:w3Po+6Kv
>>621
レスありがとうございます

5.0.45です。
CENT OS5 でYUMでパッケージから入れたやつです。

624 :NAME IS NULL:2008/10/14(火) 17:59:28 ID:???
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
質問です。
内部結合と外部結合のどちらもできる場合どちらを使うべきでしょうか?

626 :NAME IS NULL:2008/10/15(水) 12:26:45 ID:???
状況によるでしょ、適切な方を使えばいい。

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

628 :NAME IS NULL:2008/10/15(水) 17:28:07 ID:???
連番ふってインデックス用意すれば?

629 :627:2008/10/15(水) 17:36:43 ID:48BARsZo
>>628
レスありがとうございます。
message_idというカラムにauto_incrementを使用し、プライマリキーとして使用しています。
order by区で指定しているカラムはプライマリキーのカラムです。

630 :NAME IS NULL:2008/10/15(水) 17:41:50 ID:???
message_id >= 100000 and message_id < 100030

631 :627:2008/10/15(水) 17:53:09 ID:48BARsZo
>>630
レス有難うございます。
その方法も考えたのですが、DELETE文は流せなくなる(連番に空きが出来る為)のと、
他のカラム(書き込み時間など)でのソートが出来なくなると思います。

DELETE文は当初から流すつもりはないのでいいのですが。
他のカラムでのソートは結構ありえます。
INDEXが張られている他のカラムでも迅速に結果を抽出できたらと思っています。

632 :NAME IS NULL:2008/10/15(水) 18:04:44 ID:???
条件の後出しは嫌われるよ。

LIMIT対象が10万とか100万になったら今のmysqlでは遅いのはどうにも
なんないと思う。whereで適切に対象を絞れるようなデータの持ち方を
工夫しろとしかいえないな。

633 :NAME IS NULL:2008/10/15(水) 18:08:36 ID:???
そのLIMIT の数値が少ないときは速くなるの?
EXPLAINとってみた?
まあ構造考えた方がいいかもね。

634 :627:2008/10/15(水) 18:08:40 ID:48BARsZo
>>632
レス有難うございます。
最初に記述しておくべきでしたね、以後気をつけます。

やはりどうにもならないですか…。
有難うございます、勉強になりました。

635 :NAME IS NULL:2008/10/15(水) 18:09:20 ID:???
っと、リロードしてなかったー

636 :627:2008/10/15(水) 18:14:03 ID:48BARsZo
>>633
EXPLAINはもちろん取っています。
keyにはPRIMARYが入っているので、問題なくINDEXは使われていると思います。
LIMITの数値が少ないときには0.1秒未満なので十分な速さです。

637 :NAME IS NULL:2008/10/15(水) 18:19:51 ID:???
結局、「limit の offset が百万というのを、何か別のindexの掛ったキーから取り出せないか」ということに尽きるのでは。
offsetきっかり百万から30個欲しいというシチュエーションが、どういうものか、想像が付かないけど。

638 :627:2008/10/15(水) 18:23:37 ID:48BARsZo
>>637
管理用ページに付ける、
ページング付で各カラムでソート出来る、記事一覧表示などの際ですね。

639 :NAME IS NULL:2008/10/15(水) 18:29:13 ID:???
探すのが人間だとそれはちょっと苦しいかな

640 :NAME IS NULL:2008/10/15(水) 19:49:04 ID:???
念のため、MySQL以外でも厳しいクエリなので誤解なきよう

641 :NAME IS NULL:2008/10/15(水) 21:18:33 ID:???
全てをDBに載せるんじゃなくてハッシュと併用すれば?


642 :NAME IS NULL:2008/10/16(木) 09:03:27 ID:???
しょっちゅう更新されるならあれだが、そうじゃないなら、delete のたびに
連番を振り直して primary キーと対応させたテーブルを作って join するとか。

643 :620:2008/10/16(木) 10:02:49 ID:mFFT7Z7j
>>624
遅レスすいません
こんな感じになりました
+-----------------+------------------------------------------------------------------------+
| station_frgn | hex(station_frgn) |
+-----------------+------------------------------------------------------------------------+
| とうきょう | C3A3C281C2A8C3A3C281E280A0C3A3C281C28DC3A3E2809AE280A1C3A3C281E280A0 |
| おぎくぼ | C3A3C281C5A0C3A3C281C5BDC3A3C281C28FC3A3C281C2BC |
| しんじゅく | C3A3C281E28094C3A3E2809AE2809CC3A3C281CB9CC3A3E2809AE280A6C3A3C281C28F |
| よつや | C3A3E2809ACB86C3A3C281C2A4C3A3E2809AE2809E |
+-----------------+------------------------------------------------------------------------+


644 :NAME IS NULL:2008/10/16(木) 10:47:40 ID:???
なんだそりゃw
UTF-8文字列を、さらにUTF-8エンコードするとそうなるな。

645 :NAME IS NULL:2008/10/16(木) 12:13:57 ID:rARIjcbd
あるテーブルの主キーを別な列に変えました。
そのときの新しいカラムが後ろにあるのですが、これをテーブルの先頭側に移動するには
どうしたらいいでしょうか?

またこの変更から気になったのですが、MySQLは必ず主キーの順で取り出されると
どこかで目にしたと思っていたのに、適当なselectだと元の主キーの順っぽく出てきます。
どこかにこの情報が格納されててanalyzeとかするとこういうのはきれいになったりするのでしょうか。
多少のキーワードでもいただければうれしいです。

>>638
同じような理由で、うちはwordpressっていうブログのデータベースにそれなりの数の記事突っ込ん
だら管理画面からじゃ管理できなくなりました。
しょっぱすぎるpkey直接指定の管理画面を用意してほぼ手作業(フィールドの直接編集っぽいやつ)
で編集してます。

646 :NAME IS NULL:2008/10/16(木) 12:18:47 ID:???
>>645
RDBMSにはそういった順番の概念はない。
順番が必要なら必ずORDER BYすること。

647 :645:2008/10/16(木) 13:07:05 ID:???
>>646
どこでこんな間違いを覚えてきたのか、某okwaveにも書いてありました。
> マニュアルにも「order by指定がない場合は、順序保証しない」ことは明記されています。
postgresql出身で、初めて知ったときはpkey順に保証されてるんだーmysqlってふしぎーとか思ってました。
ひどい思い違い乙。

648 :NAME IS NULL:2008/10/16(木) 13:24:53 ID:???
インデックスが使われたときはインデックス順、使われなければ格納順な気がする。
後者は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)

649 :NAME IS NULL:2008/10/16(木) 13:44:24 ID:???
>>648
なるほど、インデックスを利用しているか否かによって違うってのは
意識したこと無かったです。そして感覚的に納得できます。

650 :NAME IS NULL:2008/10/16(木) 14:03:37 ID:???
>>647
RDBMSにはそういう概念が無いと言っている
実際、キミは困っているんだろ?

651 :NAME IS NULL:2008/10/16(木) 14:42:23 ID:???
>>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
一応、解決策とはいえないまでもパーティショニングを行ったところ、かなりのパフォーマンス向上になりました。
報告だけさせて頂きます。

654 :NAME IS NULL:2008/10/16(木) 15:09:49 ID:???
何分割にしたかとかいくつに分けたとかドンくらい速くなったかとか
レポートキボン

655 :NAME IS NULL:2008/10/16(木) 15:25:33 ID:???
>>650
いえ、困っていません。
テストデータをselectしたときに気分が悪くなった、というだけです。
誤った認識が心に疑問を投げかけていたのです。

前述のカラム順序も実装させるプログラムではカラム名で取り出すので問題ありませんが、
select * って書いたときにこれまでは一番左にpkeyがあったのに、今じゃ真ん中に
pkeyがある、ってのがムカつくだけです。
order byにしろカラムの順序にしろ、実用性に欠ける質問でごめんなさい。

656 :NAME IS NULL:2008/10/16(木) 15:34:29 ID:???
カラムの並び順は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の解説に
「文字セットを持たず、ソートと比較は値の中の数値バイトに基づいているという意味です。」
というのがあるけどこれでしょうか?

ということは、大文字と小文字をきっちり分けたいデータはソートがうまく出来ないってことでしょうか?
これは日本語だけの問題ですか?
もしかして、ソートしたいカラムは大文字・小文字の区別はつけられなのですか?


659 :NAME IS NULL:2008/10/16(木) 19:17:13 ID:???
>>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

661 :NAME IS NULL:2008/10/16(木) 20:22:41 ID:???
ごめん
> 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 しか表示されないんでしょうか?

663 :NAME IS NULL:2008/10/17(金) 08:29:31 ID:???
load data infile で datetime型に"Oct 16 2008 12:00AM"このような形式の
データを読み込みたいのですが可能でしょうか?
普通にやると0000-00-00 00:00:00で読み込まれてしまいます

MySQL5.0.67+CentOS5.2
glibc2.3のgz形式のバイナリパッケージを使っています


よろしくお願いいたします

664 :NAME IS NULL:2008/10/17(金) 10:28:08 ID:???
>>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の認定試験にこの手の問題が出ます。

665 :NAME IS NULL:2008/10/17(金) 12:41:24 ID:???
MySQLの認定試験って市場価値あるの?
単に、OracleMasterのマネして金儲けしようとしているだけじゃないの?

666 :NAME IS NULL:2008/10/17(金) 14:43:53 ID:???
技術者を雇う側からいうと、人事に話を通しやすいから、何であれ認定試験の資格があるとありがたい。
「この人はよくできる人です」と「この人は××のゴールド認定技術者です」では、聞こえ方が全然違う。

667 :663:2008/10/17(金) 15:06:54 ID:???
>>664

できました!
どうもありがとうございました。

668 :NAME IS NULL:2008/10/17(金) 16:08:33 ID:???
>>666
「この人は、MySQLの認定技術者です」で、本当に聞こえがいいの?

669 :NAME IS NULL:2008/10/17(金) 16:17:55 ID:???
grant文で権限をつけるデータベースを複数指定したい場合はどう知ればいいのでしょうか?
grant all privileges on hoge,hoge2.* to 'hoge' identified by 'hogehoge';

,区切りでやってみましたが無理でした。

670 :NAME IS NULL:2008/10/17(金) 16:23:48 ID:???
>データベースを複数指定したい場合
ワイルドカード以外はできない。

671 :NAME IS NULL:2008/10/17(金) 16:28:11 ID:???
>670さん
ありがとうございます。
以下のようにワイルドカードで指定してもできません。
複数は無理なのでしょうか?

grant all privileges on hoge*.* to 'hoge' identified by 'hogehoge';


672 :NAME IS NULL:2008/10/17(金) 16:53:05 ID:???
100カラムあるテーブルと10カラムのテーブルが10こあるのでは
どちらが効率的に select,insert,updateできるでしょうか?

10カラムの方はselect時に個別(1テーブル)で事足りるものもありますしすべてを連結させる必要があるときもあります。
型はtinyint〜textまで含まれています。

100個の方はビューを作るので擬似的に分けることはします。(なので管理がめんどくさいということはないです)

673 :NAME IS NULL:2008/10/17(金) 17:10:21 ID:???
>>672
ケースバイケース。
てか効率だけで決めたら後々苦労するよ。

SELECT対象が10カラムのテーブル1個で済む場合、100カラムのテーブルを
使うよりもサイズが小さいためメモリのヒット率向上が見込まれる。
ディスクI/Oが減るため性能がよい。

SELECT対象テーブルが多いとだんだん悪くなる。

10テーブルへのinsert、updateは整合性を取るためにbegin〜endで囲む
ことになる。気をつけないとデッドロックを起こす。

InnoDBのページサイズは16KB。
100カラムのテーブルはレコード長が伸びるため格納効率が悪くなる。
例えばレコード長6KBだと2レコードだけ入って、4KBすきまができてしまう。

MySQLはオプティマイザがあまり賢くないので多数のテーブルの結合は
おすすめしない。10テーブル結合して数分返ってこなくても泣かないこと。

まだまだ懸念点は出てくるはず
まずは教科書通りに設計して、実機で検証すべき


674 :NAME IS NULL:2008/10/17(金) 17:23:38 ID:???
>>671
マニュアル見て。ttp://dev.mysql.com/doc/refman/5.0/en/grant.html

675 :NAME IS NULL:2008/10/17(金) 17:43:29 ID:???
>>673
ありがとうございます!
とても参考になりました。

InnoDBでした。後出しすみません。

一緒に使うパラメータはなるべく一つにまとめようと思います。
またすべてを使うことはあまりないので(管理時のみ)管理ページを改める方向でいきます。

本当にありがとうございました。

676 :NAME IS NULL:2008/10/17(金) 17:52:02 ID:???
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などをはったほうがいいでしょうか?

677 :NAME IS NULL:2008/10/17(金) 18:03:02 ID:???
>>676
Primary Keyの等価条件があればMySQLは迷わずそれを使う。
idだけで1件に絞り込めるので、passwd、あるいは(id, passwd)に
indexを張る必要はありません。

>先にidを探してそのIDと合致するデータのpasswdの正否を判定するという認識で間違いないでしょうか?
yes


678 :NAME IS NULL:2008/10/17(金) 18:03:48 ID:???
ただしそれ、インジェクションの典型的な例に出るやつだから注意ねw

679 :NAME IS NULL:2008/10/17(金) 18:20:04 ID:???
>>677
やはりそうだったんですね^^

orderとかでソートする値にはindexをつけるべきですか?

たとえば先ほどのテーブルを
id int,
sequence int,
unique key(id,sequence)としたばあいはどうなるでしょうか?

2度質問して申し訳ないですがお願いします。

680 :NAME IS NULL:2008/10/17(金) 18:24:36 ID:???
>>678
便乗で申し訳ないが、なぜそれがインジェクションになるの?

681 :NAME IS NULL:2008/10/17(金) 18:48:26 ID:???
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になって常に結果が見つかることになってしまう。

682 :NAME IS NULL:2008/10/17(金) 19:24:09 ID:???
>>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';

683 :NAME IS NULL:2008/10/17(金) 19:57:43 ID:???
>>681
where の比較対象の定数部分にユーザ入力をそのまま突っ込むような設計してたら、これに限らず何だって同じ。
prepared statement 使うなりすれば。

684 :NAME IS NULL:2008/10/17(金) 22:17:24 ID:???
ttp://www.itmedia.co.jp/news/articles/0806/05/news047.html
とか既出?
ちょっぴり期待しています。

685 :NAME IS NULL:2008/10/18(土) 20:08:43 ID:EcpiaIsa
ご存じの方がいらっしゃったらお教え下さい。

MySQL Workbench の日本語化は可能でしょうか?

いろいろ調べてみたのですが、前身のDBDesigner4の日本語化は
見つかったのですが、それ以降は見つけられませんでした。


686 :NAME IS NULL:2008/10/18(土) 21:56:21 ID:???
>>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のポート設定してあります

何か設定忘れてるかな?

688 :NAME IS NULL:2008/10/19(日) 11:36:26 ID:???
Windowsのコマンドプロンプトからtelnetや
TeraTermProから直接 3306 を叩くとどうなる?
悪いのはあっちかこっちかはてまた途中か。。。


689 :NAME IS NULL:2008/10/19(日) 11:46:28 ID:???
>SERVER アパッチ
ということは、外から直接DBサーバに繋ぐのではなく、外からはhttp を叩き、apache が DBサーバを呼ぶ、という理解でいいのか?
それなら、野外でノートと、とか何とか無関係では。

690 :NAME IS NULL:2008/10/20(月) 15:31:22 ID:???
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)

色々調べたのですが、原因が分かりませんでした。
どの様にすれば、解決するでしょうか?
ご教授頂ければと思います。

692 :NAME IS NULL:2008/10/20(月) 18:36:09 ID:???
それぞれのバージョン、プラットフォームも書かずによー質問できるな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)

以上です。
他にも何か足らないものがあれば、宜しく調べますのでお願い致します。

694 :NAME IS NULL:2008/10/20(月) 22:56:32 ID:???
はじめて、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!") ;

}

?>

695 :NAME IS NULL:2008/10/21(火) 08:58:33 ID:???
インデックスの張り方で悩んでいます。
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のものがあれば早く取り出せてると思うのですが、
そうでない場合には頭から探してるようで遅いです。

○○調べてこいや、とかの助言でもいただけたらうれしいです。

696 :NAME IS NULL:2008/10/21(火) 09:27:53 ID:???
EXPLAIN調べてこいや


インデックスの張り方が多分逆の予感。

697 :NAME IS NULL:2008/10/21(火) 10:05:52 ID:???
インデックスは指定したキーの順であらかじめソートした索引だと
思えばいい。

更新日時を先にもってきたらその順番で並んでしまうだけでその
あとに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
まだはっきり原因がわかったわけではないのですが
mysql -u root --default-character-set=utf8 dbname
と接続して日本語をINSERTすると>>624のようなHEX値になりました。

不思議なのはWEBページに何も変換しないで出力すると
どっちの場合もページのコードをUTF8で、問題なく表示されるんですよね。


念のため今までの流れ
>>620
>>621
>>623
>>624
>>643
>>651
>>657
>>658
>>659
>>660
>>661

700 :695:2008/10/21(火) 13:06:49 ID:???
インデックス張り直しでうまくいきました。
access_dateの古いものから順次新しいものに書き換える、というのがいい速度で動きました。
勉強になりましたありがとうございました。

701 :NAME IS NULL:2008/10/21(火) 14:03:39 ID:???
mysqlclientライブラリを使用したプログラムをフリーソフトとして公開したいんだけど、
GPLにしたくない場合(バイナリのみ配布)は商用ライセンスをいくつ買わないといけないの?
ダウンロードされた回数だけ必要になるなんてことないよね?

702 :NAME IS NULL:2008/10/21(火) 14:08:36 ID:???
>>701
組み込んで売るための
OEMライセンスというのがあります。
値段はしらない

703 :643:2008/10/21(火) 15:47:10 ID:5o5JIZbw
ごめんなさい
SET NAMES utf8
を忘れていた(知らなかった)だけみたいです。

でも、なんで、ホスト言語で文字コード何もいじってないのに
ページではUTF8で表示されてたんですかね?

704 :NAME IS NULL:2008/10/21(火) 16:21:11 ID:???
だからUTF8エンコード2回かけるとそうなるって言ったじゃない。
ユニコード文字にしたくてデコードして次に回したら
そいつもUTF8と判断してデコードしたと

705 :伊藤 誠:2008/10/21(火) 20:32:37 ID:BZveQiyh
通りすがりの質問で失礼します。

こんなテーブルがあるとします。

商品管理テーブル
・商品ID←主キーかつオートインクリメント
・商品名
・JANコード
・メーカー

価格管理テーブル
・価格ID←主キーかつオートインクリメント
・商品ID
・定価
・原価
・売価

ちなみに、商品IDと価格IDはユニークであるために、
主キーかつオートインクリメントとしています。

本題は、ストアドプロシジャを使って
新規に商品の登録をする時にどうしたらよいかです。
私は、mysql5.0系を使用しています。

テーブルを二つに分けたのは、価格の変更等に対応するためです。
詳細なテーブルデータは割愛させていただきます。

価格管理テーブルの商品IDは商品管理テーブルと紐付けるための
カラムですが、オートインクリメントであるため、商品データを
商品管理テーブルに格納してからでしか、確定しません。

商品データの登録→価格データの登録

とすれば、良いのかもしれませんがどのようにして商品管理テーブル
から商品IDを拾えばよいのでしょうか?最新の登録データを拾うでは
不完全ではないでしょうか?→の間に他者による登録があるかも知れ
ません。それとも、テーブルの仕様から見直すべきなのでしょうか?

どうかご教示ください。

706 :NAME IS NULL:2008/10/22(水) 00:05:04 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
なぜ殺たし
じゃなくて・・・

なぜダメなのですか

710 :NAME IS NULL:2008/10/22(水) 09:25:04 ID:???
>>705
つLAST_INSERT_ID()

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の主キーインデックス?はちょっと特殊なんだよーとかをブログなどでかじり見するだけで、それを理解
できる脳みそはなく次なる書籍を探しておる次第であります。

712 :NAME IS NULL:2008/10/22(水) 13:59:25 ID:???
DBサーバーPCで作業する人が作成者のみ場合ユーザーをlocalhostに設定する意味ってあるんですか?
ローカルシステムはrootで入ると考えると、全てのログイン設定はリモートのみでいいような気がするんですが?

ばかげた質問ですが教えてくだちぃ。


713 :NAME IS NULL:2008/10/22(水) 19:59:51 ID:???
>ローカルシステムは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でレプリケーションの設定を行っています。
マスター・スレーブを切替を行う場合、どのような設定が必要になるのでしょうか。
コマンドで、簡単に切替が出来たりしないでしょうか。

717 :NAME IS NULL:2008/10/23(木) 17:47:44 ID:???
思いっきり初心者で申し訳ないのですが、
データベースを使った顧客管理を考えています。

来店するごとに使った金額を

Aさん ○○歳 [1回目]○○円 [2回目]○○円
Bさん ××歳 [1回目]××円 [2回目]××円 [3回目]○○円
Cさん △△歳 [1回目]△△円

といったように毎回の買い物金額を格納したいのですが、
私の知識では「カラムを追加していく」以外に方法を知りません。
でも例えば「Aさんが1000回来店したら・・・」と考えるとこの方法では
無理な気がします。

こういう場合はテーブルを増やす方がいいのでしょうか?
他にもっとスマートな方法があったりしますか?

どなたか教えてくださいよろしくお願いします。


718 :NAME IS NULL:2008/10/23(木) 18:02:06 ID:???
テーブル1
1 Aさん ○○歳
2 Bさん ××歳
3 Cさん △△歳

テーブル2
1 1 ○○円
2 1 ○○円
3 2 ××円
4 2 ××円
5 2 ○○円
6 3 △△円

719 :NAME IS NULL:2008/10/23(木) 18:02:29 ID:???
>>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 来店日 金額

ですね。


723 :NAME IS NULL:2008/10/23(木) 23:51:35 ID:???
DBの設計について書いてある情報を探せばいい。
SQLの話ではない。


724 :NAME IS NULL:2008/10/24(金) 10:40:38 ID:yyHCFjKP
5.0です。

特定のカラムを基準にしてソートをした際に、
それぞれのレコードに1〜の連番を付与したいのですが可能でしょうか?
いわゆるRANK関数のように、同率をまとめてしまうのではなく、
欠番の無い連番を付与したいと思っています。

何卒、ご教示のほどお願いいたします。


725 :NAME IS NULL:2008/10/24(金) 10:47:27 ID:???
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を使わない形にしています。


728 :NAME IS NULL:2008/10/24(金) 11:28:07 ID:???
↑の「今は」の箇所は

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;

では、駄目なの?

730 :NAME IS NULL:2008/10/24(金) 20:21:40 ID:???
>>728 のどこがまずいの?

731 :NAME IS NULL:2008/10/24(金) 23:00:48 ID:???
質問

phpmyadminでデーターベース作るじゃん
そのときの文字コードを後から変更できるの?

732 :NAME IS NULL:2008/10/25(土) 00:22:19 ID:???
じゃん

733 :NAME IS NULL:2008/10/25(土) 01:50:25 ID:???
じゃん

734 :NAME IS NULL:2008/10/25(土) 02:40:49 ID:???
じゃんじゃんいこうぜ!

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 :NAME IS NULL:2008/10/25(土) 19:12:51 ID:???
>>731
できるじゃん

739 :NAME IS NULL:2008/10/25(土) 20:45:40 ID:???
>>738
どうやるの?
「文字コードの変更」
ってボタンがある?

740 :NAME IS NULL:2008/10/25(土) 21:45:28 ID:jm6nkPuu
DATETIME型のカラムでWHEREかけてSELECTすると抜けが出るんだけど、俺だけ?
バグなの?これ?

741 :NAME IS NULL:2008/10/25(土) 22:23:14 ID:???
>>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テーブルから削除」は
どうやって書いたら格好いいでしょうか

743 :NAME IS NULL:2008/10/25(土) 22:58:20 ID:???
>>742
DELETE FROM A WHERE hoge NOT IN (SELECT hoge FROM B)
じゃダメなの?

744 :742:2008/10/25(土) 23:01:13 ID:???
>>743
なるほど NOT か・・・

745 :NAME IS NULL:2008/10/26(日) 00:12:27 ID:+O8nbZ0E
>>741
そっか。レスありがと。
他で出てないなら俺のミスだな。
しっかし、NOW()で取得した時刻をフォームで渡してその時刻以降をSELECTしてるだけなんだけどな。
極たまに抜けが出るのよ。
URLエンコード・デコードもちゃんとやってるし、なんだろうなぁ。

原因探ってみます。

746 :NAME IS NULL:2008/10/26(日) 01:09:48 ID:???
おまえの説明では何が抜けたんだかさっぱりわからんのでなんとも
言えんな。抜けたというレコードの値とselect文をちゃんと示せよ。

747 :NAME IS NULL:2008/10/26(日) 01:17:13 ID:+O8nbZ0E
>>746
いや。他でそういう奴がいないんだったら間違いなくスクリプト側のミスだろうって事。
INNODBで行ロックかかっててもSELECTで抽出されないなんて事はないもんねぇ。

不正な値が入ってるわけでも、型を間違っているわけでもありません。


748 :NAME IS NULL:2008/10/26(日) 01:39:17 ID:???
いろいろ試してたら、SELECT関係ない事がわかった。
SELECT * FROM table_name ORDER BY date_time LIMIT 10;

これで抜けが出る。
DATETIME型ってひょっとしてORDER使えない?

それともやっぱりアプリケーション側のミスか・・・

749 :NAME IS NULL:2008/10/26(日) 01:51:35 ID:???
>>748
SELECT関係ない→WHERE関係ない

とりあえずアプリ介さずに再現するか試してみます。
抜ける頻度は0.5%ぐらい。決まった行が必ず抜けるわけではない。99.5%のクエリは思ったとおりの結果が出る。


750 :NAME IS NULL:2008/10/26(日) 01:55:57 ID:???
状況を説明する気がないことはわかった。一人で悩んでください。


751 :NAME IS NULL:2008/10/26(日) 02:03:07 ID:???
>>750
何が知りたいんだよ。こんだけ状況説明してんのに。

型指定間違いとか、そんな昨日SQL始めました的な事聞いてるわけじゃないんだけど。

752 :NAME IS NULL:2008/10/26(日) 08:32:57 ID:???
ttp://dev.mysql.com/doc/ 落ちてる ?

753 :NAME IS NULL:2008/10/26(日) 08:44:10 ID:???
whereつけないorder byだけで抜けたように見えるというなら、それは
本当に入ってないんだろ。それは入れるつもりの値でない別の値を入れて
しまったか、値は正しいがselectの時点では入ってないかのどちらか。

754 :NAME IS NULL:2008/10/26(日) 10:24:19 ID:???
はっきりした。
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つずつ更新する方法しかないのでしょうか?

756 :NAME IS NULL:2008/10/26(日) 21:30:54 ID:???
修正

としているのですが、INの中に指定されているIDが存在すると
更新されないのですが、1つでも存在しないのがあると、更新されません。

としているのですが、INの中に指定されているIDが存在すると
更新されるのですが、1つでも存在しないのがあると、更新されません。

757 :NAME IS NULL:2008/10/27(月) 00:52:04 ID:???
当たり前だ。UPDATEっつー命令の意味がわかってんのか、あんたは。
まずは存在しないIDに対してUPDATEを吐くようなヘッポココードを修正しろ。

758 :NAME IS NULL:2008/10/27(月) 01:10:47 ID:???
ランキングとスコア
があるテーブルがあるとして
スコアの大きい順に並び変えて上から順にランキング(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 ってのもあるけど

761 :NAME IS NULL:2008/10/27(月) 04:31:58 ID:???
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は、このように何十時間もプロセスに出続ける物でしょうか?
接続が終了したら、プロセスの時間はリセットされるのでしょうか?

762 :NAME IS NULL:2008/10/27(月) 06:27:51 ID:???
>>755
意味がわからない。何がしたいのか。
where句で該当しないものがupdateされたら逆に困るだろ。

>>761
当然だろ。プロセスが勝手に終了してどうすんだ。お前はサーバーという意味がわかってない。


763 :NAME IS NULL:2008/10/27(月) 10:59:19 ID:???
>>762
apacheってプロセスの時間短いよね。うちはpreforkだけど。
そういうのを以って言ってるんじゃない?sshdも短いし。
わしその辺詳しくないからわからんわ。

764 :755:2008/10/27(月) 11:00:09 ID:???
>>760
いや、追加はしたくないんです。。

>>762
とにかく「複数のレコードのUPDATEを、出来るだけ負荷がかからず行いたい」
と言うのが目的です。確かに存在しないIDが更新されたら困りますが。

更新用のIDリストはログファイルにまとめているので
それの更新をかける時に、削除されているIDがある可能性があるんです。
なので、どのようにしてSQLを組み立てるべきなのか、悩んでいまして・・。

765 :NAME IS NULL:2008/10/27(月) 11:25:59 ID:???
>>764
ほんとにそのSQLで試した?

766 :NAME IS NULL:2008/10/27(月) 11:45:35 ID:???
存在しないid指定しても単に該当するレコードがないからそのidについては
更新されないだけでエラーとかにはならないよな。単に更新件数が減るだけ。

767 :755:2008/10/27(月) 12:25:39 ID:???
>>765-766
>>755に書いたソースで試しましたが、全部が更新されないんです。
自分も「単に更新件数が減るだけ」だと思っていたのですが・・。

だから、INを指定する書き方が悪いのかと思い、方法をお尋ねしました。

768 :NAME IS NULL:2008/10/27(月) 12:33:06 ID:???
おかしいね、環境とバージョン書いてみて

769 :NAME IS NULL:2008/10/27(月) 13:22:30 ID:???
>>754
ゼロから詳しくおしえてください
どうやれば再現できますか?

770 :NAME IS NULL:2008/10/27(月) 14:15:44 ID:???
>>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する方法を教えてやったんだが・・・

773 :NAME IS NULL:2008/10/27(月) 15:01:02 ID:???
いや、質問者は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出来てないってことだけじゃん。

775 :NAME IS NULL:2008/10/27(月) 15:10:06 ID:???
少なくとも俺の手元では存在しない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)

776 :NAME IS NULL:2008/10/27(月) 15:12:18 ID:???
質問者がテーブル構造もろくに書いてないのが問題だが、
いくらなんでも、>>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するの繰り返すと負荷がかかる」
という意見が言えるのではないでしょうか。

どのように質問すれば皆さんに理解して貰える書き方が出来るか
馬鹿な私にはわかりませんので、もう遠慮します。色々ありがとうございました。

780 :NAME IS NULL:2008/10/27(月) 16:00:29 ID:???
>>779
だから全く問題ないのに、結果がおかしいんだろ。
異常が出てるのはそこだけじゃないかもしれないから、
1件ずつ入れて回避するようなことをせずに、根本的に直したほうがいいよ。
インストールしなおしたら?

781 :NAME IS NULL:2008/10/27(月) 16:02:42 ID:???
結局、>>775のような、とは書いてるが実際のテーブルとかそこで使用したSQLとか
結果とか全然あげてないじゃん。あとで自分のミスに気がついて赤面することになるとは思うけど
問題解決したいなら全部さらしたほうがいいと思うよ。

782 :NAME IS NULL:2008/10/27(月) 16:04:27 ID:l/LuSqsB
>>779
君は本買って勉強したほうがいい。ど素人中のど素人だから、今の段階で質問をするべきじゃない。
一回で抽出できりゃ、一回でupdateできるって言ってるだろ。意味がわからないんだから、そうとう知識がないんだよ。

>>780
お前もひどいアドバイスだな。無駄な事させてやるな。

783 :NAME IS NULL:2008/10/27(月) 17:05:10 ID:???
SQL直書きでは上手く動いているけどPHPとかのスクリプトでSQL生成した時に
失敗している気がするな

後からログ拾ってバッチするよりその時一緒に処理するのが一番なんだけどね
例外起きた時にもROLLBACKで整合性を保てるし

784 :NAME IS NULL:2008/10/27(月) 17:47:32 ID:???
>>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|
|東京  |埼玉  |千葉  |
|千葉  |東京  |埼玉  |

結果:東京、千葉、埼玉
のように抽出したいです。よろしくお願いします。

786 :NAME IS NULL:2008/10/27(月) 21:17:57 ID:???
InnoDBにてDELETEは使っちゃダメとスローログに出るんですが、
SELECT1000件に1度ぐらいDELETEを使う頻度であれば、
DELETE単体が遅いだけで、SELECTでの表示には影響を与えないのでしょうか?

787 :NAME IS NULL:2008/10/27(月) 22:20:21 ID:???
>>786
塵も積もr(ry

788 :NAME IS NULL:2008/10/27(月) 23:36:23 ID:???
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ではログインできないのでしょうか?
何か設定が必要でしたら教えてください。
よろしくお願いします。

790 :NAME IS NULL:2008/10/28(火) 02:38:34 ID:???
>>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桁以上の数を挿入しても、問題なく出来ました。
実際は単なる説明で、実際に何かを制限する機能はないのでしょうか。

792 :NAME IS NULL:2008/10/28(火) 08:32:29 ID:???
>>755
話題に乗り遅れた亀だけど。
SELECT * FROM hoge_table where pid not in (1, null);
not inを作るときに右辺にnull値が入ってたんじゃね?とかっていうエスパー回答。

postgresqlのマニュアルっぽいけど。
右辺にNULL値が存在したらIN述語がうまくうごかない
ttp://www.l2tp.org/2008/01/nullin.html

793 :NAME IS NULL:2008/10/28(火) 09:11:43 ID:???
>>791
10.2. 数値タイプより:

>> MySQLがサポートするその他の拡張として、各タイプの基本キーワードに続く
>> カッコ内に整数データタイプの表示幅を指定するオプションがあります(例 INT(4))。
>> この表示幅オプションは、カラムに指定された幅よりも小さい幅の整数値を表示
>> する際に左側をスペースで埋めるために使用されます。

>> この表示幅は、カラムに格納する事ができる値の範囲も、カラムに指定された幅
>> を超える値の表示される桁数も制限しません。例えば、SMALLINT(3) として指定
>> されたカラムは、通常の -32768 から 32767 の SMALLINT 範囲を持ち、そして、
>> 3文字で許容された範囲外の値は3文字以上の文字を使って表示されます。

794 :NAME IS NULL:2008/10/28(火) 09:21:55 ID:???
桁数を指定したいならDECIMALやNUMERIC使え。

795 :NAME IS NULL:2008/10/28(火) 11:11:25 ID:???
>>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

宜しくお願いします。

797 :NAME IS NULL:2008/10/28(火) 13:09:05 ID:???
mysql order by null
でぐぐるといいよ

798 :NAME IS NULL:2008/10/28(火) 13:22:26 ID:???
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を作成しています。
何か良い改善策はありますでしょうか?

799 :NAME IS NULL:2008/10/28(火) 13:26:23 ID:???
>>796
order by -x desc

効率はたぶんよくない(全要素について-x計算してからソートになる)

800 :NAME IS NULL:2008/10/28(火) 13:29:16 ID:???
>>798
mid, idの2項目を並べたインデックスを作れ。

create index i on table(mid, id desc);

801 :NAME IS NULL:2008/10/28(火) 13:37:24 ID:???
>>800
midに既に複合インデックスを他のカラムと作成済みだったのですが、こちらの方が頻度が多いので見直してみます。
INDEXのdescって意味があるんですよね?ちょっとぐぐってきます。

802 :NAME IS NULL:2008/10/28(火) 16:18:19 ID:???
>>794-795
ありがとうございました
今まで使っていて「数字の左側の空白」は意識したことがなかったのですが、
事実上、この数字にはほとんど意味がないってことですね

803 :796:2008/10/29(水) 00:10:16 ID:vK6Gsuhh
>>797, 799
ありがとうございます。

804 :NAME IS NULL:2008/10/29(水) 14:37:48 ID:???
文字列xからフィールド内の要素を検索するという事は可能でしょうか?
つまりxの中にフィールドの要素があるかを検索するという事です。

805 :NAME IS NULL:2008/10/29(水) 15:31:33 ID:???
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 |
+----+---------+

という結果を得たいのですが。

807 :NAME IS NULL:2008/10/29(水) 15:52:33 ID:???
>>804
日本語でおk

808 :NAME IS NULL:2008/10/29(水) 16:09:03 ID:???
>>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)

809 :NAME IS NULL:2008/10/29(水) 16:24:24 ID:???
>>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を足して
アップデートで入れてます。

これで不便は無いのですが
カラムからレコードを取り出さずに直接中の値を加算する事はできないですか?
できたら便利かと思って。

812 :NAME IS NULL:2008/10/29(水) 17:17:48 ID:???
UPDATE table SET col = col + 1 WHERE ・・・

813 :NAME IS NULL:2008/10/29(水) 17:18:54 ID:???
update テーブル名 set 変数名 = 変数名 + 1

でもカラムからレコードを取り出さないとカウンタ表示できないでしょ?

814 :NAME IS NULL:2008/10/29(水) 17:34:36 ID:???
ストアドで加算しつつ取り出すこともできないことはないが・・

815 :NAME IS NULL:2008/10/29(水) 18:20:13 ID:YN+eYbRE
>>812-814
ありがとうございます
さっそく今から試してみます
表示が必要なカウンタは結局取り出さなきゃいけませんが
ファイルのダウンロード数をカウントして自分だけで見るカウンタもあるので、そういうのに使ってみます。

816 :NAME IS NULL:2008/10/30(木) 03:38:59 ID:???
メールサーバ専用のサーバで
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
ありがとうございます。
非常に助かりました。

818 :NAME IS NULL:2008/10/30(木) 10:36:05 ID:???
>>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で対応できないのでしょうか?
テーブル設計自体に問題があるのでしょうか。

820 :NAME IS NULL:2008/10/30(木) 18:12:22 ID:???
>>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のランタイム情報のリロードで増えていくことはありませんでしょうか?

822 :NAME IS NULL:2008/10/30(木) 18:56:15 ID:???
>>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テーブルにも作成しようと思ったのですが、正規化という呪縛にとらわれてしまって・・・
そもそもテーブルをわけない方がいいんですかね?

823 :NAME IS NULL:2008/10/30(木) 19:20:06 ID:???
>>822
(1)と(2)は元のクエリをmysqlが実行するときの内部動作の説明でした。
わかりにくかったらすいません。

d.midをcommentにつくるのは正規化には反するかもしれません。重複
するデータをあちこちに持ちたくないというのはわかります。私もどうして
も速度を稼ぎたいときにしかやりたくないです。mid='hoge'から拾い出される
commentの数がそれほど多くないなら今のままでもなんとかなるんじゃ
ないでしょうか。

824 :NAME IS NULL:2008/10/30(木) 21:07:42 ID:???
>>823
勘違いしました。
現在でもmid='hoge'の該当数が多い場合があるので最適化してるんですが、期待の結果を得るにはd.midを重複させるしかないみたいですね。
あまり正規化にとらわれずにやってみます。

ありがとうございました。

825 :NAME IS NULL:2008/10/30(木) 22:51:49 ID:???
>>811
ロックしなくてもいいのかな?
Apacheだから複数プロセスが走っているような。。。
実用上問題なしかも。
カウンターが正確である必要ないなら。
詳しくは竹村健一先生に聞いてください。


826 :NAME IS NULL:2008/10/31(金) 01:09:52 ID:???
この順番でやればお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;


827 :NAME IS NULL:2008/10/31(金) 01:37:57 ID:???
update counter set count = count + 1;
この時点ではアトミックだからロックとかいらないでしょ
読み出した値を元にいろいろするなら別だけど

828 :NAME IS NULL:2008/10/31(金) 03:55:16 ID:zbhYdBxe
MySQL5.1でInnoDBを使っているのですが、
参照専用で、更新は数ヶ月に1回のテーブルがあります。

参照の回数が非常に多いので、このテーブルを同じ構造のMEORYテーブルを作って、
そこにアクセスするようにしたのですが、これって、クエリーキャッシュという機構があるので、
まったく無駄なことでしょうか?

クエリーキャッシュが働くことによって、MEMORYテーブルを作ったのと同じように、
ディスクアクセスが無くなるということで正しいでしょうか?

作ってしまってから、ディスクキャッシュという機構を知ったので、
いまどうしようか、悩んでいるところです。

829 :NAME IS NULL:2008/10/31(金) 04:51:44 ID:???
クエリキャッシュは、一度処理したクエリの結果を保持しておくもの。
MEMORYはDBをオンメモリで持っておくもの。

一度も処理してないクエリはクエリキャッシュでは高速化できない。
よって、クエリのばらつきが多い場合はMEMORYのほうが有利と言える。

ただしMEMORYといえど検索コストはかかるので、
特定のクエリばっかりの場合は逆にクエリキャッシュのほうが有利とも言える。

830 :NAME IS NULL:2008/11/01(土) 00:20:00 ID:???
MySQL User Conference 2008 よかった

831 :NAME IS NULL:2008/11/01(土) 10:32:05 ID:???
フィールドの移動ってできないのかな?
idってフィールドを3番目に作ったんだけど、
これを1番目に表示するようにしたいんだよね

832 :NAME IS NULL:2008/11/01(土) 10:32:45 ID:???
user
pass
id

今の表示は↑これなんだけど、これを
id
user
pass

にしたい。

833 :NAME IS NULL:2008/11/01(土) 12:08:19 ID:???
alter table test
modify column user varchar(10) after id,
modify column pass varchar(10) after user;

834 :竹村先生曰く:2008/11/01(土) 12:48:08 ID:???
だいたいやね。


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です、よろしくお願いします。

836 :NAME IS NULL:2008/11/01(土) 15:44:05 ID:???
すみません、以下のように修正します
insert into cateTable (`cateName`,`id`) value('スープ',0)
insert into menuTable (`menuName1`,`cateId`,`id`) value('ポタージュ',{$cateId},0)

837 :NAME IS NULL:2008/11/01(土) 15:59:25 ID:???
エラーが発生しているのにメニューテーブルへの処理を続行すること自体がおかしい。
どういう異常パターンで何がしたいの?

838 :NAME IS NULL:2008/11/01(土) 18:15:46 ID:qrtLarIM
>>837
どうもありがとう
カテゴリTABLEへの登録がちゃんと済んだときのみ、メニューTABLEにも
登録するようにしたいんです
自分としては>>835のプログラムで対応を考えてるんですが、、
あれだと、2つめのクエリ(メニューTABLE)が成功するとは限らないし、
失敗した場合は結局 1つめだけ成功・2つめ失敗になります

その辺の対処をどうしたらいいのか、出来ればSQL文の簡単なサンプルと
あわせて教えてもらえるとうれしいです。

839 :NAME IS NULL:2008/11/01(土) 18:17:46 ID:???
そもそも正規化しすぎじゃない? という気がするが。
丸ごとtry&TRANSACTIONかしら。

840 :NAME IS NULL:2008/11/01(土) 18:48:11 ID:qrtLarIM
>>839
どうもありがとうございます
知識不足でtry&TRANSACTIONが良く分からないんですが、、
一つのテーブルにまとめたほうがいいんでしょうか
メニューテーブルの構成を
id, cateName, menuName, priceにして、cateNameに同じ値が延々入るのは
しかたないと開き直ったほうが賢いんだろうか

841 :NAME IS NULL:2008/11/01(土) 19:37:17 ID:???
PHPに限らず、try-catchによる例外処理と
データベースのトランザクションについては、
いまのうちに勉強しといたほうがいいと思います。

try {
 begin;
 insert 1個目;
 insert 2個目;
 commit;
} catch (例外) {
 rollback;
}

842 :NAME IS NULL:2008/11/01(土) 20:15:54 ID:???
>>841
ありがとうございます!
それ、勉強してみます!

843 :NAME IS NULL:2008/11/02(日) 00:21:30 ID:WnUJTCju
アンケートフォームを作ろうと思ってます。
それで、質問項目自体も管理側で自由に設定するとして、
基本の質問 (1)名前(2)性別(3)年齢 に加えて、自由質問も設定できるとします。

そうすると、 (4)好きな食べ物 のときも (4)最近旅行した場所 のときも出てきて
答えがどの質問に対する回答なのかわからなくなり、集計画面を作るときに困ります

最終的には質問ごとの回答をグラフ表示できるようにしたいんですが、、
どうやって回答を収めるテーブルを作るべきでしょうか?
col1 = "山田太郎", col2="男", col3="25歳", col4="好きな食べ物,ラーメン"
みたいに質問と答えをまとめて登録するのもいいかなぁと思いますが 正規化を
考えると良くないですよね
すみませんが、スマートなテーブルの作り方、データの収め方をアドバイスお願いします。
(テーブルは、質問格納テーブル と 回答格納テーブルがあるとしてください)

844 :NAME IS NULL:2008/11/02(日) 00:50:39 ID:???
MySQL直接関係ないじゃないか。

質問([質問ID], 質問文)
回答([回答ID], 名前, 性別, 年齢, 質問ID, 質問回答)


845 :NAME IS NULL:2008/11/02(日) 00:57:36 ID:???
>>833
サンキュー
これってphpmyadminのSQL文の中で
実行してもいいのかな?

846 :NAME IS NULL:2008/11/02(日) 01:26:52 ID:???
>>833
サンキュー
MS-DOSプロンプトでやったらできたよ
これってphpmyadminの中からでもできるの?

847 :NAME IS NULL:2008/11/02(日) 02:03:56 ID:WnUJTCju
>>844
なるほどー
質問テーブルを ID,Q1,Q2,Q3,Q4 って考えてたのがまずかったんだなぁ
勉強になりました ありがとうございます

848 :NAME IS NULL:2008/11/02(日) 16:11:49 ID:???
>>845
適当なテーブル作って試してみればいいじゃん。
なんでも聞けばいいってもんじゃないだろ。


849 :NAME IS NULL:2008/11/02(日) 20:40:21 ID:qFcTtU4O
一度sjisで入れたデータを全てEUCに変える事ってできますか?
今メモ帳でサイト作ってるんですが、全部できあがったらEUCに変えたいのです。

850 :NAME IS NULL:2008/11/02(日) 23:17:23 ID:???
メモ帳やめて秀丸でやればいいんじゃね

851 :NAME IS NULL:2008/11/02(日) 23:30:56 ID:???
ただのおまけのメモ帳なんて使ってる人いるんだね

852 :NAME IS NULL:2008/11/03(月) 00:10:12 ID:???
板違いだったらすいません。
質問なのですが、二つの表があり、直積演算や選択演算を計算しなさいという問題では
どのように答えたらいいのでしょうか?


853 :NAME IS NULL:2008/11/03(月) 02:28:39 ID:???
直積や選択をした結果どういうレコードが得られるか、
表形式で書いてあげればいいんじゃね。
板は合ってるがスレ違い

854 :NAME IS NULL:2008/11/03(月) 06:27:46 ID:???
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には入ってないようです。
みなさんが何でリストアしてるのかを教えて下さい。
それがダウンロードできる場所も教えてくれるとありがたいです

857 :NAME IS NULL:2008/11/04(火) 09:33:13 ID:???
>>851
ばっかおっめurlストリームも直接開けるんだぜ。
文字コードだって95時代からunicodeに対応してるんだぜ、たしか。
最も困る点といえばメモリ適当に食うからでっかいファイル読むとしんどいことかな!

858 :NAME IS NULL:2008/11/04(火) 16:57:04 ID:ZVeUnEqM
複数のカラムから検索する時って
select * from テーブル where カラム1=検索用語 or カラム2=検索用語 or …
ってするよりシンプルで簡単な方法ない?

859 :NAME IS NULL:2008/11/04(火) 17:22:21 ID:???
WHERE 検索用語 IN (カラム1, カラム2,・・・)
って書けるけど、MySQLはどかなあ、、、バージョンによるかも?

860 :NAME IS NULL:2008/11/04(火) 17:57:37 ID:ZVeUnEqM
>>859
ちょっとやってみる。
検索するカラムが多いとsql文が長くなりすぎるんだよな。
カラムの結合とかして検索してもいいの?
結合の意味がよく分からないんだけど。

861 :NAME IS NULL:2008/11/04(火) 18:18:04 ID:???
>>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
過疎?

865 :NAME IS NULL:2008/11/06(木) 17:23:03 ID:???
全然違うわボケ

866 :NAME IS NULL:2008/11/06(木) 19:11:45 ID:d2/MPlBE
ちょっと質問なんだが
カラム1を検索対象にしてそこに文を入れます。
ワイルドで検索すると「です。ます。」とかでも出てきてしまうんですが
出ないようにするにはフルテキスト検索にするしかないんのか?
ちなみにPHPです。
別カラムにキーワードだけ入れておくのはめんどくさいからいやです。
教えて下さい。

867 :NAME IS NULL:2008/11/06(木) 19:18:19 ID:???
>>866
わかち書きして別カラムに入れろ。それしかない。

868 :NAME IS NULL:2008/11/06(木) 20:16:37 ID:d2/MPlBE
>>867
そうすると単語の区切りを把握するためにソフトがいりますよね。
PHPとmysqlなんですが、どんなソフトがよろしいですか?

869 :NAME IS NULL:2008/11/06(木) 20:37:51 ID:???
mecab

870 :NAME IS NULL:2008/11/06(木) 21:40:36 ID:d2/MPlBE
>>869
ググってみます

871 :NAME IS NULL:2008/11/07(金) 05:36:16 ID:???
MySQLを勉強しようと思ってるんだが、お勧めの参考書とかある?

872 :NAME IS NULL:2008/11/07(金) 17:32:02 ID:???
オライリー

873 :NAME IS NULL:2008/11/07(金) 18:19:23 ID:???
>>871
公式のマニュアルだけで十分。
公式だけあって間違いが無いし、しかもタダ。

874 :NAME IS NULL:2008/11/07(金) 18:56:17 ID:SI9b5mDK
バイナリが入ったテーブルをうまくダンプするコツってありますか?

875 :NAME IS NULL:2008/11/07(金) 19:32:51 ID:???
--hex-blob ではだめ ?

876 :NAME IS NULL:2008/11/08(土) 06:40:23 ID:vE51FDTx
>>875
じゃあそれにします

877 :NAME IS NULL:2008/11/08(土) 12:17:14 ID:???
じゃあ、私も me to

878 :NAME IS NULL:2008/11/08(土) 12:18:08 ID:???
oがいっこたらんかった

879 :グーグルマイマップ担当:2008/11/09(日) 11:19:22 ID:???
はじめまして。
グーグルでマイマップの担当をしております。
質問よろしいでしょうか。

グーグルのマイマップのデーターが
削除したはずなのに、勝手に復活してしまいます。

データーベースのどこの設定を見直せば
いいのでしょうか?

880 :NAME IS NULL:2008/11/09(日) 11:54:02 ID:???
改訂新版 基礎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です。

御指南願います。

881 :NAME IS NULL:2008/11/09(日) 12:00:42 ID:???
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とかでも動きました。
いずれにせよ勘違いでご迷惑をおかけしました。

883 :NAME IS NULL:2008/11/09(日) 13:30:18 ID:???
>>879
ttp://takagi-hiromitsu.jp/diary/20081106.html

884 :NAME IS NULL:2008/11/09(日) 14:38:17 ID:???
>>754
再現試験してみたいから、ミニマムなテーブル構成を教えて。
DATETIMEと自動インクリメントのIDだけのテーブルだと
抜けは発生しなかった。

885 :NAME IS NULL:2008/11/09(日) 17:28:29 ID:???
>>882
あーそうか。気づかなかった。
MySQLで予約語とのバッティングを避ける場合
テーブル名、カラム名をバッククォートで囲むのがお作法。

mysql> update test set `desc` = 1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0


886 :NAME IS NULL:2008/11/09(日) 18:38:55 ID:???
シングルクオート '
アクサングラーブ `
ダブルクオート "

シングルクオートとアクサングラーブの違いってなに?

887 :NAME IS NULL:2008/11/09(日) 19:57:14 ID:iU37Z7xj
勉強しなおせ
http://www.amazon.co.jp/%E6%9B%B8%E5%BA%97-%E7%94%A3%E6%A5%AD-%E6%9C%AC/s?ie=UTF8&keywords=%E6%9B%B8%E5%BA%97&rh=n%3A255520011%2Ck%3A%E6%9B%B8%E5%BA%97&page=1

888 :NAME IS NULL:2008/11/10(月) 10:50:51 ID:???
勉強しまっせ

889 :NAME IS NULL:2008/11/10(月) 11:41:53 ID:3VXeAzu2
質問なんだけど
カラム1に数字を入れておいて
大きい順や小さい順に並べるのではなく
あるレコードが全体の何番目の順位なのかを出せる?


レコード1 : 250
レコード2 : 655
レコード3 : 157
レコード4 : 924

レコード2は全体の何位か?(3と表示させたい)

890 :NAME IS NULL:2008/11/10(月) 12:04:20 ID:???
>>889
レコード2より小さい値のレコードの数を数えて+1すればいい

891 :NAME IS NULL:2008/11/10(月) 16:52:48 ID:RN2rB+yA
FreeBSD7.0にMySQL5.0をインストールしようとしてるのですが、バイナリが見当たりません。
http://dev.mysql.com/downloads/mysql/5.0.html#freebsd

まだリリースされていないということでしょうか?

892 :NAME IS NULL:2008/11/10(月) 17:03:39 ID:???
自分でビルドして提供してやれよ

893 :NAME IS NULL:2008/11/10(月) 17:48:40 ID:3VXeAzu2
>>890
ありがと。

あと別の質問なんだけどMeCabの使い方がよく分かりません。
文をわかち書きにして、それをmysqlのフルインデックスのカラムに入れればいいだけなの?
本当にそんなので検索が早くなるんですか?
たったそれだけでいいの?

894 :NAME IS NULL:2008/11/10(月) 20:17:47 ID:???
単純なLIKEより数十倍速いよ。
わかち書きがベストかどうかはケースバイケースだけど。
当て方によってはNgramのほうがいいかも知れない。

895 :NAME IS NULL:2008/11/10(月) 22:49:18 ID:???
>>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をスキルアップで使ってみた




文字化けしまくりじゃない?おかしくない?これ糞じゃない?

898 :NAME IS NULL:2008/11/11(火) 12:41:52 ID:???
>>897
さっさとお帰りください。

899 :名無し募集中。。。:2008/11/11(火) 12:48:24 ID:irtGfUWp
>>897
SET NAMES EUC-KRしろ

900 :NAME IS NULL:2008/11/11(火) 12:52:50 ID:???
>>899

いろいろやってみましたがだめだったので午後から5.1を入れてみて
それでもだめだったらあきらめます

901 :NAME IS NULL:2008/11/11(火) 13:06:23 ID:???
何やっても無駄だから、さっさと諦めてバイト行った方がいいよ。

902 :NAME IS NULL:2008/11/11(火) 14:41:12 ID:???
>>900
その問題って6.0から修正される予定だからもうちょっと待ったほうが良いよ。

903 :NAME IS NULL:2008/11/11(火) 14:50:18 ID:???
ここらへんをみて文字化けはいまのところ解決しました。
ttp://www.ulog.biz/2008/05/mysql41perl-095.html


904 :NAME IS NULL:2008/11/12(水) 08:55:53 ID:wlLozbBr
或るテーブルについて、create table した日時を取得する方法ってある ? mysql 5.0.51a

905 :NAME IS NULL:2008/11/12(水) 09:24:19 ID:???
>>904
show table status の Create_time とか。

906 :NAME IS NULL:2008/11/12(水) 09:51:19 ID:???
おお、知らなかった。有難う!

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の場合だけ?)いろいろ調べてたのですが・・

ご教示頂けると幸いです。

908 :NAME IS NULL:2008/11/12(水) 13:34:35 ID:???
有効かどうか(っていうか文字コードが変更されたかどうか)は
set namesしてからstatusしたらわかることじゃね?

909 :NAME IS NULL:2008/11/12(水) 14:29:50 ID:???
既存のテーブルのあるカラムに対して
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";
としています。

912 :NAME IS NULL:2008/11/13(木) 20:25:33 ID:???
ascii の1バイトのAを hex で書くと何バイトになる ?

913 :NAME IS NULL:2008/11/13(木) 22:05:22 ID:???
>>912
どのくらい増えるかよく分からんけど増えるもんなのか…。
ダンプせず、mysqlのdataフォルダをコピーして保存した方がいいな。

914 :NAME IS NULL:2008/11/13(木) 22:07:24 ID:???
ふつう圧縮するよね?
$ mysqldump (略) | gzip - > backup.sql.gz

915 :NAME IS NULL:2008/11/14(金) 11:43:36 ID:???
MyODBC日本語変換機能版というのがなくなっているのですが

EUCで登録されているDBをODBCで見るにはどうしたらよいでしょうか?

普通のmyodbcだと文字化けしています。

916 :NAME IS NULL:2008/11/14(金) 12:34:19 ID:j6IY8X/S
どこで質問していいか分からないのでここで質問させて下さい。

mecabをPHPで使う為、パイプを使って解析後のデータを取得したのですが
下記のようになります。
原文
「ラーメン食べたい」
希望
「ラーメン 食べたい」
実際
「ラーメン 名詞,*,*,ラーメン食べたい,動詞,*,*EOF」

これだとラーメン(読み)と食べたいの間に改行が無いため
PHPを使って分割する事もできません。
コマンドプロンプトで行うと
ラーメン 名詞,*,*,ラーメン
食べたい,動詞,*,*
EOF
のように改行がでるのですが、パイプで出力させると改行がありません。
改行を出す方法か、mecabで名詞,*などを出さない方法の方がいましたら教えて下さい。

917 :NAME IS NULL:2008/11/14(金) 17:24:48 ID:???
$string = explode(',', $in);
$list = array();
foreach ($string as $val) {
if (false === strpos($val, '*') continue;
list($list[], $dummy) = explode(' ', $val);
}
$out = implode(' ', $list);

print $out;

即興で書いたから動くかはしらん

918 :NAME IS NULL:2008/11/14(金) 19:24:53 ID:???
mecab とか mysql とか無関係。
「PHP でパイプ使ってLFを拾う方法」をPHPスレで聞けば。

919 :NAME IS NULL:2008/11/14(金) 20:01:47 ID:j6IY8X/S
>>917
ありがとうございます。
が、それだと改行の所が切り離せないんです。

原文
「寿司大好き」
結果
「寿司 名詞,*,スシ大好き 名詞,*,ダイスキ」
というように
読みの「スシ」と、本来次の行の頭である「大好き」がくっついてしまってるので
explodeで切り離せないんです。

もう分からないので切り離さず文字置き換え関数で「名詞」とかだけ消して
そのままレコードとして保存しようかとも思いましたが
サイズもでかくなるし。


920 :NAME IS NULL:2008/11/14(金) 20:19:32 ID:???
>>918

あと、全文検索が欲しいなら hyper estraier
ttp://hyperestraier.sourceforge.net/index.ja.html

apache lucene
ttp://lucene.apache.org/java/docs/

この手のことを自分でゼロからやろうとしない方がいい。

921 :NAME IS NULL:2008/11/14(金) 23:58:25 ID:???
例えば,ユーザ名・IPアドレス・アクセス日時が記録されたアクセスログのテーブルで,
「select ユーザ名,IPアドレス,アクセス日時 from アクセスログテーブル group by ユーザ名」
とやると,重複したユーザ名は無視されるけど,アクセス日時が一番古いものしか取り出せない.
これを,一番最近アクセスしたものを取り出して,かつ重複したユーザ名は無視する場合はどうすればいいでしょう?
「order by アクセス日時 desc」を先にやってgroup byやるとエラーになるし.
どなたかお願いします.

922 :921:2008/11/15(土) 00:48:46 ID:???
自己解決しました

923 :NAME IS NULL:2008/11/15(土) 12:33:32 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文
を書けばよいのでしょうか?
どうか、ご教示ください。

925 :NAME IS NULL:2008/11/15(土) 16:06:40 ID:???
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,あいう

となります。

928 :NAME IS NULL:2008/11/15(土) 16:57:02 ID:???
その横に並んでいるのはカラムじゃなくてレコードなのか
そりゃ答える方も誤解するわ

929 :伊藤 誠:2008/11/15(土) 17:09:26 ID:svuXBrLZ
>>928

もう一度924読んでください。日本語も理解で来ませんか?

930 :伊藤 誠:2008/11/15(土) 17:24:58 ID:svuXBrLZ
>>927

あげ足を取るならば、下記の様に訂正します。


(テーブル作成時に)カラムの型を文字列(とする)もしくは
カラム(に該当するレコード)を文字列にキャストし


とします。因みに924では正しく書いています。

931 :NAME IS NULL:2008/11/15(土) 17:25:33 ID:???
日本語理解で来てなかったよ。
すまんすまん

932 :NAME IS NULL:2008/11/15(土) 17:29:47 ID:???
いずれにせよ、回答する気にならんな

933 :伊藤 誠:2008/11/15(土) 17:34:00 ID:???
まったく揃いも揃って使えない連中ばかりですね。


分からないなら分からないと言えばいいのです。


僕はこれから出かけます。
2時間程したらまたここに来ますので、それまでに回答しておくように。
頼みましたよ。

934 :伊藤 誠:2008/11/15(土) 17:56:19 ID:svuXBrLZ
>>933

代弁ありがとうございます。2時間後に拝見します。

935 :NAME IS NULL:2008/11/15(土) 22:28:07 ID:???
おお、私も疑問に思ってたことがでている。私はPostgresqlなんだが、
order by substr(住所,1,1),substr(住所,2,1),... ,substr(住所,n-1,1),substr(住所,n,1)
の様なことを平気でやってる。もっと洗練された表現はないものか。


936 :NAME IS NULL:2008/11/15(土) 23:03:55 ID:???
テーブルにデータを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側で全部処理するのが理想なんですが、
ほかにもっとスマートなやり方ってありますでしょうか?

937 :NAME IS NULL:2008/11/15(土) 23:34:10 ID:???
トリガ?

938 :伊藤 誠:2008/11/16(日) 09:17:05 ID:rXBUq5sa
>>935

少なくとも、924-934で僕とやり取りした方には
分からないようですよ。
上げ足を取ることには長けておられるようですが。

もう少しSQLの方に長けておられる方
返信お持ちしております。


939 :NAME IS NULL:2008/11/16(日) 09:38:02 ID:???
伊藤 誠 がバカなのは解ったけど、明日の日経平均は上がるかなぁ?

940 :伊藤 誠:2008/11/16(日) 09:41:30 ID:rXBUq5sa
>>939

僕は一向にかまわないが、遠まわしに936さんを
馬鹿呼ばわりするのはいかがなものかと?

941 :伊藤 誠:2008/11/16(日) 09:42:41 ID:rXBUq5sa
>>940

訂正
936さんではなく935さん

942 :NAME IS NULL:2008/11/16(日) 10:03:16 ID:???
>>924
> あいう,1,0,11,2,a1,abc
> というような、レコードが格納されたカラムを
> 0,1,2,11,a1,abc,あいう

何をしたいか解らん、一体全体、どんな規則で並び替えたいんだ?
文字列型をその時の気分で並び替えたいなら、その時の気分で手動で入れ替えるしか無いんじゃないか?

943 :伊藤 誠:2008/11/16(日) 10:12:45 ID:rXBUq5sa
>>942

数字と文字列が混在した場合、数値として識別されるものは
その大小順、文字列として識別されるものは辞書順ということ
になります。

ちなみに、テーブル作成時のカラムの型は文字列となります。

944 :NAME IS NULL:2008/11/16(日) 10:19:40 ID:???
>>943
> 数値として識別

主語がないけど、MySQLが識別するってこと?
文字列なんだから勝手に識別はしてくれないでしょ

945 :伊藤 誠:2008/11/16(日) 10:27:17 ID:rXBUq5sa
>>944

そうですね。
関数での識別等を検討しましたがうまくいきません。
今のところorder byで処理しようとしているのですが・・・

946 :NAME IS NULL:2008/11/16(日) 11:21:08 ID:???
内容的にはこういうことでしょうか。
>>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`のようなカラムに入れておくのがいいんじゃないでしょうか。

947 :NAME IS NULL:2008/11/16(日) 11:25:04 ID:???
>>946

"109ビル4FランジェリーショップLOVE" とか "2008年Xmas" とかも、同様に並べ替えれるの?

948 :NAME IS NULL:2008/11/16(日) 12:57:11 ID:Q2ekdbiC
MyISAMで、key_buffer_sizeを、よく言われているように、
すべてのインデックスファイルが収まる程度にしているのですが、
インデックスファイルがこれを超えても、スワップが頻繁に発生したりはしていません。
OS側のキャッシュが働いているからだと思います。
OS側でキャッシュが働くなら、バッファサイズ関係のパラメータは
特に気にはしなくていいということなのでしょうか?
インデックスのサイズが巨大になりすぎて、物理メモリに載らなくなると、
さすがにマズいと思いますが。

949 :NAME IS NULL:2008/11/16(日) 12:59:29 ID:???
>>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
しかし、これを入門レベルと言われるのは
僕にとっては、酷です。

954 :NAME IS NULL:2008/11/16(日) 16:48:00 ID:???
中止かよ、暗い年末だな

955 :NAME IS NULL:2008/11/16(日) 16:51:31 ID:???
酷っても、質問の意味を伝える事が出来なきゃ、入門以前で始まらない。

956 :伊藤 誠:2008/11/16(日) 16:53:45 ID:rXBUq5sa
>>952

ストアドファンクションまで使えるんですね。
ある意味、order byはなんでもありというか・・・
整列に幅が広がりそうです。

原理は946と同じですね。

957 :NAME IS NULL:2008/11/16(日) 16:58:24 ID:???
>>947
「同様」の定義によると思います。
>>952 で作ってもらった結果でよさそうであれば、伊藤さん的には同様だと。

>>950
解決されたのであればなによりです。

>>952
ありがとうございます。

958 :NAME IS NULL:2008/11/16(日) 17:10:23 ID:???
まじめに対応しててワロタ

959 :伊藤 誠:2008/11/16(日) 17:43:03 ID:rXBUq5sa
>>958

・・・・・

960 :NAME IS NULL:2008/11/17(月) 11:14:23 ID:???
>>909
仕様です。
FKEY満たしているかチェックするために
INDEXがあったほうが便利なので、
自動で作られているだけですよ

961 :NAME IS NULL:2008/11/17(月) 18:23:43 ID:???
Server version: 5.0.51a です
あるユーザーで入っている時に別ユーザーでコマンドを実行したい時って
一旦抜け出して、そのユーザーで入り直さないと駄目ですかね?

suで切り替える…見たいな事が出来たら良いなと思ったりするんですが。


962 :NAME IS NULL:2008/11/17(月) 20:51:57 ID:???
MySQLに対応しててサーバに直接接続してフォーワード・リバースできる
ER図執筆ソフトってある?

dbdesignerとか2年間開発とまってるし

963 :NAME IS NULL:2008/11/17(月) 20:52:40 ID:???
無料のやつで。

964 :NAME IS NULL:2008/11/17(月) 22:48:57 ID:???
>>961
だめです

>>962
俺もだいぶ探したけどないよね無料のは

965 :NAME IS NULL:2008/11/17(月) 22:53:55 ID:???
dbdesignerなら出来るんだけどね
確かオープンソースだから誰か開発引き継げばいいのに


966 :NAME IS NULL:2008/11/18(火) 00:20:57 ID:???
mysql workbenchは?

967 :NAME IS NULL:2008/11/18(火) 00:27:15 ID:???
無料で、って言ったのはその選択肢はもう調べましたって意味だわな


968 :NAME IS NULL:2008/11/18(火) 10:31:44 ID:???
>>964
961です。thx 諦めます w

969 :NAME IS NULL:2008/11/18(火) 18:28:29 ID:???
ML Tuchida MAO もうしゃべんな。
場違い、スキルなし、調べる能力なし。

970 :NAME IS NULL:2008/11/18(火) 18:35:54 ID:???
おもしろいやつがわいてるっw

971 :NAME IS NULL:2008/11/19(水) 10:48:26 ID:XpAwnT72
mysqlってもしかしてjoinしたviewにinsertって出来ないのですか?
ルールとかなし?

マニュアル見ても無さそうだけど

972 :NAME IS NULL:2008/11/19(水) 14:48:51 ID:???
それはどっちかというとPostgreSQLが変態。

973 :NAME IS NULL:2008/11/19(水) 17:40:57 ID:???
order byでソートした順番で保存したい場合は
新しくテーブル作ってそこにコピーするしか方法はないんですか?

974 :NAME IS NULL:2008/11/19(水) 18:15:33 ID:???
順番で保存って・・・
どうして?
ORDER BY じゃだめですか?

しかも、エンジンによってはINSERTした順番に保存されるのが保障されてなかったりしそうだけど。
各章はないけど。

なんか「順番に保存」っていう発想がDBっぽくない、とか言ったらダメですか?

975 :NAME IS NULL:2008/11/19(水) 18:34:42 ID:???
読み出し順序が保証されてない以上、順番に保存する意味もない。

976 :NAME IS NULL:2008/11/19(水) 18:45:24 ID:???
order byつけたビュー作れば?

977 :NAME IS NULL:2008/11/19(水) 19:00:48 ID:???
主キーがついてるデータを消すとそこの主キーの番号が抜けちゃいますよね?
それより後ろの主キーが一つずつ自動で下がってくれたりなんかしませんよね?
なんか落ち着きません

978 :NAME IS NULL:2008/11/19(水) 20:31:04 ID:???
>>977
まぁ落ち着け

979 :NAME IS NULL:2008/11/19(水) 20:32:56 ID:???
お茶でも飲めばいいんじゃね

980 :NAME IS NULL:2008/11/20(木) 01:26:57 ID:???
値がNULLのデータがあればそこに、値がNULLのデータがなければ
order byしたソートのデータにいれるって条件式どうやったらできますか?

981 :NAME IS NULL:2008/11/20(木) 03:23:13 ID:laS2bxPS
だれかTritonnのFreeBSD用の野良portsを作ってください。

982 :NAME IS NULL:2008/11/20(木) 09:17:11 ID:???
>>980
日本語でおk

983 :NAME IS NULL:2008/11/21(金) 12:56:13 ID:???
DateTime型とTimeStamp型がありますが、
どのように使い分けるのでしょうか?
たとえば現在の時刻を取得してDBに保存するプログラムの場合は
ネットや本で見る限りTimeStampが多いですね。
でもDateTimeでも代わりに使えると思いますし、DateTimeにすることで
マイナスになるようなことも無いように思います。
単純に慣習なのでしょうか?

984 :NAME IS NULL:2008/11/21(金) 13:31:57 ID:???
今卒研としてjavaとMySQLを組み合わせて文書検索システムを作ろうと思っているんですが
MySQLに文書の中身(文字列)を登録するのは容量的に大丈夫なんでしょうか?

最初は Luceneなどでファイルから直接キーワード検索 としようとしたんですが、
色々な種類のファイルを同時に読み込めるかということに疑問を感じたので
@txt.pdf.docから文字列を読み込み→AMySQLに登録→BMySQLからキーワード検索
のほうが自分のレベル的にもできると思ったのでこの仕様で大丈夫かお聞きしました。

985 :NAME IS NULL:2008/11/21(金) 14:35:52 ID:???
20文字程度のを1つ2つなら容量的に大丈夫
1文書が3TBのを100万オーダーで入れ込みたいなら難しい

986 :NAME IS NULL:2008/11/21(金) 14:44:03 ID:???
卒研ならもう少しマシなシステム組まない?
MySQLじゃ研究というより勉強じゃね?

987 :NAME IS NULL:2008/11/21(金) 16:44:01 ID:Hi3D4ul/
mysqlで複数行のinsertってアトミックになりますか?
たとえばauto_incrementなidにしていた場合、一回のSQL発行時には
必ず連番のidになるのでしょうか。

988 :NAME IS NULL:2008/11/21(金) 17:43:30 ID:???
複数テーブルをFROM句に含めた状態でFOR UPDATEをかけた場合って、FROM句に書いた全てのテーブルがロックされるのでしょうか?

989 :NAME IS NULL:2008/11/21(金) 21:28:44 ID:???
そもそも書けたっけ?

990 :984:2008/11/22(土) 02:12:17 ID:???
レスありがとうございます。
>>985
すいません多分自分の言葉足らずで違う意味で理解されてしまったと思いますが
20文字程度を例に上げられるってことはMBサイズの文書を登録はやめたいいということしょうか?

>>986
メインはJAVA部の機能です。教授にDB勉強兼ねろ。といわれ
DB勉強がてらにMySQLを使用したのですが(都合がつけばこのまま)
やはり他のDB使ったほうがいいということでしょうか?

本心を言うとJAVA部で既に飽き、性能悪くてもとっとと終わらせたいと思ったので
MySQLの検索機能を利用できるならそっちを使おうかと思いました。

991 :NAME IS NULL:2008/11/22(土) 09:32:50 ID:???
ふーん。フルテキストインデックスを貼っておけば、そこそこ動くと思うけどね。
教授がそれでいいと言うなら、いいのかしら。

あるいはそもそも、MySQLでは日本語全文検索が使い物にならないという巧妙な罠だったりして。


992 :NAME IS NULL:2008/11/22(土) 13:04:32 ID:???
>>989
え?書けないの?^^;

993 :NAME IS NULL:2008/11/22(土) 13:09:11 ID:???
>>989

select * from department d inner join employee e on d.dep_id = e.dep_id for update;

こんな感じのクエリ投げてみたら普通に通ったは通った。
inner join しなくてFROM句にテーブル名並べても同じ。

ただ、この時ロックがかかってるのかどうかは分からん。
誰か詳しい人いたら教えてください。

994 :NAME IS NULL:2008/11/22(土) 20:34:47 ID:???
>>983
TIMESTAMP型のメリットは、
INSERT,UPDATE時に自動で日時を設定してくれることと、
サイズが小さいことくらい。



995 :NAME IS NULL:2008/11/23(日) 03:31:40 ID:???
workbenchでビュー作ると
間違いがなさそうなのにsyntax errorって言われる
テーブル名指定してるところが赤くなってるんだけど、でもそのテーブルもworkbench上で定義してるのに
workbenchでビュー書けた人居ますか?

996 :NAME IS NULL:2008/11/23(日) 09:53:06 ID:???
workbenchで作ったテーブル定義が実際のDBでエラーになったことがある
わりと品質悪そう
バグ報告しちゃえば?

997 :NAME IS NULL:2008/11/23(日) 18:42:32 ID:UerS0rap
一つのテーブルに45000枚もエロ画像入れたのにselect一瞬で驚き。
正直Oracle使ってるやつは何が良くてOracle選んでるの?って思う。
mysqlは神だね。爆速。

998 :NAME IS NULL:2008/11/23(日) 20:11:29 ID:???
1件のデータ容量なんて関係ないからね
バイナリに対する検索じゃなければ。
45000はDBとしては全然少ないし

999 :NAME IS NULL:2008/11/24(月) 03:32:04 ID:???
1000

1000 :1000:2008/11/24(月) 04:00:41 ID:???
>>997
ネタだよな?

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

329 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)