【MySQL】下らねぇ質問はID出して書き込みやがれ 2

このエントリーをはてなブックマークに追加
1NAME IS NULL
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。

◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
2NAME IS NULL:2011/11/27(日) 23:05:39.68 ID:Ay1cbXrU
テンプレは随時追加予定
3NAME IS NULL:2011/11/27(日) 23:24:48.96 ID:???
1乙
4NAME IS NULL:2011/11/28(月) 02:52:03.45 ID:???
前スレくらい貼れよ
5NAME IS NULL:2011/11/28(月) 22:07:46.51 ID:???
多分前レスなんてないんだろうな
スレたてした1の事情は分かった気がする
6NAME IS NULL:2011/11/29(火) 02:45:09.49 ID:wzk/DA6j
>>5
分かってもらえてよかったです。
多分、思ってる通りだと思いますw
7NAME IS NULL:2011/12/02(金) 16:03:42.01 ID:vO+2Qk5j
で、質問していいのか?
8NAME IS NULL:2011/12/05(月) 02:05:37.05 ID:fY4mGBIH
PHPスレのパクリ?
9NAME IS NULL:2011/12/05(月) 02:08:07.40 ID:???
もう一つのMySQLスレが荒れて機能してないからな
パクリってか避難ってことでいんじゃね?
10NAME IS NULL:2011/12/06(火) 12:58:14.26 ID:???
おっさんをここに誘導して来るよ
11NAME IS NULL:2011/12/06(火) 17:04:21.54 ID:???
SNSの個人設定で、以下のような日記の公開範囲設定があります。
※「○月○日の日記を公開するかどうか」ではなく、そのユーザーの日記全体の設定です。
5.インターネット全体に公開
4.SNSユーザー全員に公開
3.友達の友達にまで公開
2.友達にだけ公開
1.非公開

ここで、特定のサイト訪問者が閲覧できる日記だけを、記事単位で最新10件分取得したい場合、
どのようなSQLを書くのがスマートでしょうか。

いまは、最初に上記の公開範囲テーブルから「閲覧できるユーザーID」を全取得して、
日記を select するときに where user_id in(1,2,3,5,6,8,9,10,11,13,...) などとやってて、
パフォーマンスがだいぶ悪いです。

そこで、手段を変えて、次のようにひとつのクエリで取得しようとしたら、もっと悪化しました。
where
(private.diary = 5) or
(private.diary = 4 and ログインしてるかどうか) or
(private.diary = 3 and 友達の友達かどうかのサブクエリ) or
(private.diary = 2 and 友達かどうか) or
(private.diary = 1 and 自分かどうか)
12NAME IS NULL:2011/12/06(火) 17:53:42.54 ID:???
>>11
日記なら、更新頻度そんなに高くないだろうからキャッシュしちゃえば?
10〜20分しても問題ないと思うけど
13NAME IS NULL:2011/12/11(日) 12:24:38.37 ID:55w2N/S/
検索エンジンGoogleで「インターネットテレビ 朝鮮総連 少頭劣一族 マイクロソフト社(又は経済産業省等気になる省やインターネットや原発、地震 波動砲)」を検索。
警察と自衛隊の武器は少頭劣一族が奪い、朝鮮に送ったらしい。知能障害以前の頭が悪い家族達。「工作員」の意味を知らない「工作員」家族。
14NAME IS NULL:2011/12/11(日) 16:11:53.90 ID:2BDdxjrX
「俺の全文検索」のソースをアップロードした。

http://www.ne.jp/asahi/sun/patagonia/fulltext/fulltext.html

うまく全文検索できないときには掲示板に書きこんでくれ。
15NAME IS NULL:2011/12/16(金) 17:54:11.04 ID:eaA3R1cS
宣伝乙
16NAME IS NULL:2011/12/16(金) 18:51:36.19 ID:3uhL2NBa
w
17NAME IS NULL:2011/12/19(月) 03:50:24.37 ID:84V7mD2V
VMwareにubuntuをインストールし、そこでmysql 5.1.58使ってます。
ホスト側スペック:win7 / i7:3.4GHz / memory:16GB
ゲスト側スペック:ubuntu 11.10 / CPU core: 4cores / memory:8GB

my.cnfは標準キャラクターセットをutf8に変更した以外には何もいじっていません。
この状態で、8000万レコードのデータ(カラム1(主キー): bigint / カラム2: double)を
200万レコードづつ40分割し、load local infileを用いて下記のテーブルに入れたところ、読み込みに40時間かかりました。
create table ExpRecord(
__ID bigint,
__frequency double,
__primary key(ID)
)
ENGINE=InnoDB
partition by hash(ID)
partitions 100;

少しでも高速化させたく、my.cnfのチューニングをしたいと考えています。
ネット上で適当に見つけたmy.cnfを使ったところ、テーブルへのデータの読み込みがさらに遅くなりました。
(既存のログファイルは削除しています)
また、チューニングについて書かれた複数のブログを参考に、標準のmy.cnfにInnoDB系の行を追加したところ、
今度はデータの登録そのものが出来なくなりました。


チューニングの方法や、ubuntu向けのmy.cnfのチューニングについて解説しているサイト、
DBのチューニングについて参考になるサイトなどありましたらご教示願います。
18NAME IS NULL:2011/12/19(月) 05:59:30.71 ID:???
>>17
100パーティションにしたらデフォルトのtable_open_cache = 64だと足りない。
1レコードINSERTするごとにopen/closeが走って悲惨なことになる。
パーティショニングをやめたほうがいいと思うけど、さしあたり

table_open_cache = 5000
innodb_buffer_pool_size = 4g
innodb_log_file_size = 512m
innodb_flush_log_at_trx_commit = 2

ぐらいでどう。
innodb_log_file_sizeを変更すると起動しなくなるがそこはググって。
19NAME IS NULL:2011/12/19(月) 14:31:10.85 ID:84V7mD2V
>>18
ありがとうございます。今までは全く動かなかったのですが、
動くようになり、また速度も約2倍に向上しました。
20NAME IS NULL:2011/12/20(火) 22:58:01.54 ID:???
質問です。

以下のようなSQLファイルを作成し、実行してみました。
---------------------------------
~$ cat hoge.sql
use test;

drop table if exists table_abc;
create table table_abc(id int primary key, name text, delete_flg int);

insert into table_abc values (1, 'aaa', NULL);
insert into table_abc values (2, 'bbb', 1);
insert into table_abc values (3, 'ccc', 0);

select * from test.table_abc where delete_flg != 1;
---------------------------------

結果は、以下のようになったのですが、delete_flg=NULLのレコードが返却されないのはなぜでしょうか。
~$ cat hoge.sql | mysql
---------------------------------
id name delete_flg
3 ccc 0
---------------------------------

21NAME IS NULL:2011/12/20(火) 23:31:18.07 ID:Xz45otf/
以下のようなDBがあります。
ID str time
3 123 102828
4 321 103020
5 123 103520
6 123 103530
ここで現在時刻(&time)を10:30:00としたとき
select from テーブル where time >$time
とすると実行結果は、ID4〜6を表示します。
これだと、strの中身(123)がかぶってしまっているとき、
最新の情報だけ抜き出すことはできますでしょうか。
理想の結果は、
ID4とID6が表示されることです。

どなたかわかる方よろしくお願い致します。
22NAME IS NULL:2011/12/21(水) 00:41:10.81 ID:???
>>21
group by と max

http://toro.2ch.net/test/read.cgi/db/1316769778/4
↑あたりが参考にならんかの?
23NAME IS NULL:2011/12/21(水) 01:09:28.76 ID:ygQiTYNs
>>22
ありがとうございます。
無事やることはできました。
ただ、where time >$time
をどこにいれればよいのでしょうか。
24NAME IS NULL:2011/12/21(水) 03:06:08.20 ID:???
>>20
SQLの仕様。MySQL以外のDBMSでも同じ。

mysql> select * from table_abc where delete_flg != 1 or delete_flg is null;
+----+------+------------+
| id | name | delete_flg |
+----+------+------------+
| 1 | aaa | NULL |
| 3 | ccc | 0 |
+----+------+------------+
2 rows in set (0.00 sec)

このへん参照
http://www.geocities.jp/mickindex/database/db_getout_null.html
25NAME IS NULL:2011/12/21(水) 15:42:33.18 ID:???
>>22
正解
>>23
間違っています
26>>20:2011/12/22(木) 23:33:49.00 ID:???
>>24
ありがとうございます。null撲滅委員会のページはとても参考になりました。
27NAME IS NULL:2011/12/25(日) 19:45:00.35 ID:???
( ´Д`)y━・~~
28NAME IS NULL:2011/12/25(日) 20:36:41.52 ID:OXV1P/Ab
( ´,_ゝ`)プッ
29NAME IS NULL:2011/12/25(日) 20:43:11.37 ID:???
( ´Д`)y━・~~
30NAME IS NULL:2011/12/27(火) 14:27:06.72 ID:???
( ´,_ゝ`)プッ
31NAME IS NULL:2011/12/27(火) 23:19:41.33 ID:???
>>30
なんやお前、ここでもワシに喧嘩売る気か?( ´Д`)y━・~~
32NAME IS NULL:2011/12/28(水) 16:19:05.75 ID:???
( ´Д`)y━・~~
33NAME IS NULL:2011/12/28(水) 17:23:24.76 ID:???
MySQL 総合スレは終了したの?
34NAME IS NULL:2011/12/28(水) 18:53:01.54 ID:???
このスレ消費するか
35NAME IS NULL:2011/12/28(水) 22:08:17.25 ID:b5+L0j52
>>33
消滅したみたいやでw

>>34
どういう意味で使っとるんや?
まさか下手なワシの猿芝居しとるんちゃうやろな
( ´ー`)y-~~
36NAME IS NULL:2011/12/28(水) 22:11:20.99 ID:???
( ´Д`)y━・~~
37NAME IS NULL:2011/12/28(水) 22:16:15.91 ID:b5+L0j52
>>36
そういうつまらんレスせんでええから(爆笑)
そうやってワシの真似せーへんとなんも抵抗でけへんの?( ´ー`)y-~~
つくづく光線卒のIT下請けドカタはアホなんやなぁって思いました(爆笑)
38NAME IS NULL:2011/12/28(水) 22:18:54.55 ID:???
( ´,_ゝ`)プッ
39NAME IS NULL:2011/12/29(木) 01:15:34.28 ID:???
【再掲】

一月半ほど前

130 名前:NAME IS NULL[] 投稿日:2011/11/06(日) 10:09:44.37 ID:VrwJXmAE [1/10]
超初心者なんだが、SQLってなにに使うの?全くメリットが伝わらん。データベースでなにすんのさ?
Excelでいいよなきがしてならんのだが

現在

ワシが聞いたんは定性的に説明してみぃという問いかけやった、

http://toro.2ch.net/test/read.cgi/db/1318935267/

誘導します。本スレ立った模様です。こちらへどうぞ
http://toro.2ch.net/test/read.cgi/db/1325079058/
40NAME IS NULL:2011/12/29(木) 02:25:21.30 ID:bdP69J45
>>38
池沼レス野郎がキタ━━━━━━━━m9( ゚∀゚)━━━━━━━━!!
お前はホンマド底辺の光線卒なんやなw
41NAME IS NULL:2011/12/29(木) 02:26:10.50 ID:bdP69J45
>>39
お、できとるんかw
ほなちょっくら覗いてみるわ( ´ー`)y-~~
42NAME IS NULL:2011/12/29(木) 18:59:30.01 ID:uECZB68Q
予約語がカラム名に使われてるデータベースがあります。
以下のようにすると、参照できることはわかりました。
select * from table_name where 'show' like 'hoge';

ですが、これだと予約語ではないカラム名の場合検索できません。
select * from table_name where column_name like 'hoge';
で帰ってくる結果が
select * from table_name where 'column_name' like 'hoge';
では帰ってこなくなります。

どういうsql文ならカラム名が予約語、予約語ではない場合の両方で使えるでしょうか?
sql文はphpから発行しています。
43NAME IS NULL:2011/12/29(木) 19:11:42.58 ID:???
>>42
ここの連中は物事何も知らんから諦めとき( ´ー`)y-~~
44NAME IS NULL:2011/12/29(木) 21:31:16.12 ID:???
>>42

名前は、とにかくバッククオート(`hoge`)で囲んでおけば、
予約語だろうがそうで無かろうが使えるはずだけどね。
(クオート('hoge')ではない)
予約語でなければ囲まなくとも支障は無いが。
45NAME IS NULL:2011/12/31(土) 10:45:51.21 ID:vMkeFH30
yyyyMMddHHmmssXXという形式の値を入れる、uniqueなカラムがあります。
yyyyMMddHHmmssはインサート時刻、XXは連番で00〜99です。
1秒間に100行までしかインサートできないという仕様です。
このテーブルにインサートするとき、XXの部分を決めるには
どういう処理が一般的でしょうか?
(テーブルはInnoDBです)

1.lock writeして、select count(*)で既存の行数を求める。
2.とりあえずXX=00でインサートして、unique違反になったらXX+=1してリトライ(成功するまでループ)

気になっているのは
1→パフォーマンス低下。万一のデッドロック。auto_commit=falseでトランザクションを
つかって、さらに他のテーブルも更新しているので、ロックとトランザクションの関係
がちょっと複雑。
2→このカラムに依存して値が決まるカラムBが存在するため、一度
インサートした後カラムBだけアップデートしなければならない。

実際は、1秒間にインサートするのはたいてい1回、最大で10回くらいと
想定しています。
ご意見をお聞かせいただければ幸いです。
46NAME IS NULL:2011/12/31(土) 11:29:14.29 ID:???
yyyyMMddHHmmss 部分はホストプログラムで生成してるのかな?
47NAME IS NULL:2011/12/31(土) 14:53:40.36 ID:???
ホストプログラムを考えてましたが、DB生成でも大丈夫と思います。
48NAME IS NULL:2011/12/31(土) 14:55:16.33 ID:???
あ、でもやっぱりホストプログラムでお願いします。
49NAME IS NULL:2011/12/31(土) 16:26:04.48 ID:???
なら、
・YYYYからXXまで全部ホストプログラムで生成
・XX の部分は連番で
・秒が変わればゼロリセット(ホストプログラムでなら容易)
でいけそうに思えるんだが。

そういうことするプログラム(プロセス)が複数でないならばだけど。
50NAME IS NULL:2012/01/01(日) 11:17:38.17 ID:???
プロセスは複数なんです。PHPで。
51NAME IS NULL:2012/01/01(日) 15:20:12.54 ID:???
秒が変わってもXXの連番が必ずしも00から始まらなくても良いなら、
採番テーブルから採番して、その番号を100で割った余りをXXとする。

どうしても00から始まって欲しいなら、採番テーブルにdatetimeのカラムを
設けて、それで秒替わりを検出したら番号をゼロとしてしまう。
52NAME IS NULL:2012/01/01(日) 17:27:32.79 ID:???
秒間100件程度ならMyISAMで採番テーブル作るで何の問題もないよ。
アベンドしたときに番号の抜けを出したくないとかいうならInnoDBでもいいと思う。
53NAME IS NULL:2012/01/01(日) 19:23:47.21 ID:???
ホストプログラムが複数マシンで動いていて、システム時刻が
ずれていたりすると問題にならない?
54NAME IS NULL:2012/01/01(日) 21:21:46.71 ID:???
皆様,お助けください。p_blog というディスコンとなったcmsソフトを使い
続けています。

apache 2.2.17, php 5.3.5, mysql 5.1.57

というバージョンまでは「データベース全体のバックアップ・リストア」で
問題が生じたことはありませんでした(4系列から5系列への移行時を除く)
が,

apache 2.2.21, php 5.3.8, mysql 5.5.16

では,バックアップ・リストアは出来るものの,ブログ本文部分が「全く出
力されない」のです。ここだけ,ゴソッと抜け落ちてしまいます。ブログ本
文が収められているテーブルはちゃんとリストアされていますし,バック
アップ・リストアの際にもエラーは何一つ発生していません。文字コードは
全部UTF-8に統一してあり(status; で確認済み),php.ini, my.cnf の
設定も同じです。

何か,この不具合を解消するための,ヒントを頂戴できませんでしょうか?
55NAME IS NULL:2012/01/02(月) 02:13:05.96 ID:???
>>53
日時も採番用ホストのそれを使えばいいだけじゃんか。
5645:2012/01/02(月) 08:10:17.79 ID:???
皆様ありがとうございます。
まとめると、採番テーブルでDBサーバの時刻を使ったほうが問題が
少ないということで、こんな感じですよね?
create table seq (
id int not null,
dt datetime
);
update seq set id=if(dt<now(),0,id+1),dt=(dt<now(),now(),dt);
57NAME IS NULL:2012/01/02(月) 08:49:01.83 ID:???
create table seq (
id int not null,
dt datetime
) engine=MyISAM;
update seq set id = last_insert_id( if(dt<now(),0,id+1) ), dt = if(dt<now(),now(),dt);
select last_insert_id(), dt from seq;
58NAME IS NULL:2012/01/02(月) 17:44:52.55 ID:???
それだとupdateとselectの間にdtが変わってるかもしれないからロック必要じゃね?
59NAME IS NULL:2012/01/02(月) 23:16:17.38 ID:bfexwW1F
phpで
$query = mysql_query("SELECT * FROM question_tb WHERE purchase_date >='$sdate' AND purchase_date <='$edate' AND star>=4 ORDER BY purchase_date");
これでpurchase_dateが$sdate以上、purchase_dateが$edate以下、star>=4
の3つの条件でmysqlで問い合わせできますが、

別の書き方、
$sql = 'SELECT question_id,purchase_date,purchase_price,star,
lang_php,lang_perl,lang_java,lang_cs,lang_cpp,lang_basic,
job,entry_date
FROM question_tb
WHERE purchase_date >= "' . $sdate . '"
AND purchase_date <= "' . $edate . '"';
ではどのようにstarが4以上を書くのですか?
60NAME IS NULL:2012/01/03(火) 11:58:23.96 ID:???
>>59
phpで質問したほうがいいっす
>AND purchase_date <= "' . $edate . '"';
AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date'

ヒアドキュメントにするとわかりやすい・・かも
BETWEENにするとわかりやすい・・かも

$sql = <<<EOT
SELECT question_id,purchase_date,purchase_price,star,
lang_php,lang_perl,lang_java,lang_cs,lang_cpp,lang_basic,
job,entry_date
FROM question_tb
WHERE purchase_date BETWEEN '{$sdate}' AND '{$edate}'
AND star >= 4
ORDER BY purchase_date
EOT;
61NAME IS NULL:2012/01/03(火) 12:00:14.98 ID:???
すまぬセミコロン抜け

AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date'

AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date';
62NAME IS NULL:2012/01/03(火) 21:26:26.40 ID:v8hjRyik
mysqlを使っていて、AとBというカラムがあって、基本的にはAでソートするのですが、
AがnullのときにBでソートするようにしたいのですが、どうしたらいいのでしょうか?
obder by A,Bにすると、Aがnullのものが先に出るようになります。
AがnullならBの値を使って、AとBを合わせたようなソートを行いたいです。
63NAME IS NULL:2012/01/03(火) 22:14:55.82 ID:???
>>62
ORDER BY IFNULL(A, B) は?
6462:2012/01/04(水) 17:57:45.89 ID:k3MZr3nC
>>63
ありがとうございます、解決しました。
65NAME IS NULL:2012/01/04(水) 19:03:27.48 ID:Y4FS6eZm
ストアドの引数に配列渡すのってどうするのが良いんでしようか?
テンポラリテーブル作って渡してるのですが、どうにもすっきりしなくて。
66NAME IS NULL:2012/01/05(木) 13:03:07.92 ID:???
>>60
>>61
ありがとうございました。ヒアドキュメントの方が何故がエラーで
動きません
67NAME IS NULL:2012/01/05(木) 15:53:31.06 ID:ktbGIpiI
テキストをデータベースに格納する場合、普通にINSERTとかするとそのまま格納されると思います
これを圧縮して格納するような事は出来るのでしょうか?
もし出来るとしたら、どのような技術とか手法を行えばいいのでしょうか?
68NAME IS NULL:2012/01/05(木) 18:06:22.23 ID:krX1LSNT
zip圧縮とかの事言ってんだったら、バイナリだからカラムはBlobでだとか?
69NAME IS NULL:2012/01/05(木) 19:24:21.17 ID:???
株取引のデータがcsv形式であって、これを検索したりして分析したいと思っているんですけど、
MySQLを使えばいいんでしょうか?
データベースは初めてなので初心者向きのがいいです。
70NAME IS NULL:2012/01/05(木) 19:26:25.55 ID:???
>>69
そうです。
71NAME IS NULL:2012/01/05(木) 19:37:19.33 ID:???
>>70
thx
72NAME IS NULL:2012/01/05(木) 19:52:06.35 ID:???
>>69
MySQLで、銘柄情報テーブルやら株価テーブルやら作ってるyo
73NAME IS NULL:2012/01/08(日) 13:49:21.05 ID:T7mS6gv8
log
name buy inputdate
1.yamamoto 20 2011-12-8
2.takahashi 10 2011-12-7
3.yamamoto 10 2011-12-3
4.hayashi 5 2011-12-1

このようなテーブルがあった場合。

select from log where name ='yamamoto' group by DATE_FORMAT(inputdate,"%Y%M");

このとき最新のもの(1行目)を選んだり最古のもの(3行目)を選んだりできるようにしたいです。
要はgroupby で抽出される行を選択するということなのですが、
having byですと、group by抽出後のものに対する文みたいですし、
なにかいい方法はありますでしょうか?
74NAME IS NULL:2012/01/08(日) 14:35:30.60 ID:???
>>73
order by inputdate (desc) limit 1 じゃダメなの?
7573:2012/01/08(日) 15:37:59.03 ID:T7mS6gv8
>>74
ありがとうございます。
ですが、実際にはこのようなレコードが過去の月の分もあります。

そうなると、一行ではなくて、
結果は

yamamoto 20 2011-12
yamamoto 30 2011-11
yamamoto 5 2011-10
.
.
.
みたいに何月分も抽出したい感じなのです。
76NAME IS NULL:2012/01/08(日) 16:54:31.91 ID:???
>>75
Oracleの場合rank()関数を使ってやる内容。
MySQLの場合はユーザ変数を使ったrank()の再現をする。
かなりめんどくさいけどこんな感じ。

set @r := 0;

select * from
(select @r := @r + 1 rank, e2.* from
(select job, count(*) from emp group by job order by count(*)
) e2
) e3 where rank = 2;
77NAME IS NULL:2012/01/08(日) 17:27:07.28 ID:338XqApr
基礎からのMySQLという本を読んで、学習中です。
302ページのファイルエクスポートのところなのですが、

SELECT * INTO OUTFILE 'C:/data/out.csv' FIELDS TERMINATED BY ',' FROM tb1;

とすると

「Can't create/write to file 'C:\data\out.csv'(Errcode:2)」というエラーがでます。
これはパーミッションの問題ですか? Windows XPを使っています。
78NAME IS NULL:2012/01/08(日) 17:47:00.02 ID:???
>>77
perrorというコマンドでエラーの詳細が取れる。

> perror 2
OS error code 2: No such file or directory
Win32 error code 2: 指定されたファイルが見つかりません。
7977:2012/01/08(日) 17:59:35.92 ID:338XqApr
>>78
perrorというのは、コマンドプロンプトでやるんですね。
いただいたヒントをもとにdataというフォルダーを作ってもう一度やってみたら
できました!ありがとうございました。

mysqlでファイルのエクスポートはできるけど、フォルダーの作成まではできないと
理解していいでしょうか?
80NAME IS NULL:2012/01/08(日) 19:03:01.43 ID:???
そういう操作はしない。into outfile で同名のファイルが有ったら消すということをせずエラーで終了するし
81NAME IS NULL:2012/01/08(日) 22:04:59.13 ID:J7RBkAVS
うむ
8277:2012/01/09(月) 08:27:51.19 ID:VlYtpvNh
>>80-81
ありがとうございました。
83NAME IS NULL:2012/01/09(月) 14:09:44.88 ID:8po/85zC
安藤優子、木村太郎は、某プロパイダの社外取締役、かつ、安藤は、フジ社外の人間にもかかわらず、フジテレビジョンのM&Aの最中、フジのホワイトナ
イトの【親会社】の本業を無視して、「インターネットは虚業だ。具体性がない
。」というようなことをコメントしました。この虚業は、livedoorを指していた
としても、「同業者」であったということは、非常に、違和感を感じずには、い
られません。
84NAME IS NULL:2012/01/12(木) 00:33:15.75 ID:???
原発の監視システムが止まった件
オラクルのせいにされてるぞ
http://www.ustream.tv/recorded/19694240
85NAME IS NULL:2012/01/12(木) 11:34:57.83 ID:???
十数年前、オラクルの箱を見たとき書いてあったけどなぁ。
原発制御等、不調に見舞われるととても重篤な結果をもたらすことに使っちゃ駄目です
みたいなことを。
86NAME IS NULL:2012/01/17(火) 17:00:22.26 ID:CQkbdlKb
CMS seezooのプログラムを解析してたら
$sql =
'SELECT '
. 'sz_blog_id, '
. 'entry_date '
.'FROM '
. 'sz_blog '
.'WHERE '
. 'entry_date >= ? '
.'AND '
. 'entry_date < ? '
.'AND '
. 'is_public = 1 '
;
というクエリがmodelに書きこまれてたのですが、
なぜ、こんなにも連結だらけにしてあるのかと、
クエリ中の?は何を意味するのでしょうか。
87NAME IS NULL:2012/01/17(火) 17:13:33.99 ID:CQkbdlKb
クエリにあるクエスチョンの意味分かりました。
フレームワークcodeigniterの記述ルールみたいです。
88NAME IS NULL:2012/01/18(水) 02:01:21.80 ID:???
連結が多いのは単に
そういうコーディングルールにしてるってだけだと思うよ
89NAME IS NULL:2012/01/18(水) 15:01:17.12 ID:mSCIAkOx
Mysqlにインデックスってあるじゃないですか。
あれって、たとえば京都市に住む男性の田中さんを検索しようとしたとき、
京都市の人口146万人からさがすところを
"性別"というカラムにインデックスがつけてあったら
京都市の男性人口70万人から
検索されてはやくなるということですか?
90NAME IS NULL:2012/01/18(水) 15:28:07.50 ID:???
>>89
性別ならそうだね
名前にインデックスをつければ、大雑把にいうと名前のあいうえお順で探してくれる
普通なら登録順に探す
本の後ろの索引みたいなものだね
91NAME IS NULL:2012/01/18(水) 15:31:12.87 ID:???
>>90
>名前にインデックスをつければ、大雑把にいうと名前のあいうえお順で探してくれる

?
92NAME IS NULL:2012/01/18(水) 16:05:10.55 ID:???
性別はBTreeインデックスだと意味ないな。
使わないほうが速い。
93NAME IS NULL:2012/01/18(水) 16:29:16.39 ID:???
「埼玉県の田中太郎さん(31)」を探すときに、
50音順版の名簿があれば「た」のあたりに目星を付けて探すだろ?
都道府県順版の名簿なら、埼玉県のあたりから探し始められる。
年齢順版の名簿なら、31歳に絞って探せる。
以下略
94NAME IS NULL:2012/01/18(水) 18:30:45.66 ID:mSCIAkOx
>>93
よく聞く、ツリー式というのは、
31歳に絞る(年齢カラム) → 男性に絞る(性カラム) → 埼玉に絞る(地域カラム)
と、どんどん消去法みたいな感じで絞っていく感じですね。

容疑者の絞り込みみたいな感じですね。
死亡推定時刻はどうか → その時刻にいた人物は → その人物のアリバイは → 
95NAME IS NULL:2012/01/18(水) 20:20:15.78 ID:???
>>94
ちょっと違うかな
インデックスはカラムごとにつけるから名前のインデックスだったら一文字目、その一文字目に属する中で二文字目っていうツリーができて素早く検索できる
96NAME IS NULL:2012/01/23(月) 09:53:13.19 ID:L93U36BH
現在 何万件とレコードのデータがあります。
データが復活できるよう、レコードを消す時は
DELETE ではなく、 表示フラグが false になるという処理をしてます。

やっぱ、このままいくと 重くなっていきますか?

97NAME IS NULL:2012/01/23(月) 10:30:29.85 ID:???
そらそうでしょ。
98NAME IS NULL:2012/01/23(月) 11:15:29.23 ID:L93U36BH
>>97
そらそうですか・・・。

ということは、パフォーマンスをもとめるなら
SQLに残しておけるレコード数には限界があるということですね・・・。
99NAME IS NULL:2012/01/23(月) 11:18:06.85 ID:???
1番軽いのはデータが0件の状態
100NAME IS NULL:2012/01/24(火) 20:32:06.55 ID:/we2kZhZ
PHP+MySQLです。バージョンはおそらく最新
プレースホルダを使ってログインフォームを作成したいのですが、
参考になるサイトもしくは簡単なソースを教えてもらえないでしょうか。
できればピュアPHPでと考えています。
不可能なようならライブラリを使う方法でも一般的なものならOKです。
よろしくお願いします。
101NAME IS NULL:2012/01/25(水) 20:28:35.18 ID:RWRjtLgh
下のCの部分でそれぞれのA,Bを参照するにはどうすればいいですか?
INSERT INTO hoge (id, counter) values (1,A), (2,B) ON DUPLICATE KEY UPDATE counter=C
102NAME IS NULL:2012/01/25(水) 23:05:40.91 ID:???
>>101
INSERT INTO hoge (id, counter) VALUES (1, 11), (2, 12)
ON DUPLICATE KEY UPDATE counter = VALUES(counter);

http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html
103101:2012/01/25(水) 23:33:35.29 ID:RWRjtLgh
>>102
ありがとうございます。VALUESを使うと元の値を参照してしまいませんか?
VALUS(counter)の部分で11,12を参照したいです。
104NAME IS NULL:2012/01/26(木) 07:54:38.21 ID:???
>>103
自分で試してから言ってる?
105NAME IS NULL:2012/01/26(木) 08:00:06.62 ID:???
>>101

無理
106101:2012/01/26(木) 15:58:13.43 ID:hYdeFFJe
>>104
試してますよ。
>>105
ありがとうございます。諦めます。
107NAME IS NULL:2012/01/26(木) 16:31:17.49 ID:???
すみません、SQLの勉強初めてまもないもので、ヒントを教えてください。
テーブルA と テーブルB があって、構造は同じ。データの中身もほとんど同じ。
(でもちょっと違う) テーブルAにあって、テーブルBにないものを探すのは
JOINでつないで、そのあとどうしたらいいんでしょう?
108107:2012/01/26(木) 16:34:14.28 ID:6n12af06
あ、SQL文を教えてくださいというのではなくて、考え方の流れを教えていただけませんか。
よろしくお願いします。
109107:2012/01/26(木) 16:45:41.68 ID:6n12af06
すみません、なんとなくヒントを思いついたので、質問取り下げます
110NAME IS NULL:2012/01/26(木) 23:08:26.92 ID:???
思いついたヒントを教えてください。
111NAME IS NULL:2012/01/27(金) 18:49:21.28 ID:53qgMtio
mysqldumpでバックアップを取る際はロックが掛かってユーザーの操作を受け付けないのは分かるんですけど、リストアする際はsourceでダンプしたsql読み込む際にロックって掛かるんですか?
112NAME IS NULL:2012/01/27(金) 19:39:18.09 ID:???
mysqldump のファイル見てみると
LOCK TABLES `xxx` WRITE

UNLOCK TABLES;
とかあるけど
113NAME IS NULL:2012/01/27(金) 20:36:45.38 ID:7IreXnDq
>>112
なるほど〜
mysqldump取る時にすでにロックとアンロック掛けてsqlへ書き出しているからファイルからsql流し込む際も同様の処理しているので問題ないって事ですね…
ありがとうございます、納得しました
114NAME IS NULL:2012/01/27(金) 23:22:35.76 ID:???
クエリログを出力させようとmy.iniファイルの[mysqld]以下にlog=/var/log/query.log
と書いてMySQLを再起動し、DBに接続してSQLを実行したのですが、ログが出力されません。

何が原因か教えて頂けないでしょうか?よろしくお願いします。
115NAME IS NULL:2012/01/28(土) 08:45:10.45 ID:???
>>114
Linuxならmy.iniじゃなくてmy.cnf
Windowsなら/var/log/query/logじゃなくてC:\...\query.log
116NAME IS NULL:2012/01/28(土) 10:23:11.60 ID:???
Macならどうしよう?
117NAME IS NULL:2012/02/01(水) 18:30:23.94 ID:1T51RBbY
単純なcsv形式の数値データをデータベースに格納したいのですが
列数が固定されていない場合に上手く処理する方法ってあるでしょうか?

5×5型のデータが来たり4×8型のデータが来たりするというわけです…
列の最大値はあると仮定してもよいです

1列分のデータをシリアライズしてしまうか
列の最大値でテーブルを作ってそこにインサートしてしまう(余ってるカラムは空とする)
ということくらいしか思いつきませんが
もっと上手い方法があれば教えてください

よろしくおねがいします
118NAME IS NULL:2012/02/01(水) 18:39:31.02 ID:???
splitで切れば配列に入るので、それをinsertすればいいんじゃね
不足分はnullになるね
119NAME IS NULL:2012/02/01(水) 20:26:24.11 ID:???
CSVストレージエンジンって無かったか?
足りない分はnull可ってしときゃ直接マウント(?)できるかも。
やったことないから保証はしないけど。
120NAME IS NULL:2012/02/01(水) 22:51:55.59 ID:1T51RBbY
やはり列数の最大値でテーブルを作っておいて
列数が少ないものも埋め込むようにするしかないですかね…

ちなみに中身がnullの場合と値が入っている場合とでは
ディスク容量は違うのでしょうか?

例えば整数型の10列のテーブルを作ったとして、そこに
10列分のデータをインサートするのと5列分のデータを
インサート(残り5列はnull)するのとで、使用する容量の
大きさに差は出るのでしょうか?
121NAME IS NULL:2012/02/02(木) 00:16:32.13 ID:???
>>120
http://dev.mysql.com/doc/refman/5.5/en/innodb-physical-record.html

In a fixed-length column, it reserves the fixed length of the column
in the data part of the record.
122NAME IS NULL:2012/02/04(土) 10:02:58.62 ID:/5uKnF5u
別スレで聞いていたのですがどうやら原因がMySQL側にあるようなのでこちらで質問させて頂きます
RoRを利用したSNSを作っており
サイトを高速化しようと
keybufferを16MBから500MBに増やしてみました
すると、MYSQLの応答がめちゃくちゃ遅くなりサイトの読み込みが20秒近くかかるようになってしまいました(元は1秒程度)
慌てて元に戻したのですが設定を戻しても重さが戻らず

sudo server mysql stop
コマンドで数分待たされ

sudo service mysql startコマンドで動くまで10分かかるようなレベルです

レコード数は全部で5万程度なのでそんなに重くなるようなことはないはずです
別のサーバーにデータとプログラムを置き換えたら元の速度で動きます


元の速度に戻すにはどうすればいいでしょうか
ログ等も読んでみたのですが特に問題は出ておらず困り切っております

現在のmy.confです
http://memopa.applest.net/d/242222b13250eca7d

よろしくお願いします……
123NAME IS NULL:2012/02/04(土) 11:48:56.83 ID:???
>>122
メモリを増やしすぎてスワップ起こしてるんじゃないの。
vmstatでswpd、si、soを確認して、
swpdが大きすぎたらいったんOS再起動してみたら。

MyISAMのkey_buffer_sizeはインデックスしか格納しなくて、
テーブルのデータはOSのページキャッシュに頼る仕組み。
なので、key_buffer_size:freeコマンドのcachedを3:7ぐらいか
それ以上に保っておく必要がある。

thread_cache_size = 500はでかすぎ。3桁は初めて見た。
table_cache = 100は少なすぎ(max_connections×よくアクセスするテーブル数)
124NAME IS NULL:2012/02/04(土) 11:57:02.21 ID:???
>>123
>メモリを増やしすぎてスワップ起こしてる

?
125NAME IS NULL:2012/02/04(土) 16:01:23.42 ID:/5uKnF5u
>>123
どうやら大きく勘違いしていたようです
ありがとうございます

めちゃくちゃswapあばばばばな感じになってました

かなりましにはなりましたが結構遅い

PHPMYadminで赤いところを見ると

Innodb_buffer_pool_reads 526 InnoDB がバッファプールの内容を利用できず、シングルページ読み込みを行わなければならなかった論理読み込みの回数
Handler_read_rnd_next  86 G データファイルの次の行を読み込んだリクエストの数。この値が高いのはテーブルスキャンを大量に実行しているためです。一般にこれはテーブルのインデックスが不適切か、クエリがインデックスを利用するように書かれていないことを意味します
Created_tmp_disk_tables 1,598 k ステートメント実行中にサーバがディスク上に自動生成した一時テーブル数。Created_tmp_disk_tables の値が大きい場合は tmp_table_size の値を増やしてディスク上ではなくメモリ上に一時テーブルを構築した方がよいかもしれません
Opened_tables 414 開いているテーブルの数。開いているテーブルが多い場合はおそらくテーブルキャッシュの値が小さすぎます

こんな感じです。適切なインデックスを貼れば改善しそうなのですが、何か参考になるサイトなどはありませんか?
探してみたもののいまいちよくわからなくて……
126NAME IS NULL:2012/02/04(土) 16:17:33.93 ID:???
>>125
問題児を見つけるには スロークエリログ
問題児を更生させるヒントは EXPLAIN構文
127NAME IS NULL:2012/02/04(土) 19:51:20.53 ID:???
>>125
残念ながら断片的な情報しか載せていないサイトがほとんどで、
インデックスの張り方を懇切丁寧に説明しているのは見たことない。

本を買いましょう。
http://www.amazon.co.jp/dp/4873114268

電子書籍版もあるよ。
http://www.oreilly.co.jp/books/9784873114262/
128NAME IS NULL:2012/02/04(土) 20:55:09.52 ID:???
>>125
奥野さんの「漢のコンピュータ道」のブログを隅から隅までよんでみれば
129NAME IS NULL:2012/02/07(火) 16:30:52.85 ID:???
データベースについてですが
レコードの保存する時最大文字数を1000文字と指定したとき文字コードがUTF-8の場合
aaaだと2バイト分の容量で、ああああ・・・×1000だと30000バイト分のなのでしょうか?
それとも両方とも 可変長テキストみたいに3000バイトになっちゃうんでしょうか?
130NAME IS NULL:2012/02/07(火) 16:31:09.67 ID:+k1oH0oq
ID出すの忘れてました・・・。
131NAME IS NULL:2012/02/08(水) 05:03:57.91 ID:???
>>129
> aaaだと2バイト分の容量で、ああああ・・・×1000だと30000バイト分のなのでしょうか?
どういう計算で2バイト、30000バイトと思ったんだ?
aaaだと3バイト分、ああああ…×1000だと3000バイト分

> それとも両方とも 可変長テキストみたいに
固定長テキストって言いたいのか?
132NAME IS NULL:2012/02/08(水) 05:10:42.80 ID:???
>>131
>ああああ…×1000
2000じゃね?
133NAME IS NULL:2012/02/08(水) 09:00:20.59 ID:???
>>132
utf8は、1文字3バイト。
今は4バイト版も追加されたんだっけ。
134NAME IS NULL:2012/02/08(水) 17:55:08.69 ID:???
> それとも両方とも 可変長テキストみたいに3000バイトになっちゃうんでしょうか?
節子!それ可変長やない!固定長や!
135NAME IS NULL:2012/02/08(水) 17:59:58.99 ID:???
色々頭ぶっとんでんな
まず最初にaaaで2バイトとかaの数数え間違えてるし
その後更に1000文字で30000って0一個多く間違えてるし
136NAME IS NULL:2012/02/08(水) 23:05:56.37 ID:II3A4M+D
科目テーブル
100 現金
110 普通預金
500 売掛金
600 売上

売上テーブル
日付 借方cd 貸方cd 金額
2/8 500    600   1200
2/9 110    500   1200

みたいなテーブルがあって、これを下記のように書きたいです。

日付 借方 貸方  金額
2/8 売掛金  売上  1200
2/9 普通預金    売掛金  1200

SELECT 日付,科目,科目,金額 FROM 科目テーブル JOIN 売上テーブル ON 科目.code = 売上.code

みたいに書いてみたのですが、うまくいきません。どうしたらいいですか?
137136:2012/02/09(木) 09:20:09.27 ID:5QaaUiXg
あのー、どなたか、ググるヒントだけでも、お願いできませんか?

やりたいことは、借方コードも貸方コードも、同じ科目テーブルのコード番号から検索して
科目名を表示したいんです。

JOINの条件を 借方コード = 科目テーブルのコード にしてしまうと
貸方コードの分はどうしたらいいのか?よくわからないんです。
それともそもそも JOINでテーブルをくっつけるのが間違ってるんでしょうか。
138NAME IS NULL:2012/02/09(木) 09:31:47.01 ID:???
2回検索すればいいでそ
139NAME IS NULL:2012/02/09(木) 09:35:59.15 ID:???
科目コードと金額は台帳にあって、
科目名だけを表示したいと想像。
名称取得ファンクション作ればいいんでね?
140NAME IS NULL:2012/02/09(木) 10:02:39.75 ID:???
>>136

SELECT tu.日付, tkb.名称, tkl.名称, tu.金額
FROM
 売上テーブル AS tu,
 科目テーブル AS tkl,
 科目テーブル AS tkb
WHERE
   tu.借方cd = tkb.コード
 AND tu.貸方cd = tkl.コード


みたいなことしたらどうなる?
141136:2012/02/09(木) 10:15:11.94 ID:iEIkh6k3
ありがとうございました!できそうな気がしてきました。
>>140さん方式でやってみます。
142NAME IS NULL:2012/02/09(木) 10:41:57.84 ID:???
>>140
MySQLでオラクル方言使えたのか・・・
143NAME IS NULL:2012/02/10(金) 08:43:27.10 ID:???
>>136
もしかしてLEFT OUTER JOINか?
ただのJOINてあんまり使えん。

>>142
ちなみにどこが方言?
144NAME IS NULL:2012/02/10(金) 10:00:39.34 ID:LT2qfOA+
>>143
>ちなみにどこが方言?

みたいなことしたらどうなる? → みたいなことしたらどうなりますか?
145NAME IS NULL:2012/02/12(日) 18:25:12.15 ID:IFW6F+Ws
実践ハイパフォーマンスMySQL89ページに
「'hello'という値を格納するには、VARCHAR(5)型とVARCHAR(200)型の列で同じ量の記憶域が必要となる。もっと短い列を使用するメリットはあるだろうか。」
という文がありますが、意味がわかりません。
・いずれも5バイトを使用する
・いずれも200バイトを使用する
の2通りの解釈ができますが、それ以前のページでVARCHAR型は「必要な記憶域しか使用しない」と明言されているので、前者ですよね?
すると「もっと短い列を使用するメリットはあるだろうか。」とはどういう意味なのでしょう?
'hello'という値を格納するにはVARCHAR(5)より短い列にできないため、意味がわかりません。
何が言いたい分なのか、誰か通訳してください。
146NAME IS NULL:2012/02/12(日) 18:53:26.01 ID:???
通訳しろというなら訳文じゃなくて原文を書け。
147NAME IS NULL:2012/02/12(日) 18:55:41.66 ID:Kj1j50wQ
>>146
>>145さんは本を読んでいてわからないことがあったそうです
148NAME IS NULL:2012/02/12(日) 19:17:13.81 ID:???
>>145
mysqlのページサイズは8KB固定だから。
レコードサイズが8KB以下であっても8KBは必ずアサインされる。
149NAME IS NULL:2012/02/12(日) 19:19:52.56 ID:???
>>148
ページサイズじゃなかったブロックサイズだった
150NAME IS NULL:2012/02/12(日) 19:23:53.27 ID:???
ページサイズは16KBだな
151NAME IS NULL:2012/02/13(月) 11:56:52.58 ID:KA0CffTr
ディスク上は必ず1レコード8KB食うってこと?
152NAME IS NULL:2012/02/13(月) 12:42:36.09 ID:???
質問させて下さい。

select * from Table order by Hoge desc

上記の場合、Hoge列内の文字列を降順で抽出しますが
Hoge内の特定の文字列のみ、最後に回したい場合はどのようにすればよろしいでしょうか。

質問の仕方がおかしかったらスミマセン。

153NAME IS NULL:2012/02/13(月) 12:43:02.07 ID:fxRwCTZt
ID出し忘れました。

質問させて下さい。

select * from Table order by Hoge desc

上記の場合、Hoge列内の文字列を降順で抽出しますが
Hoge内の特定の文字列のみ、最後に回したい場合はどのようにすればよろしいでしょうか。

質問の仕方がおかしかったらスミマセン。
154sage:2012/02/13(月) 15:24:48.60 ID:jkZdWzV4
>>153
最後に回したい場合
select * from Table order by FIELD(Hoge,'最後に回したい文字列') ASC,Hoge

最初に回したい場合
select * from Table order by FIELD(Hoge,'最初に回したい文字列') DESC,Hoge
155NAME IS NULL:2012/02/13(月) 16:11:27.83 ID:???
>>154
ありがとうございます。

試してみます。
156NAME IS NULL:2012/02/14(火) 00:36:53.29 ID:1BB5/ldP
直接MYSQLというわけではないのですが
WebアプリでMYSQLサーバーを使う場合

プログラムの処理でしょっちゅうCPU100%になる、メモリ4GB(Mysqlが使えるのは1GB程度)のサーバー
に同居させるか

MYsql専用で使えるメモリ512MBのサーバー
にMYSQL専用サーバーとして置くか


勿論一概には言えないと思いますがどっちの方が全体として考えた時にパフォーマンスがあがりますか?
メモリが多いほうがいいのかと思い上のサーバーに同居させたところプログラムの重さに引きずられてか
単純なSelectで数秒かかったり(普段は*ms)することがありまして……

157NAME IS NULL:2012/02/15(水) 09:58:59.94 ID:???
最初はoracleを使ってみようと思ったんですが、64bit vistaには対応していないらしいので
mysqlに変えようかと思うのですが、mysqlと64bit vistaでは現在普通に動くのでしょうか?
それとも何かしらインストール時に別途作業が発生するのでしょうか?
158NAME IS NULL:2012/02/15(水) 17:37:51.50 ID:???
win7 home 64ビット + Excel2010(32ビット) で動かしてますが
159NAME IS NULL:2012/02/16(木) 19:44:30.33 ID:puLrBsPX
エクセルファイルがあってカンマ区切りのCSVファイルに変換
⇒文字コードをUTF8へ変換
⇒MysqlへCSVファイルをインポートすると特定の行がズレてしまいます。

"商品名",”商品コード”,"価格","卸価格"のカラムがあったとして、

"商品A","a001","1000","800"
"商品B","b002","0","0"
"shohinC","shohinC","500","200"

・・・というファイルをインポートすると、

"商品A","a001","1000","800"
"商品B","b002","0","NULL"
"shohinC","500","200","NULL"

・・・という風に同じ内容が続いていると、その部分がすっぽり抜けて左へズレてしまうのです。
初歩的なことかもしれませんが、お助けくださいませ・・・
160NAME IS NULL:2012/02/17(金) 11:12:38.92 ID:alZZJL4J
会員登録されたユーザーのレコードがあります。
ユーザーの年齢とか、プロフィールとかはカラム化されています。
そこに、ユーザー個々がユーザー画面や、細かなセッティングができる
オプション状態を記録するカラムを足そうとおもうのですが、

一個一個、
| userPage_color | userFont_size | userCss_URL |

みたいにカラムを作るか、

一つの
| userOption | 
というカラムに、

Page_color,#FF8899,
Font_size,12px,
userCss_URL,http://xxx.com/css/index.css




と、CSV的なものテキストデータとして入れるか
どちらのほうが、後々、管理やシステム変更をしやすいでしょうか?
161NAME IS NULL:2012/02/17(金) 12:22:58.32 ID:???
ユーザオプションが、予想されうる未来において項目不変なら、前者にするかも。
変わり得るなら、

オプション項目マスタ
項目ID  項目名称
1     ページカラー
2     フォントサイズ
3     CSSのURL

ユーザオプション
ユーザID  項目ID  値(文字列)  値(数値)

値はnull可

とかするかな? (つまりカラムを足すのではなく、別テーブルを作る)
162NAME IS NULL:2012/02/17(金) 13:50:40.73 ID:???
>>159
手元の5.5.20では再現しなかった。

mysql> load data local infile 'test.csv' into table t1 fields terminated by ',';
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+---------+---------+------+------+
| c1 | c2 | c3 | c4 |
+---------+---------+------+------+
| 商品A | a001 | 1000 | 800 |
| 商品B | b002 | 0 | 0 |
| shohinC | shohinC | 500 | 200 |
+---------+---------+------+------+
3 rows in set (0.00 sec)
163NAME IS NULL:2012/02/18(土) 04:26:13.17 ID:Y+cJ8ys3
複数のカラムを一括で空にしたいので、
「 UPDATE table SET `value1' = null , `value2` = null , `value3`・・・・・」

という文を作りたいのですが、一つ一つに=nullを指定するのではなく、(カラム群)=nullのようにまとめて扱う方法はないでしょうか。
PHPでいうarray(val1 , val2)のような感じで。
164NAME IS NULL:2012/02/18(土) 06:12:14.75 ID:???
>>163
ないと思う。
165NAME IS NULL:2012/02/18(土) 11:53:16.79 ID:???
>>164
そうですかあ・・どうもです
166NAME IS NULL:2012/02/19(日) 07:31:05.02 ID:???
「探検ドリランド」 で増殖技がバレてレアカード複製祭り発生中wwwwww
http://jin115.com/archives/51849925.html

>カード増殖裏技
>必要なもの 携帯もしくはPCを二台 gleeアカウント二つ
>二台の機器でそれぞれのgleeアカウントでログインしてドリランド起動後お互いでトレードさせる
>トレード(受け取りはしない)が終わったら片方の機器はログアウトして二つの機器のアカウントを同じにする
>それぞれトレード品受け取り画面にして受け取るボタン同時押し

これどう思いますか?
自分はちょっと信じ難いのですが…
トランザクションするか、してなくてもユニークID割り当ててれば複製なんて出来ないと思うのですが
167NAME IS NULL:2012/02/19(日) 10:25:33.19 ID:SgHncMDX
質問させてください

構造のみでデータが空のテーブルAと、中身の入ってるテーブルBがあります。
Bに入っているID(プライマリ)をAのb_idというカラムにピーコしたいのですが、SQL文はどんなもんになるでしょうか。

よろしくお願いします。
168NAME IS NULL:2012/02/19(日) 10:27:52.77 ID:M7DDJUDu
insert into a(b_id)
select id from B;

かな
169NAME IS NULL:2012/02/19(日) 10:46:16.77 ID:???
>>168
一発回答あざっす!バッチリでした。

http://www.amazon.co.jp/dp/4774138355/
「SQLポケットリファレンス」

この辺り買ってみようかな。
入門書だけだといまいち解決しなくって。
170NAME IS NULL:2012/02/19(日) 11:15:43.98 ID:???
一冊ちゃんとした本を買うのに異論は無いが、今回程度のは、
mysql insert 他テーブルから
でぐぐれば、MySQLのマニュアルも勝手解説ページも、いくらでも見られるよ。
171NAME IS NULL:2012/02/19(日) 11:44:44.04 ID:???
>>170
上二つほど紫でございました。

>INSERT ... SELECT 形式の INSERT では、
>別の 1 つまたは複数のテーブルから選択されたレコードが挿入されます。

重要なのはここですかね。

最初に見たときはどこを読めばいいのかが分からなくて諦めてしまいました。
足りないのは参考書でもgoogleの性能でもなく、文章を理解する能力のようで。。。お恥ずかしい
172NAME IS NULL:2012/02/19(日) 12:56:49.12 ID:???
GUIでテーブルの中にデータ突っ込むとインサート文を発行してくれるようなツールって無いでしょうか?
現在eclipseのERMaster使ってるんですが、このツールだとデータの作成の時に直接DBに突っ込めないのと、桁数チェックとかやってくれないのが不満です。
テストデータの作成に特化しているようなツールが有れば紹介してください。
173172:2012/02/19(日) 12:59:18.26 ID:2Z0oxaKz
ID表示はこれで出来るかな??
174NAME IS NULL:2012/02/19(日) 21:40:54.76 ID:???
>>172
好きなツールでデータ突っ込んでからmysqldumpすればいいんじゃね
175NAME IS NULL:2012/02/20(月) 03:44:47.77 ID:bm2ewz8N
GREEのドリランドというゲームでアイテム複製バグ祭りが発生してますが
あれだけでかいサービスになると、テーブル分割かサーバー分割とかしてると思うので
そういった場合でもトランザクションてできるもんなんでしょうか?
仮にMySQL5.5でINNODB使ってるとして、
・テーブルがパーティショニングで分割されている
・テーブルが別DB(別サーバー)に分割されている
それぞれの場合でトランザクションできるか・する方法を教えてください
176NAME IS NULL:2012/02/21(火) 00:12:17.84 ID:KD0gxEQf
そんなに誰も答えられないほど難問なのか?
177NAME IS NULL:2012/02/21(火) 03:03:23.04 ID:???
>>175
そういう要件のためにXAがある。MySQLで実際に使ってるのは見たことないけど
http://dev.mysql.com/doc/refman/5.1/ja/xa.html
178NAME IS NULL:2012/02/21(火) 07:56:39.52 ID:???
>>175
まず、InnoDBの場合、XAはSQLレイヤーとInnoDBの間での2フェーズコミットに使います。

で、回答ですが
>・テーブルが別DB(別サーバー)に分割されている
たぶんコレには使っていないと思いますが…
中の人じゃないのでわからん

テーブルパーティショニングはXA関係ないんじゃね?と思っていた。
だれか補足
179NAME IS NULL:2012/02/21(火) 09:04:38.39 ID:???
Aというユーザーでテンポラリテーブルを
create temporary table tmp(id int(4));
作り、Aでまた別に
MySQLに接続した時、テンポラリテーブルを
select * from tmp;
とすると
Table 'tmp' doesn't exist
となりますが、作って接続しているユーザーのみがその時だけ
実行できるということなんでしょうか?
作ったユーザーでその場で
show tables;
しても見えないんですけど
select * from tmp;
すると
Empty Set
なんで存在していることは判るんですが。


180NAME IS NULL:2012/02/21(火) 10:27:26.49 ID:???
>作って接続しているユーザーのみがその時だけ実行できるということなんでしょうか?

http://dev.mysql.com/doc/refman/5.1/ja/create-table.html
TEMPORARY テーブルは現在の接続でのみ現れ、接続が終了すると自動的にドロップされます。
これは、2つの異なる接続同士、または、既存の同名の非TEMPORARY テーブルとお互いに
対立する事無く、同じテンポラリ テーブル名を利用する事ができるという意味になります。
(テンポラリ テーブルがドロップされるまで、既存テーブルは隠されています。)


>作ったユーザーでその場で show tables; しても見えないんですけど

既知の問題らしいよ。
http://dev.mysql.com/doc/refman/5.1/en/temporary-table-problems.html
The SHOW TABLES statement does not list TEMPORARY tables.
181NAME IS NULL:2012/02/21(火) 10:50:53.75 ID:???
>>180
あ〜、、、ありがとうございます

ERROR 1137: Can't reopen table: 'temp_table'
↑も、はて?と思ってたとこでした。
182NAME IS NULL:2012/02/21(火) 10:57:00.43 ID:OsnjwX+/


MIKAMIのインターネット   でググれ


このブログ痛すぎwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
クソワラタwwwwwwwwwwwwwwwwwwwwwwwwww
183NAME IS NULL:2012/02/21(火) 16:22:30.12 ID:???
GREEの事件を見て思ったんだけど、重複カードを一枚だけ残して他は削除するSQLってどう書くの?
仮のテーブル構造として、USER_CARDテーブルにidと card_idがあって
何故か主キーが(id,card_id)ではなく(id)だけってお題で教えて。
184NAME IS NULL:2012/02/21(火) 18:14:45.94 ID:IA7KONQM
質問です
web developerがクエリを
select id,name from [table];
のように角括弧付きで生成するせいかエラー落ちするのですが
これはmySQLのバージョンupしたら治りますか?

[MySQL][ODBC 3.51 Driver][mysqld-5.5.20]
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 '[accitem]' at line 1
となってます
ちなみにSQLバージョンは5.5.20です
もう死にたい
185NAME IS NULL:2012/02/21(火) 19:53:13.10 ID:???
>>177
InnoDBであれば、別DBにシャーディングしてしまったら、2フェーズコミットはできない。
(Semi-Synchronus replicationがせいぜい。)
186NAME IS NULL:2012/02/21(火) 21:53:42.51 ID:???
>>183
そういう質問するなら、idとcard_idが何を表していて、重複カードというものが
そこでどう表現されるのかくらいは書こうよ。
187NAME IS NULL:2012/02/22(水) 18:59:16.04 ID:pZRWhFER
サイトを構築するとき 設計図を書いたりすることもあると思うんですが
データベースに関する設計も、メインテーブルがこれで、こんなカラムがあって・・・
とか設計図を書いたりしますか?
それともつくりながら考えますか?
188NAME IS NULL:2012/02/22(水) 19:28:21.38 ID:???
ER図は一応描くわな。
189NAME IS NULL:2012/02/22(水) 23:13:58.31 ID:???
仕事でドキュメントの提出が必須な時はER図など嫌々書く。
190NAME IS NULL:2012/02/23(木) 07:05:38.30 ID:???
>>187
>>172のツール使ってみ、ER図の作成が=DBにcreate table突っ込むのと同じになるし
そもそもER図が有った方が後々見やすい、成果物に設計書付けない事も無いと思うし
他の人の使ってるツールも聞いてそれで作ってみるのも重要だと思うよ

てか保守が厳しいからER図書かないなんてよっぽど小さい物以外無いだろ
頼むからER図ぐらい書けてくれ、そしてかけない奴はSE名乗るなと思ったりもする
191NAME IS NULL:2012/02/23(木) 08:55:35.27 ID:+ehmXX/R
【1 OSの種類         .】 Windows vista 64bit
【2 Excelのバージョン   】 Excel2007

microsoft queryからのmysqlへの接続がうまく行きません、ご存知の方ご教授ください。

http://www.dbonline.jp/mysqlinstall/install/
ここを参考にmysqlを落とし、utf^8で設定
コマンドプロンプトからは文字コードが違うので日本語が打ち込めない状態。
適当にルート以外のユーザーとテスト用のDBを作成、参照出来るようにテーブルを作り、データをインサートしておく

mysql-connector-odbc-5.1.10-winx64.msiを落とし設定(適当にnext)

コントロールパネル→管理ツール→データソース(ODBC)から
ユーザーDSNとシステムDNSに設定、testボタンを押したとき
「connection successful」と出るのを確認

excelからデータ→その他のデータソース→microsoft queryを選択
データソースの選択画面が出てくるので、先ほどデータソース(ODBC)から追加したと思われる(おそらくシステムDNSの方?)
「test*」を選択し、OKボタンを押す

「データ ソース名および指定された既定のドライバが見つかりません」と表示される

このような感じなのですが原因はどのような物が考えられるでしょうか?
192187:2012/02/23(木) 10:10:51.28 ID:/m8OsfNy
>>回答くださった方

回答くださった方ありがとうございます!!
ER図なるものを初めて知りました。
それをググって派生して、
エンティティ、属性、等も知ることができました。

いやー、質問してよかったです。
193NAME IS NULL:2012/02/23(木) 11:20:19.74 ID:4TD8YxUG
>>191
odbcドライバを32ビットのものにしたらあっさりと接続したよ、俺は w

結局office側は32ビットなんで
194NAME IS NULL:2012/02/23(木) 11:53:09.74 ID:+ehmXX/R
>>193
ありがとうございます。
私も今しがた32bit版のドライバをインストールし接続できました。

ただインストーラーを使ってしまったので、どんな状況になって繋がってるのかさっぱりわかりません;;

どういった感じなんでしょう??
64bit版のドライバを32bit版が上書きしているが、64bitMySQLに繋がっている状態??
英語が出来ないのでインストーラーに頼る前提でインストールしていたので謎は深まるばかりです。

DSNの設定は64bit版を入れていた時に設定した物でそのまま動作しているし??
取り敢えず64bitMysqlと32bitドライバで動くようになった事を書付として残しておいて、暫く試験運用って事で様子見をして見ます。

※現在そちらも同じような環境でしょうか?運用してどれぐらいになるか参考までに聞かせていただけると嬉しいです。
195193:2012/02/23(木) 12:59:05.86 ID:???
>>194
win7(home) 64ビット + office2010(32ビット)
mysql 5.5.19
odbc mysql-connector-odbc-5.1.9-win32
1月に新しいPCにして以来
俺はqueryは使わずもっぱら ado接続のみだけ

Windows7(x64)でMySql ODBC接続
http://blog.toratech.net/article/40504533.html
を読んだけどよく判らんかった^^;
196191:2012/02/23(木) 13:50:19.06 ID:???
>>195
回答ありがとうございます。

その記事は私もたどり着きました。
ただ、ODBCの管理ツールが二つある、32bit版の管理ツールで設定すると良いらしいとの事だと読み取りましたが、
フルパスで打ち込んでそちらの方で設定しようとすると、ODBCが見つからないと言われて行き詰ってました。
64bitのドライバを32bitの管理ツールで??とか思いましたが。

何処でどういうエラーが出ているのか・・・管理するソフトウェアの仕様という事なんでしょうかね?
詳しく分からないとやはり母国語が英語じゃ無い事が憎らしい;;
197NAME IS NULL:2012/02/23(木) 21:15:05.54 ID:/m8OsfNy
非依存型リレーションは分かるのですが、
依存型リレーションで、

【受注テーブル】
受注番号
受注日
配送先

|(依存リレーション)

【受注明細テーブル】
受注番号(FK)
明細番号
数量
送料

と分けるのと

【受注テーブル】
受注番号
受注日
配送先
明細番号
数量
送料

と、一つのテーブルにまとめる違いが
イマイチよくわかりません。
依存型リレーションとして分けるメリットは
どのようなことがあるのでしょうか。
198NAME IS NULL:2012/02/23(木) 22:18:13.58 ID:???
ひとつのエンティティとみなすか、ふたつの異なるエンティティの組合せとみなすかだろ。
まぁエンティティというのは不可分でその単位で存在したりしなかったりするものだから
その形の場合、依存する側の多重度は0..1/*となるのが普通だが。
199NAME IS NULL:2012/02/24(金) 07:24:12.68 ID:???
明細番号が分かれるから複数ページにまたがる時にとか
200NAME IS NULL:2012/02/24(金) 15:25:17.50 ID:???

あ、1受注に対して、明細が複数あった場合ということか・・・

回答ありがとうございます。
201NAME IS NULL:2012/02/24(金) 21:52:23.80 ID:zcQyvLtE
SET timestamp=1330087285;
UPDATE `entry` SET `up_date` = '2012-02-24 21:41:13', `view` = 15 WHERE `entry`.`id` = 2968;

記事が閲覧される度に閲覧数をカウントアップするためにこんな感じのSQLを発行しています

slowlog_queryを確認すると
これが7秒や8秒、遅い時で40秒近くかかる時があります
PHPMYADMINから直で打つと数ミリ秒で実行されます
更に、他のUPDATE処理は全て正常にミリ秒で行われます

原因として一体何が考えられますか?
entry.idには勿論indexは貼ってあります
202NAME IS NULL:2012/02/25(土) 00:31:10.93 ID:???
>>201
あんまりないと思うけど、ロック待ちかな。
SHOW FULL PROCESSLIST;を数秒おきに実行して、
40秒かかっているときに何が起こっているのかを確認するとよい
203NAME IS NULL:2012/02/25(土) 01:21:06.60 ID:eXfD6bYl
>>202
ありがとうございます。ちょっと確認してみたのですが
特に何も異常は見当たらず……

# Query_time: 7.948575 Lock_time: 0.000051 Rows_sent: 0 Rows_examined: 0
SET timestamp=1330099695;
UPDATE `entry` SET `up_date` = '2012-02-25 01:08:08', `view` = 298 WHERE `entry`.`id` = 8821

ロックタイムは微々たるものです
他の項目に関しては全然遅くないのですがなぜかここだけめちゃくちゃ遅い……
なんでなんだろう……
204NAME IS NULL:2012/02/25(土) 17:30:08.76 ID:AgGTppYT
質問です。
使えるねっとのWin2003VPSサーバーを契約してます。

plesk→phpadminでmysqlのテストデータベースとテーブルを作成

odbcドライバをインストール

odbcデータソースに「mysql5.1ドライバー」を追加

テスト接続では「connection successful」と出る。

Excel2003で「データ」→「外部データのとりこみ」→「新しいデータベースクエリ」
→「データソースの種類」→「MYSQL」を選択しOKを押すと

「データ ソース名及び指定された規定のドライバが見つかりません」とエラーメッセージが出ます。

原因はなんでしょうか?
205NAME IS NULL:2012/02/26(日) 17:38:02.70 ID:???
チョット上を読もうか
206NAME IS NULL:2012/02/27(月) 17:50:49.40 ID:oVY8HvyU
以下のようなSQLを発行したいと思っています。

update
table1
set
table1.num + (select num from table2 where column1 = 1)
where
table1.id in (select id from table2 where column1 = 1)

このようなクエリで、どちらのサブクエリも同じレコードにする方法などございますか?
207NAME IS NULL:2012/02/28(火) 13:53:12.29 ID:???
>>206
こういう事かな?

update
  table1
  inner join table2 using(id)
set
  table1.num = table1.num + table2.num
where
  table2.column1 = 1;
208NAME IS NULL:2012/02/28(火) 14:30:20.40 ID:ugSWazyc
多対多の関係が必要な時につくる、中間テーブルってあるじゃないですか、
あれって正式には何と呼ばれてるんでしょうか。
たとえばテーブル users と groups があって、両方を結びつける
create table users_groups (
 user_id integer not null references users(id),
 group_id integer not null references groups(id)
)
みたいなの。
呼び方がわからないので、勝手に中間テーブルと呼んでいるんですが、ほんとは何という名前なのでしょうか。
209NAME IS NULL:2012/02/28(火) 20:07:32.98 ID:???
テーブルをパーティションというものに分けた時のメリットってなんですか?
210NAME IS NULL:2012/02/28(火) 23:39:58.46 ID:tm6Avr0W
あるアクションに対するログテーブルみたいのがあるんですが、
1時間以内ログを全部とってきて、それぞれのログの数をカウントしたいんですよね。
で、クエリじゃなくスクリプトで作るならできるんですが、
クエリで、アクション毎のカウントってできますか?
1アクション1レコードな感じで保存しています。

よろしくおねがいします。
211NAME IS NULL:2012/02/29(水) 10:27:03.93 ID:???
>>208
この記事でも中間テーブルって言ってるからそれでいいんじゃないかな
http://siob.sint.co.jp/er/serial/serial02.html
212NAME IS NULL:2012/02/29(水) 10:45:37.74 ID:???
>>209
・フルスキャンするクエリの負荷を絞り込める
・統計情報がパーティションごとに管理されるため、より適切なSQL実行計画が期待できる
・DROP PARTITIONを使えば過去データの削除が速い
・DELETEで削除する方針に比べデータファイルの断片化を抑えられる

Oracleならこれに加えて
・パラレルクエリを用いた並列処理ができる
・古いパーティションのデータを圧縮することができる
213NAME IS NULL:2012/02/29(水) 10:49:23.81 ID:???
>>210
SELECT action_type, COUNT(*)
FROM action_log
WHERE action_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY action_type

むしろ、どこらへんが難しいと思ったのか知りたい
214NAME IS NULL:2012/02/29(水) 16:36:23.91 ID:???
>>212
回答ありがとうございます

>・フルスキャンするクエリの負荷を絞り込める

これは、例えばアクセスを局所的に抑えることが出来るという理解でよろしいのでしょうか?
215NAME IS NULL:2012/02/29(水) 17:21:37.63 ID:???
>>214
そう。

例えば売上テーブルを月ごとにパーティショニングしておけば
月ごとの売上集計で多少ひどいクエリを実行しても、
フルスキャンするのは当月の1パーティションだけに抑えられる。
216NAME IS NULL:2012/02/29(水) 18:20:33.06 ID:???
ER図を書くのにいいツールはありませんか。
テーブルやカラムごとにコメントが書けるものがいいです。
当方Macですが、プラットフォームにこだわらず紹介していただければ。
217NAME IS NULL:2012/02/29(水) 19:27:30.80 ID:???
ID出してないな。 >>216

俺は、EclipseのプラグインのER Master っての使ってる。
良いとして薦めはしない(これは勘弁してくれってとこがある)けど、
いちおうテーブルにもカラムにもコメントは書ける。
つか、書けないツールの方が少ないんじゃないか?
218NAME IS NULL:2012/02/29(水) 19:34:39.94 ID:???
>>216
特別絶賛おすすめするほどではないけど
本家のMySQL Workbenchでいいんじゃないの。コメント書けるよ
219NAME IS NULL:2012/02/29(水) 19:37:53.61 ID:???
>>215
ありがとうございます。
220NAME IS NULL:2012/03/01(木) 10:49:41.46 ID:???
>>216
当方MACなので
ブラウザ上で動作する mysql designer というの使ってる。
http://ondras.zarovi.cz/sql/demo/?keyword=default
221NAME IS NULL:2012/03/01(木) 21:27:51.42 ID:5sB6rcpv
MySQLのテーブルに”−”(全角マイナス)って登録できないんですか?
”ー”(長音)ならば出来るようですが…
222NAME IS NULL:2012/03/01(木) 22:16:13.29 ID:???
文字コードで 0x5c に引っかかってると予想
http://charset.7jp.net/sjis.html
223NAME IS NULL:2012/03/01(木) 22:47:10.46 ID:???
質問です。

MyISAMは、書き込みのときにテーブルロックを行うそうなのですが、
このテーブルロックというのは、他の書き込みを阻止するという意味でしょうか?
または、書き込みも読み込みも関係なくすべてのアクセスを阻止するという意味でしょうか?
224NAME IS NULL:2012/03/01(木) 23:36:03.44 ID:???
書き込みのテーブルロックは、ロックを取得した奴以外は、
(書き込みは勿論)読み込みでもブロックされるよ。
225>>223:2012/03/01(木) 23:41:25.52 ID:???
>>224
thanks
226NAME IS NULL:2012/03/02(金) 01:08:08.60 ID:yjU4uzp8
echo "CREATE INDEX `cl_collation` ON categorylinks (`cl_collation`);" | nkf -w| mysql --user=user --password=pass Database | nkf -e

というコマンドのかかれたシェルスクリプトを実行してbashコマンドラインからインデックスの付与を行いたいのですが、

ERROR 1064 (42000) at line 1: 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 'ON categorylinks (,,,)' at line 1

というエラーが出て止まってしまいます。

恐らくバッククォートのエスケープ処理がうまくできていないのだと思いますが、どうすればいいのでしょうか。
227226:2012/03/02(金) 01:45:10.50 ID:yjU4uzp8
バックスラッシュをバッククォートの前につけるだけでとりあえず動きました。
228NAME IS NULL:2012/03/02(金) 15:42:30.13 ID:???
まだほとんど勉強してない状態でイメージでの質問ですが、
よくウェブサーバーとMySQLサーバはわけろって言われるんですが、
ウェブサーバとSQLサーバを別個に用意して、phpなどからMySQLサーバーに
接続して処理させようとするときは、phpのソースに接続先IPおよびMySQLのアカウントとパスを
書いておくってことなんでしょうか?
229NAME IS NULL:2012/03/02(金) 20:30:05.49 ID:???
>>228
YES
230NAME IS NULL:2012/03/02(金) 21:31:28.31 ID:BzTarHSh
一般的にそうなんですか??
ウチの会社ではデータベースもperlもPHPも同じサーバで運用してます。
分けるとレスポンスが低下するってイメージしか無かったです。
231NAME IS NULL:2012/03/02(金) 21:46:22.76 ID:???
小規模なら1台にまとめる、
中規模以上なら分けて、PHPが動くサーバの台数を増やしていく
232228:2012/03/02(金) 22:25:01.18 ID:45ALAGnb
レスどうもです
小規模なら1台で良いのですか?
よく、ウェブサーバーとデータベースサーバー一緒にするなんて
セキュリティ的に御法度だと聞くんですが・・・
脆弱性が起こりやすいウェブサーバーから、データベースに影響が及ぶのを避けるためかと
思ってましたが、現場ではそんなことはないのですか?
233NAME IS NULL:2012/03/02(金) 23:29:29.35 ID:???
心配なら分ければいいんじゃね
234NAME IS NULL:2012/03/03(土) 05:43:00.24 ID:???
>>232
>セキュリティ的に御法度

?
235NAME IS NULL:2012/03/03(土) 11:41:26.08 ID:???
そら分けた方が、Webサーバー盗まれてもDBは無事って意味では安全だべ
心配なら分ければ?としか言えない
236NAME IS NULL:2012/03/03(土) 11:51:51.43 ID:???
会社の信用が大事なら分けるだろ。
webサーバーが危ないんだっけ?PHPの方が危ないバグが出るイメージあるが
237NAME IS NULL:2012/03/04(日) 07:25:56.39 ID:8oq86TOM
アクセスログ用の100万件のレコードに対して
最適な設計が出来るようにテストしています。

日付のカラムをdatetime型にしているのですが、
WHEREの条件でDATE_FORMAT(date, '%Y%m%d')='20120304'

とすると、EXPLAINを見る限りインデックスが使われていません。
DATE_FORMATを使った場合って、インデックスは効かないのでしょうか?

また、アクセスログのような用途で「年・月・日別検索」を想定した場合、
datetime型ではなくて複数に分けるべきなのでしょうか?
238NAME IS NULL:2012/03/04(日) 10:48:41.09 ID:???
>>237
検索対象カラムに関数を挟むとインデックスは利用できない。
これはOracleやPostgreSQLでも同じ。

date >= STR_TO_DATE('20120304', '%Y%m%d')
AND date < STR_TO_DATE('20120305', '%Y%m%d')

> datetime型ではなくて複数に分けるべきなのでしょうか?

分けていいけどDATETIMEも残しておいた方がいいかと
239NAME IS NULL:2012/03/04(日) 16:47:09.73 ID:8oq86TOM
>>238
ありがとうございます。
よく調べたら確かに関数を使うとインデックスが効かないとありました。

試しに「年」「月」「日」「時間」で分けるカラム構成にしたところ、
インデックスが効くようで高速になった気がします。
ただ、やっぱり十万単位のレコードがあると重いですね。
PHPで表示させた時、数秒単位で時間がかかります。
オープンソース見ると特に変わったことしてないし、
Webサービスのアクセス解析はどうしてるんですかね。

あとDATETIMEも残すようにしたいと思います。アドバイスありがとうございました。
240NAME IS NULL:2012/03/04(日) 20:44:20.25 ID:CmBNNLM+
常に参照され、定期的に更新し、全文検索が必要な場合、InnoDB、MyISAM、マスター、スレーブ等はどのような構成にするのが良いでしょうか?
241NAME IS NULL:2012/03/04(日) 22:34:11.34 ID:???
全文検索が必要な場合 というだけでテーブルのエンジンはMyIsam一択でしょ?

後、「常に参照され、定期的に更新し、全文検索が必要な場合」
ということと、マスター、スレーブは関係ないと思うのだけど
242NAME IS NULL:2012/03/05(月) 08:23:14.25 ID:???
MySQLで日本語の全文検索は可能なのですか?
243NAME IS NULL:2012/03/05(月) 18:43:15.39 ID:???
mysqlが文字化けしちゃう。助けて
244NAME IS NULL:2012/03/05(月) 19:04:58.16 ID:???
mampのmy.cnfってどこにあるの?
245NAME IS NULL:2012/03/05(月) 19:32:23.06 ID:???
>>243
症状は?
コマンドプロンプトから更新かける時に文字コードが違うと言われるなら
プロンプトの文字がshift-jisだkら。

shift-jisで設定していて読み出す時に一部だけ文字化けするならそれはshift-jisの仕様だから。
utf-8にすれば出ないと思われ。

linuxだったらデフォルトの文字コードがutf-8だからお勧めの文字コードがutf-8で設定されている。
246NAME IS NULL:2012/03/05(月) 23:01:18.03 ID:???
俺も全文検索知りたい。どういうSQLになるんだ?
247NAME IS NULL:2012/03/05(月) 23:32:27.59 ID:???
>>246
MyISAMでの全文検索構文なら、普通にMySQLのマニュアルに書かれてるよ。
Tritonn(MySQLにパッチあてて、sennaを使えるようにしたもの)でも、
mroonga(groongaをMySQLから使えるようにするもの)でも、
基本的にはその構文を引き継いでたはず。
248NAME IS NULL:2012/03/06(火) 04:28:49.92 ID:???
>>247
>Tritonn(MySQLにパッチあてて、sennaを使えるようにしたもの)でも、
>mroonga

どちらも日本語全文検索はうまくいかないと思うが
249NAME IS NULL:2012/03/06(火) 11:41:07.55 ID:???
Tritonnの日本語全文検索は実績あるだろ
ぐぐってみ
250NAME IS NULL:2012/03/06(火) 22:51:11.94 ID:???
fc2のレンタルサーバーlightでmysqlを使っているのですが、
日本語を登録すると文字化けしてしまいます。
全然操作方法が分かりません。照合順序をujis_japanese_ciに
しています。多分照合順序で文字化けと思うのですか。
日本語設定がない?でしょうか?
FC2にメールすべきでしょうか?
251NAME IS NULL:2012/03/07(水) 17:38:30.67 ID:kDqT5Hn4
phpmyadmin で あるテーブルのフィールドの内容を変更しようとすると
#1025 - Error on rename of .... (errno: 150)
とエラーがでます。
削除もできません。
他のフィールドは大丈夫です。

なんか、編集できないようにロックがかかってるぽいんですが
どうすれば、解くことが出来るのでしょうか
252NAME IS NULL:2012/03/07(水) 18:44:05.27 ID:???
「mysql エラー 1025 150」で検索してみた?
253NAME IS NULL:2012/03/07(水) 23:13:11.46 ID:???
質問です。

データベースaaaとデータベースbbbがあったとして、
それぞれが利用しているディスク容量を知るにはどうしたらよいでしょうか?

MyISAMとInnoDBの両方について知りたいです。
254NAME IS NULL:2012/03/07(水) 23:36:51.38 ID:???
>>253
こうかな?

SELECT TABLE_SCHEMA, SUM(DATA_LENGTH + INDEX_LENGTH)
FROM INFORMATION_SCHEMA.TABLES
GROUP BY TABLE_SCHEMA;
255>>253:2012/03/08(木) 23:07:59.70 ID:???
>>254
ありがとうございます!
256NAME IS NULL:2012/03/10(土) 15:49:20.33 ID:W+nE1TCt
1回目の書き込みは新規、2回目の書き込みは上書きを
もっとうまくでけんかと調べてたら
REPLACE文 なんて便利なものあるのかよ!
ちくしょう!
257NAME IS NULL:2012/03/10(土) 18:30:15.40 ID:???
insert で on duplidate update kery というのもある
258NAME IS NULL:2012/03/11(日) 03:33:49.88 ID:v7Ji0Ifs
Aテーブルにあるdateが2011-12-31以前のデータを
Bテーブルに移したいのですが、どういうSQLを書けばいいのでしょうか?
上手く、ググれないので教えてください
259NAME IS NULL:2012/03/11(日) 06:19:30.88 ID:???
insert into b select * from a where 日付カラム <= '2011-12-31';
260NAME IS NULL:2012/03/11(日) 17:36:22.19 ID:???
>>259
ありがとうございます。希望通りに出来ました。
261NAME IS NULL:2012/03/13(火) 00:46:04.63 ID:???
質問です。

select for updateって何のために必要なのでしょうか?

トランザクション使えばいいだけだと思うんですが。。

こういう場面で、select for updateを使う!というのがありましたら教えてくださいm(_ _)m
262NAME IS NULL:2012/03/13(火) 08:01:00.97 ID:???
>>261
SELECT FOR UPDATEを使わず同じことをするには
トランザクション分離レベルをSERIALIZABLEにする必要がある。

READ COMMITTED/REPEATABLE READ+SELECT FOR UPDATEの方が
設計はかなり楽
263NAME IS NULL:2012/03/14(水) 21:36:21.36 ID:xkBwsneG
MySQLの文字化けでご質問させてください。
XAMPPからインストールしたMySQL ver5.5.16ですが文字化けが直せません。

UTF-8にしたく、my.iniにも
character_set_server = utf8
skip-character-set-client-handshake
の2文を追加し、MySQL再起動。
その後データベースを削除し、新規に作り直し、status等で確認したところutf8になっていましのたで、
テーブル等も作りましたが、select分で確認したところ、全角文字だけ空白でなにも表示されません。

同じような手順でsjis,ujisと試しましたが、ujisは文字化けしましたがsjisだけうまくいきました。
しかし、ブラウザ表示させたく、utf8にしたいので非常に困ったいます。

よろしくお願いいたします。
264NAME IS NULL:2012/03/14(水) 23:53:24.83 ID:???
>>263
skip-character-set-client-handshakeしろって書いてあるブログを信用してはいけない。

[mysqld]
character_set_server = utf8mb4

[mysql]
default_character_set = cp932

[client]
default_character_set = utf8mb4

これで試してみて。
265NAME IS NULL:2012/03/15(木) 17:07:39.66 ID:???
特殊文字を扱うにはどうしたらいいんでしょうか

INSERT INTO LIST VALUES(0, '\', '0', '0');

とコマンドプロンプトで入力しても反応しません
266NAME IS NULL:2012/03/15(木) 21:01:02.32 ID:???
>>265
SET NAMES cp932;
を試してみて、ダメならWindowsを窓から投げ捨てる
267NAME IS NULL:2012/03/15(木) 22:04:51.81 ID:H1D1gssR
ダメどころか普通に日本語insertすると
incorrect string valueと出るようになった
268NAME IS NULL:2012/03/15(木) 22:13:41.46 ID:???
>>267
ALTER TABLE LIST CHARSET utf8;
SET NAMES cp932;
と打ってからやるとどんな感じ?
269NAME IS NULL:2012/03/15(木) 22:42:38.41 ID:H1D1gssR
ダメでした同じ結果が出ますね

さっきグーグル先生の言うとおりUTF8に設定して
文字化け対策というのも試してみたけど
日本語含んでいると
同じようにincorrect string valueが返ってきます

なぜかlatin1じゃないと日本語が使えないみたいです
270NAME IS NULL:2012/03/16(金) 09:26:59.80 ID:???
>>269
もしかしてバージョンが古い?
いまどきのバージョンはlatin1にはどう頑張っても
日本語は入らないはず。
271NAME IS NULL:2012/03/16(金) 12:49:14.93 ID:???
MySQL5.5
idはオートインクリメントです
id10とid11の間に新しいカラムを入れて、idをずらすにはどういうSQLを書くといいでしょうか?

id 10のカラム みかん
id 11のカラム りんご

id 10のカラム みかん
id 12のカラム 新しく挿入した箇所
id 12のカラム りんご
272271:2012/03/16(金) 12:54:51.13 ID:???
すみません質問取り消します
SQLスレに移動します
273NAME IS NULL:2012/03/20(火) 19:15:17.32 ID:IKrf959C
CREATE TABLE unko ( a INT, b INT, c INT );
と作ったテーブルを、ALTER TABLEかなんかで
a,b,c の順から b,a,c の順に変更したいんだけど
かっこういい方法ある?
274NAME IS NULL:2012/03/20(火) 19:40:24.64 ID:???
>>273
ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification ...]

alter_specification:
...
| MODIFY [COLUMN] create_definition [FIRST | AFTER column_name]
275NAME IS NULL:2012/03/21(水) 12:27:05.48 ID:???
常に上から2行目にデータを挿入する方法を教えて先生
276NAME IS NULL:2012/03/21(水) 14:53:43.56 ID:???
>>275
ない
277NAME IS NULL:2012/03/21(水) 15:07:56.14 ID:PLbwqVKz
テーブル名を英語で直訳すると長くなる場合どうしてます?

土建屋の一括見積サイト作ることになったのですが。
「土建屋」を英語で直すと「contractor」になり、少し長く感じます。
「company」だと会社概要と混同しそうだし・・。
278NAME IS NULL:2012/03/21(水) 17:39:20.76 ID:???
>>277
doken

いや、マジで。
279NAME IS NULL:2012/03/21(水) 17:40:32.50 ID:PLbwqVKz
なるほど。ローマ字にするんですね。
その方が見た感じ分かりやすいし、そうします。ありがとうございました。
280NAME IS NULL:2012/03/21(水) 20:05:42.42 ID:Ny2BPNOP
主キーと外部キーの違いがよくわかりません。ご教授お願いします。
281NAME IS NULL:2012/03/21(水) 20:10:33.27 ID:???
>>280
主キー:いわゆるキー
外部キー:他のテーブルのキーの値のどれかが入る。なくてもいい
282NAME IS NULL:2012/03/21(水) 20:23:08.71 ID:???
>>281
それは、どういうことでしょうか?
例えば?
283NAME IS NULL:2012/03/21(水) 20:25:18.86 ID:???
>>282
マルチする暇があったら検索くらいしろよ
いい例が1個めにでてくるぞ
284NAME IS NULL:2012/03/21(水) 20:31:36.96 ID:???
>>283
何と検索したらいいでしょう?
285NAME IS NULL:2012/03/21(水) 21:47:36.10 ID:???
>>284
MySQLと関係ないからスレ違い。
あとマルチしすぎ。
286NAME IS NULL:2012/03/22(木) 12:42:31.67 ID:1AR4SqpK
>>277
俺は、もともとが英語でないカラム名は、
そのまま日本語をヘボン式ローマ字で書くことにしてる

いちいち、翻訳を調べたり考えたりする時間が無駄すぎる。

文字化けだの、文字コードだの、翻訳だの、文字の再利用性だの
全角文字文化というものは、プログラムの生産性を2〜3割ぐらい
落としてるんじゃないかと思うほど、ハンデ。

半角文化がうらやましい。
287NAME IS NULL:2012/03/22(木) 21:29:53.28 ID:WaeM069C
>>286
英語に疎いもので「ヘボン式」というのがわかりませんでした。
シャも今までsyaと書いてました。shaがヘボン式であり、一般的なんですね。

今後は英語で長くなる場合、わかりづらい場合は
ヘボン式ローマ字を使うようにします。すごく参考になりました。ありがとうございます。
288NAME IS NULL:2012/03/24(土) 02:06:25.34 ID:???
mysqlのバックアップって、みなさんはどうやってやってますか?

今、以下の2つの方法のどちらを採用するか迷っています。
1.mysqldumpで、毎日指定時間にバックアップする。
2.tarコマンドで、データディレクトリをバックアップする。

よろしくご教授お願いします。
289NAME IS NULL:2012/03/24(土) 07:47:32.05 ID:???
>>288
いったんmysqldをshutdownできるなら2、できないなら1。
mysqldを動かしたままtarでバックアップは取れないよ
290NAME IS NULL:2012/03/24(土) 19:20:13.79 ID:???
temporary tableに関してですが
create temporary table tmp select * from hoge;

として作ったtmpを次に
select * from tmp as a1, tmp as a2
として、比較用に同じtmpを使ったSQLを作りたいのですが
Can't reopen table: 'a1' となってしまいます。

このような使い方はできないんでしょうか
291NAME IS NULL:2012/03/24(土) 19:51:16.67 ID:???
>>290
できない。残念ながら仕様。

C.5.7.2. TEMPORARY Table Problems
http://dev.mysql.com/doc/refman/5.5/en/temporary-table-problems.html

You cannot refer to a TEMPORARY table more than once in the same query.
For example, the following does not work:
mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'
292NAME IS NULL:2012/03/24(土) 21:13:21.98 ID:???
>>291
ありがとうございます。
無理だったんですね、、

もう一つ質問です。
MySQLで
id, A, B, C というカラムがあるテーブルで、
1, 1, 5, 7
2, 0, 3, 4
3, 0, 0, 1

という感じでデータが入っていて、 id=1のA,B,Cのいずれかが入っているidを見つけたいのですが
(この場合は 3が該当する)
どのようなクエリを書けばいいでしょうか
293NAME IS NULL:2012/03/24(土) 22:12:12.46 ID:???
(前略) WHERE A = 1 OR B = 1 OR C = 1

とちゃうの?
294>>288:2012/03/25(日) 00:09:16.14 ID:???
>>289
ありがとうございます。
295NAME IS NULL:2012/03/25(日) 00:11:34.98 ID:???
質問です。

mysqldump -Aで取得したバックアップファイルは複数のデータベースが入っていますが、
そのうち、一つのデータベースのみを利用したい場合、
vimで関係ないデータベースを削除するしかないんでしょうか?


296NAME IS NULL:2012/03/25(日) 00:47:34.94 ID:???
mysqldumpのmanをよく読んでみるといい
297NAME IS NULL:2012/03/25(日) 13:50:31.84 ID:???
xamppを使っていて、mysqlで2バイト文字を使うと文字化けしてしまうので、色々調べてみたのですが、
default-character-set=utf8 を追加すると下記のようなエラーが出てしまい起動できずにいます。
120325 13:08:57 [ERROR] c:\xampp\mysql\bin\mysqld.exe: unknown variable 'default-character-set=utf8'
120325 13:08:57 [ERROR] Aborting

コメントアウトして、character-set-server=utf8を追加しても文字コードがlatin1になってしまっていて、文字化けしてしまいます。どうすればいいのでしょうか・・・。
298297:2012/03/25(日) 13:55:46.18 ID:jZQ0Ce8P
すみません、sageたままでした
299NAME IS NULL:2012/03/25(日) 20:23:30.29 ID:???
>>297
一度化けたデータはもう戻らないので、
character-set-serverを設定したあと
データベース、テーブルを作り直してデータを入れなおす。
300297:2012/03/25(日) 20:57:29.40 ID:0c4g4u0j
>>299
ありがとうございます。やってみます。
301NAME IS NULL:2012/03/25(日) 21:02:50.39 ID:???
PHP側も接続後に
$conn->set_charset("utf8");
するのを忘れずに。
302297:2012/03/25(日) 21:15:08.72 ID:0c4g4u0j
わーーーーーできました!!!!みなさんありがとうございました!!!!!!!!!!
303NAME IS NULL:2012/03/25(日) 21:42:21.17 ID:???
よかったね
304>>295:2012/03/27(火) 00:21:52.21 ID:???
>>296
ありがとうございます。
mysqldump --databasesでデータベースを指定できるのは知っているのですが、
mysqldump -Aで取得したバックアップファイルから、特定のデータベース一つを取り出す方法が知りたいのですが、
やはり、この場合は、vimで、いらないデータベースを削除するしか、方法がないのでしょうか?
305NAME IS NULL:2012/03/28(水) 23:25:58.20 ID:???
MySQLのロックについて教えてください

環境:5.0.87 (tritonnですが、tritonnに起因する問題ではないです)

2つのInnoDBストレージのテーブルからMyISAMテーブルへINSERTするクエリを発行すると
元のInnoDBテーブルにロックが発生するときがあります。

クエリはこんな感じ
-----
INSERT INTO myisam_table ( field1 , field2)
SELECT i1.A, FN(i2.B)
FROM innodb_table1 i1
INNER JOIN innodb2_table i2 ON i1.id=i2.id
-----
FNはテキストを変更するストアドファンクションです
myisam_tableはインデックス等の設定はありません(のでtritonnの問題ではないです)
innodb_table1,innodb_table2は1対1でパーティションを分けただけです(id列はキー列)

上記のSQLを実行中に、innodb_table1へのINSERTがロック解除待ちになるときがあります。
ダーティーリードOK、ファントムリード大歓迎という一貫性無関係なクエリなので、分離レベルを
READ UNCOMMITTEDにしてもinnodb_table1へのINSERTクエリがロック解除待ちになりました。

FNがちょっと時間のかかる処理なので、10万レコードを処理すると2時間ぐらいかかります。
それでロックが発生していることが分かったのですが、READ UNCOMMITTEDにしているのに
ロックが発生していることがどうしても理解できなく、対策も思いつきません
#そもそも書き込み先はMyISAMなのに何でロックが?という疑問も…

一貫性保持のロックはまだ分かるのですがですが、READ UNCOMMITTEDで一貫性を放棄したのに
それでもロックが発生する理由が分かりません…
306NAME IS NULL:2012/03/29(木) 00:25:10.26 ID:???
>>305
トランザクション分離レベルに関わらず、「更新」は「更新」をブロックする。
そのINSERT … SELECT文は一見「参照」に見えるけど
内部的には「更新」扱いされるんじゃないかなあ。
307306:2012/03/29(木) 00:31:38.87 ID:???
補足だけどMySQL 5.5を検証環境に入れて、処理中に
information_schema.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS
あたりを見ると分かるはず。
308306:2012/03/29(木) 00:35:29.87 ID:???
マニュアルに書いてあったよ。
http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locks-set.html

INSERT INTO T SELECT ... FROM S WHERE ... は〜
あたりから。
309NAME IS NULL:2012/03/29(木) 00:44:14.36 ID:???
>>304
mysqldumpじゃなくてmysqlコマンドの方に
--one-databaseっていうそれっぽいオプションがあるよ。
310305:2012/03/30(金) 00:05:17.86 ID:???
>306-308
有難う。
指摘された箇所読み直して、ようやく理解した。(ような気がする)

myisam_tableへのINSERTは一貫性関係ないからREAD UNCOMMITTEDと考えてたけど、
innodb_table1/2にはREAD COMMITTED以外だとロックがかかるのね…
質問したinnodb_table1 へのINSERTのロック待ちが起きているクエリのトランザクションの
レベルはデフォルトのRPEATABLE READ。ロック待ちになっても仕方ないですね

「それ以外の場合、InnoDB は S から取得した行に共有ネクストキーロックを設定します」の
「それ=READ CMMITTED」以外というのはREAD UNCOMMITTEDも含むんだろうなぁ
311NAME IS NULL:2012/03/30(金) 08:06:51.45 ID:oR+inl8b
mysql で
新規挿入時のユニークIDの生成 が 1..2...3 と順番ではなく
14932 34643 96949 と ある桁数、又は範囲のなかで
ランダムに生成出来る方法ってないでしょうか
312NAME IS NULL:2012/03/30(金) 09:29:17.25 ID:???
>>311
INSERT INTO user (id) VALUES (FLOOR(RAND() * 100));
して、重複してたらやり直す。

やり直すのが面倒なら、「未割り当てID一覧テーブル」
っていうのを作ればいいんじゃないかな。

SELECT id FROM unassigned ORDER BY RAND() LIMIT 1;
DELETE FROM unassigned WHERE id = ?;
INSERT INTO user (id) VALUES (?);
COMMIT;
313NAME IS NULL:2012/03/31(土) 17:03:47.81 ID:ocTAzuV3
レプリケーションというのを最近知ったのですが
メインのDB(更新用)とスレーブのDB(参照用)があって、
webアプリでDB接続を指定するときは「参照用IPアドレスで接続」「更新用IPアドレスで接続」のように
きっちり分けないとダメなんでしょうか?
更新系クエリ/参照系クエリで自動的にDBを切り替えるなんて事は無理ですか?
314NAME IS NULL:2012/03/31(土) 18:26:58.95 ID:???
>>313
分けないとだめ
みんな自社用フレームワーク作ったりしてるんだと思う
315NAME IS NULL:2012/03/31(土) 19:21:34.22 ID:ocTAzuV3
>>314
レスありがとうございます
という事は、レプリケーションした場合、参照系と更新系を混ぜたトランザクションなんてことは
無理で、トランザクション時のみ更新系DB(マスター)だけを対象に接続することになるんですか?
316NAME IS NULL:2012/03/31(土) 19:33:50.67 ID:???
>>315
YES。
自分でシステムの要件を決められるWeb企業だからできる設計であって、
顧客が要件を決める受託システム開発で採用するのは難しいと思うよ。
317NAME IS NULL:2012/03/31(土) 20:27:14.61 ID:???
>>316
ありがとうございます、勉強になりました
318NAME IS NULL:2012/04/01(日) 00:41:57.29 ID:???
レプリケーションのDBを構築するならば、
MySQL Cluster で構築した方が可用性にも性能にも優れていると思うんだけど、
この認識って合ってますかね?

MySQL Clusterよりもレプリケーションの方が優れている点があれば、教えてください。
319NAME IS NULL:2012/04/01(日) 01:02:28.54 ID:???
320NAME IS NULL:2012/04/02(月) 09:57:12.31 ID:NjGfIFoN
AさんとBさんが、全く同じレコードを同時に更新したばあい
どちらかのデータが消えてしまうことになるとおもうのですが、
これを防ぐのにどういう方法が考えられますか?
321NAME IS NULL:2012/04/02(月) 11:50:05.19 ID:???
>>320
「ロストアップデート」でぐぐるといいよ
322NAME IS NULL:2012/04/02(月) 18:48:31.43 ID:???
MySQLDumpで出力する時にwhere なりなんなりで条件で絞ることって出来ましたっけ?
323NAME IS NULL:2012/04/02(月) 20:17:41.87 ID:???
そういうことしたいときは、SELECT 〜 INTO OUTFILE じゃなかろか。
324305:2012/04/02(月) 22:03:31.14 ID:???
ようやくネクストキーロックを理解しました
言葉では知ってたんだけど、実際に影響を受けたことがなくて、実感がなかった。

ところで、自分以外のスレッドの実行中クエリの分離レベルって、分かるのでしょうか。
SHOW PROCESSLISTで実行中のクエリは確認できるけど、そのクエリがどの分離レベルなのか、ってことです。

自分:SELECT @@tx_isolation;
グローバル設定:SELECT @@global.tx_isolation;
で調べることはできるけど、これでは他のスレッドは分からないです。
#変更していなければGLOBALという予測は出来ますが…
SHOW INNODB STATUSでも分離レベルは表示されないですよね?
325NAME IS NULL:2012/04/03(火) 00:25:19.43 ID:???
>>324
MySQL 5.1+InnoDB Plugin、またはMySQL 5.5以上が必要。

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G
*************************** 1. row ***************************
trx_id: 3BCB01
trx_state: RUNNING
trx_started: 2012-04-03 00:22:46
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 3
trx_mysql_thread_id: 1
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 2
trx_lock_memory_bytes: 376
trx_rows_locked: 1
trx_rows_modified: 1
trx_concurrency_tickets: 0
trx_isolation_level: READ COMMITTED
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
1 row in set (0.00 sec)
326NAME IS NULL:2012/04/03(火) 00:27:05.95 ID:???
>>322
そのまんま--whereっていうオプションがある
327NAME IS NULL:2012/04/03(火) 08:05:06.57 ID:lbIOR0jo
>>323
そうかも、、、と思いつつ質問させて頂きました^^;

けど
>>326
ぐぐったら

一定の条件を満たすレコードのみdumpする
$ mysqldump -u ユーザ名 -p -t "--where=カラム名='文字列'" データベース名 テーブル名 > ファイル名

使いた方としてふさわしいかどうかはともかく出来るんですね。

ありがとうございました
328NAME IS NULL:2012/04/03(火) 10:00:58.31 ID:m9gZGzcZ
テーブルの中にフィールドがずらーっと登録されてますが
あれのデフォルト表示の順番って変えれるものなんですか?
329NAME IS NULL:2012/04/03(火) 11:22:54.78 ID:???
>>328
テーブル定義を変えればできるけど、一般的にはあまりやらない。
そもそも「SELECT *」をするなというのが定石。

mysql> SELECT * FROM t;
+------+--------+---------+
| i_id | i_name | i_price |
+------+--------+---------+
| 1 | sample | 100 |
+------+--------+---------+

mysql> ALTER TABLE t MODIFY i_name VARCHAR(100) AFTER i_price;
mysql> SELECT * FROM t;
+------+---------+--------+
| i_id | i_price | i_name |
+------+---------+--------+
| 1 | 100 | sample |
+------+---------+--------+

330NAME IS NULL:2012/04/03(火) 17:23:37.18 ID:7cc4mfVn
MySQLってDBファイルにある全てのテーブル同士で共有するkeyを指定できたりします?
331NAME IS NULL:2012/04/03(火) 17:27:24.72 ID:???
できます
332NAME IS NULL:2012/04/03(火) 18:09:49.63 ID:7cc4mfVn
おおおお!本当ですか!
MySQLに乗り換えてみます!
ちなみにそれは何とググったら出てきます?ちょっと色々と調べてみたいんで
333NAME IS NULL:2012/04/03(火) 19:47:57.55 ID:???
全てのテーブル同士で共有するkeyってなんだろう
334NAME IS NULL:2012/04/03(火) 19:53:55.03 ID:???
primary keyじゃない?
335324:2012/04/03(火) 22:18:27.41 ID:???
>325
ありがとうございます。5.0系だと手段はないんですね…
5.0のサポートが終わったのは分かっているのですが、
日本語全文検索の関係でtoritonnから離れられなくて…

後継?のぐるんがってどうなんでしょうか?
予算でがっつり削られたので、検証すら困難になってしまいました…
去年(ベータ版のころ)の検証時は性能不足で却下だったのですが、
リリースの度、機能と安定度は増したので期待しているのですが…
336NAME IS NULL:2012/04/03(火) 23:36:06.64 ID:???
【全文検索】groonga【senna後継】
http://kohada.2ch.net/test/read.cgi/php/1320128617/
337NAME IS NULL:2012/04/04(水) 20:18:58.97 ID:???
生徒の出席テーブルを作りたいのですが
生徒IDと日付をテーブルにして、一日1回レコードに追加したいです。
すでに存在していたら追加したくないのですが

create table hoge(
seito int(11),
hiduke datetime
);

みたいなテーブルで
INSERT IGNORE hoge (seito, hiduke) VALUES($seitoid, DATE_FORMAT(CURDATE(),'%Y-%m-%d'));
としたいのですが
seito とhidukeの両方が一致した場合はINSERTしないようにするには、どのようなテーブルにしたらよいでしょうか
338NAME IS NULL:2012/04/04(水) 20:33:52.94 ID:???
primary key(seito,hiduke)

とかw
339NAME IS NULL:2012/04/04(水) 20:37:06.28 ID:???
その場合
hidukeはdatetimeではなくdateね
340337:2012/04/05(木) 11:09:43.61 ID:???
両方ともprimary key にしておけば
両方に一致したときの挙動になるんですね
ありがとうございました。
341NAME IS NULL:2012/04/06(金) 19:30:54.35 ID:v6c3ekcx
mysql の index にするカラムは、
リレーションにするカラムをindexにしといたら
とりあえずえんちゃうみたいな感じですか?

342NAME IS NULL:2012/04/07(土) 17:13:27.88 ID:???
>>341
とりあえずはそれでいい
応用はあとで痛い目見てからでいい
343NAME IS NULL:2012/04/11(水) 16:24:42.41 ID:96JSVMn0
ローカルでWEB制作してるDBとリモートで運営してるDBとが
別々に独立してるため、ローカルで作成したDBやレコードを
リモートDBにインポートしています。

まっさらな状態のリモートDBに、インポートはできるのですが
すでに同じ名前のDB、テーブルが入ってるところに
上書きとしてインポートする方法はないですか?

インポートツールはphpmyadmin です。
344NAME IS NULL:2012/04/11(水) 16:36:23.19 ID:???
>>343
元からあるテーブルをDROPして、それからインポートすれば
うまく出来ると思います
345NAME IS NULL:2012/04/11(水) 16:51:57.73 ID:96JSVMn0
>>344
いや、ですからドロップ済みにして、まっさらな状態でインポートしたら
いけるんですが、それだとリモートにたまったデータが
全部消えてしまうでしょ?

フィールドを増やすなどテーブルをいじる時は、まずリモートからいじって
それからローカルに移す(ローカルならまだ全部消しても問題ない)
しかないですかね。
346NAME IS NULL:2012/04/11(水) 17:50:15.89 ID:???
insert on duplicate key updateとか replace into ではダメなんすか?
347NAME IS NULL:2012/04/12(木) 07:53:21.89 ID:9j8MO5uQ
すみません、どうかどうか、知恵をお貸しください。

macOSX、MySQL4.1.22、MT3.2.1、

データベースに接続しようとした所、間違えてパスワードを変更してしまい、
直ぐに変更しなおしたものの、phpmyadminログイン時に
「#2002 - サーバが応答しません (あるいはローカルの MySQL サーバのソケットが正しく設定されていません)」
と言うエラーが出るようになってしまいました。
接続してあったMTのログイン画面にアクセスすると
「Got an error: データベース接続の設定に誤りがあります: エラーが発生しました: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)」
と言う表示が出ます。
ソケット(mysql.sock)が確認できないのでソケット関連の問題だとは思うのですが、
MySQL(phpmyadmin)を再起動しても、パスを設定してみても
ずっと同じエラーが出ています。
一体どうしたら良いのでしょうか?

初心者丸出しの質問ですみません、どうか宜しくお願い致します。
348NAME IS NULL:2012/04/12(木) 10:29:10.69 ID:???
>>347
mysqlは起動してます?
349NAME IS NULL:2012/04/12(木) 10:42:43.08 ID:???
>>347
MAMP ?
リモート ?
350NAME IS NULL:2012/04/12(木) 10:49:52.51 ID:9j8MO5uQ
>>348
ありがとうございます。恐らく起動しています。
サーバーに付いてたphpMyAdminは相変わらず「#2002 - サーバが応答しません〜」と言うエラーで入れませんが、
php.iniやrc.confを触りながらターミナルから入ってみたら、「Welcome」と言われたので、どうやらmySQL自体は
今は動いている?ようです。(違っていたらすみません)
MTログイン画面の「Got an error: データベース接続の〜」と言うエラーも解消されログインできようになりました。
ソケット自体は確認できませんが、ターミナルでパスを調べたUNIX socket「/tmp/mysql.sock」を入れています。
ただ、phpMyAdminの「#2002〜ソケットが正しく設定されていません)」のエラーは相変わらずです…。
351NAME IS NULL:2012/04/12(木) 10:51:34.13 ID:9j8MO5uQ
>>349
ありがとうございます。
VPSのウェブサーバーです。と言う回答で大丈夫でしょうか…。
352NAME IS NULL:2012/04/12(木) 14:50:04.40 ID:DR3AaSQz
不動産系ポータルサイトをつくろうと思います。
賃貸と売買があります。
7割くらい両方共通するような似たようなフィールド項目が並びますが、
賃貸と売買では名称が違ったり、賃貸だけにしか無いフィールド
売買にしかないフィールドがあったり微妙に違います。

賃貸と売買のテーブルは別々にしたほうがよいですか?
353NAME IS NULL:2012/04/12(木) 17:17:21.27 ID:???
おれなら2つのテーブルに分ける
3つには分けない
354NAME IS NULL:2012/04/12(木) 17:19:34.76 ID:???
同じ意味の要素は同じ名前にした上で、テーブルをふたつにわける
リレーショナルな設計はしない
355NAME IS NULL:2012/04/12(木) 18:33:46.84 ID:DR3AaSQz
回答有難うございます。
分けることにしました。
ただ、都道府県テーブルとか、駅名テーブルとかにリレーションさせる場合は
別に、よっぽど、賃貸と売買の取り扱いが違わない限り
同じ物を参照しても問題ないですよね?

356NAME IS NULL:2012/04/12(木) 20:34:27.51 ID:???
そういうのは分けていいんじゃね?

「ちょっと似てるけどあとで意味変わるかも」
みたいなのをまとめて正規化すると
あとでろくな目にあわないからな
357NAME IS NULL:2012/04/13(金) 12:40:50.71 ID:iVfEgpfV
MySQL5.1について質問があります。

DBサーバA(192.168.0.10)
---
・テーブルA
---

DBサーバB(192.168.0.20)
---
・テーブルA
・テーブルB
---

DBサーバC(192.168.0.30)
---
・テーブルA
・テーブルC
---

このような構成のサーバがあったとします。
目的は、フィールド構成が同一のテーブルAを、
DBサーバBとDBサーバCで共有したいということです。

DBサーバAを共通で使うサーバとして、
これを起点にBとCのテーブルAを常に同一の状態にしておくことは可能でしょうか。

それとも、DBサーバAは不要なのでしょうか。
なにかよいアイディアがありましたら、ご教授ください。m(_ _)m
358NAME IS NULL:2012/04/13(金) 13:08:26.45 ID:???
>>352
設計スレのがいんじゃね?
http://toro.2ch.net/test/read.cgi/db/1331558806/
359NAME IS NULL:2012/04/13(金) 18:00:20.01 ID:???
>>357
可能だよ
レプリケーション
夜の駐車場で
360NAME IS NULL:2012/04/14(土) 18:58:10.73 ID:???
質問です。

顧客テーブル
- 顧客id
- (その他、名前、誕生日など)

電話番号テーブル
- 主キー
- 顧客id (外部キー)
- 電話番号
- (その他、備考など)

メールアドレステーブル
- 主キー
- 顧客id (外部キー)
- メールアドレス
- (その他、備考など)

上のような3つのテーブルがあるとします。

GUI上で特定の顧客情報を表示した際に、電話番号とメールアドレスが複数個表示出来るわけですが、
「この電話・メールを同一リストにごちゃまぜで表示し、さらにその順序も制御させたい」
のです。これは、連絡を取る際の優先順位みたいなものです。

こういう機能を考慮すると、

* 案1

以下のような、顧客と電話・メールとの中間に入るテーブルをつくり、
(詳細は省略)

連絡先テーブル (新規)
- 連絡先id (主キー)
- 顧客id (外部キー)
- 順番 (顧客idが同じレコードは、このフィールドを重複しないようにする)

電話番号テーブル
- 連絡先id (外部キー)

メールアドレステーブル
- 連絡先id (外部キー)

* 案2

電話番号テーブルとメールアドレステーブルそれぞれに順番のフィールドを追加し、重複に注意する

上の2つの案を思いつきました。

案1は、より正規化された形だと思うが、実装とかが面倒
案2は、正規化されておらず気持ち悪いが、案1よりは実装が楽?

こういう場合、案1と案2のどちらかがいいか、みなさんの考えを教えてください。
また、ほかの実装例などがあれば、ぜひとも教えてください。

どうぞよろしくお願いします。
361360:2012/04/14(土) 18:59:04.31 ID:8VcWjWCG
すいません、sageてしまいました。
362NAME IS NULL:2012/04/14(土) 20:12:19.28 ID:???
>>360
案1ってそこから連絡先を引っ張るSQLが思いつかない。
idだけ見て電話なのかメールなのかが分からない。

案2はお作法とは違うかもだけどそんなに問題ない気がするなあ。
SELECT id, 電話番号, NULL, ... , 表示順 FROM 電話
UNION ALL
SELECT id, NULL, メールアドレス, ... , 表示順 FROM メール
ORDER BY 表示順;
363NAME IS NULL:2012/04/14(土) 20:42:39.34 ID:???
>>360
なんで案2が「正規化されてない」と思ったんだ?
重複に注意する、ってのがちょっと意味がわからんが。
364NAME IS NULL:2012/04/14(土) 21:30:29.65 ID:???
今気付いたが、設計スレ落ちてんだな。即死と言うには長い気もするが。
365NAME IS NULL:2012/04/14(土) 21:33:20.25 ID:8VcWjWCG
>>362
ありがとうございます。

idだけ見ても電話なのかメールなのかが分からない、というのは、確かにその通りですね。
案1にて、一応顧客id指定で、全メアドと電話番号を一緒くたに表示できることだけ、確認しました。
表示順云々はよくわからないのですが。

SELECT [顧客テーブル].顧客id, [電話番号テーブル].電話番号 AS 電話かメール
FROM (顧客テーブル INNER JOIN 連絡先テーブル ON [顧客テーブル].顧客id=[連絡先テーブル].顧客id) INNER JOIN 電話番号テーブル ON [連絡先テーブル].連絡先id=[電話番号テーブル].連絡先id
WHERE ((([顧客テーブル].顧客id)= xxx ));

UNION

SELECT [顧客テーブル].顧客id, [メールアドレステーブル].メールアドレス AS 電話かメール
FROM (顧客テーブル INNER JOIN 連絡先テーブル ON [顧客テーブル].顧客id=[連絡先テーブル].顧客id) INNER JOIN メールアドレステーブル ON [連絡先テーブル].連絡先id=[メールアドレステーブル].連絡先id
WHERE ((([顧客テーブル].顧客id)= xxx ));

また、お作法ってのが気になるのですが、教えていただけるとありがたいです。



>>363
失礼しました。
冗長性をなくす、という意味で正規化、と言ってしまいましたが、これ正規化じゃないですね。

重複に注意するってのは、電話番号とメアドの2つのテーブルで、同一の顧客idなものは、順番の数値が重複しちゃダメって
いう意味でした。

しかし、よく考えたら、この2つのテーブルで、外部キーである、同じ連絡先idを参照しちゃダメっていうのもありました。




冗長性を考えていたら、逆に冗長性はあるけど、実装が楽かもしれない方法を思いついたので、のせておきます。

* 案3
- 電話番号テーブルとメールアドレステーブルは削除
- 新たに連絡先テーブルを作成
- フィールドは、「連絡先フィールド」の1つにいっしょくたに書く、または、「電話番号フィールド」と「メールアドレスフィールド」の2つを作り、どちらかだけ使う

(出来れば、電話番号テーブルと、メールアドレステーブルに複数個のフィールドを作るかもしれないため、この方法は避けるべきなのかもしれません)

よろしくお願いします。
366360, 361, 365:2012/04/14(土) 21:52:11.92 ID:???
いろいろググっていたのですが、自分が詰まっていることが、
オブジェクト指向とSQLとの親和性、についてであることが分かりました。
この辺の議論はすでにあるようですね。

ここら辺を切り口に、いろいろ調べてみたいと思います。

ひとまず質問を取り下げます。

失礼しました。
367NAME IS NULL:2012/04/15(日) 12:33:26.90 ID:???
案1がいい
368NAME IS NULL:2012/04/16(月) 12:05:52.33 ID:Vxx0CCgx
http://www.hideblog.net/nikkis/show/158/
を参考に さくらインターネットサーバーでmysqlを自動バックアップするよう
CRONで設定しました。

定期的に、mysql.120416.gz というようなファイルが生成されますが、
サイズが 1kb しかありません。
これは、バックアップに失敗してると思っていいのでしょうか。
369NAME IS NULL:2012/04/16(月) 19:36:10.13 ID:???
そのファイルの中身見てみりゃいいじゃん。
370NAME IS NULL:2012/04/16(月) 23:09:12.73 ID:???


whereサブクエリanyselectがおもいんだけどなんとかなんない?
CGIで入れ子ループしたほうが劇的に速いてのが納得いかんよ
371NAME IS NULL:2012/04/16(月) 23:24:30.81 ID:???
たぶんなんない
372NAME IS NULL:2012/04/16(月) 23:33:20.30 ID:???
この辺は?

なぜMySQLのサブクエリは遅いのか。
http://nippondanji.blogspot.jp/2009/03/mysql_25.html
373NAME IS NULL:2012/04/17(火) 09:42:36.43 ID:???
>>370
SQL晒せるなら書き換え案を考えてみる
374NAME IS NULL:2012/04/17(火) 10:14:49.30 ID:YLn+46Gs
>>370
any とか in とかは、数が多くなると重いよね。
もしかしたら、
世田谷区(30件) 、足立区(22件) 
みたいなカウント処理を考えてる?
375NAME IS NULL:2012/04/17(火) 11:51:18.78 ID:z+5HaJWD

>>373
>>374

いまPerlでこんな処理をしています
table_aには10万行程度
table_bには40万行程度

$bbsd2 = $dbh -> prepare("SELECT R_no from table_a where T_no = '$linkno' order by R_no");
$bbsd2 -> execute;
while( @res2 = $bbsd2 -> fetchrow ) {

$bbsd = $dbh -> prepare("SELECT * FROM table_b where No='$res2[0]'");
$bbsd -> execute;
while( @res = $bbsd -> fetchrow ) {


処理


}
$bbsd -> finish;
}
$bbsd2 -> finish;
}


Perl上でループselectを使わないようサブクエリを使って処理にすれば早くなるかなと思ったのだけど逆にめちゃくちゃ重くなってしまったんですよね
SELECT * FROM table_b where No=ANY(select R_no from table_a where T_no='$linkno')

376NAME IS NULL:2012/04/17(火) 12:41:44.54 ID:???
>>375
これで試してみて。
SELECT b.*
FROM table_b b INNER JOIN
(SELECT DISTINCT R_no FROM table_a WHERE T_NO = $linkno) a
ON b.No = a.R_no
ORDER BY b.No
377NAME IS NULL:2012/04/17(火) 13:04:15.24 ID:???
>>376
天才現る…!
ビックリするくらい早くなりました!ありがとうございます。
INNER JOIN DISTINCTあたりが勉強不足ですので勉強したいと思います。
もしよければ簡単に説明していただいてもいいですか?
378NAME IS NULL:2012/04/17(火) 13:23:44.06 ID:???
自分なりにググリながら解釈してみました

SELECT * FROM table_b where No=ANY(select R_no from table_a where T_no='$linkno')
の場合はサブクエリの検索結果をもとにさらにtable_bの全検索

>>376
あらかじめTnoと$lingnoが同一のものを結合してダブりを除去してソート

こんな考え方もあるのか・・・解釈があってるのかアレですがwwwwwww
379NAME IS NULL:2012/04/17(火) 13:52:50.01 ID:???
>>378
それで合ってるよ。

ちなみに現在開発中のMySQL 5.6で最初のANYをつけたクエリでも速くなる
(ANYの中身を最初に評価するMaterialization最適化という機能が入る)ので、
まあバッドノウハウだね。5.6出たら忘れておk
380NAME IS NULL:2012/04/17(火) 14:02:13.82 ID:???
>>378
ごめん合ってなかった。

× サブクエリの検索結果をもとにさらにtable_bの全検索
○ table_bから1件もってくるごとにtable_aを全件検索
381NAME IS NULL:2012/04/17(火) 14:54:28.06 ID:???
わかりやすい説明ありがとうございます!
382NAME IS NULL:2012/04/18(水) 22:48:52.43 ID:v4Lo1reV
PRIMARY KEYがユニークかどうかの処理ってMySQLに任せていいんですよね?
事前にチェックする必要はないですよね?
383NAME IS NULL:2012/04/18(水) 23:05:09.04 ID:???
>>382
MySQLに任せておけばすべて問題ありません
384NAME IS NULL:2012/04/18(水) 23:35:10.73 ID:???
>>383
ありがとうこざいます!
385NAME IS NULL:2012/04/19(木) 13:55:11.57 ID:???
【質問】
Win7のPCに、Windows版のMySQL5.5をインストールしています。
古いVerのMyODBCを利用しています。
MySQL5.5側で、old_passwordの設定を行い、古いVerのMyODBCで用意した該当DB用のDNSの接続は確認できています。

(1)
Access2000で、MySQL5.5の該当DBの任意のテーブルをインポートorリンクしようとした際、
古いVerのMyODBCを利用すると「ODBC--呼び出しが失敗しました」とエラーが表示され
インポートorリンクが出来ません。

※Access2000から、同様のverのMyODBCを利用して、Mysql3.*の他のDBの任意のテーブルを
 インポートorリンクすることは成功しています。

接続に失敗しているのだとは思うのですが、Access2000で、
(1)のインポートorリンクを成功させるための方法はありますでしょうか?


「環境」
OS:Windows7 32bit
MySQL5.5 (Windows版)
MyODBC 3.51.04
Access2000

お手数をお掛けしますが、よろしくお願いします。
386385:2012/04/19(木) 13:56:08.00 ID:Ib029TrQ
すみません
age

【質問】
Win7のPCに、Windows版のMySQL5.5をインストールしています。
古いVerのMyODBCを利用しています。
MySQL5.5側で、old_passwordの設定を行い、古いVerのMyODBCで用意した該当DB用のDNSの接続は確認できています。

(1)
Access2000で、MySQL5.5の該当DBの任意のテーブルをインポートorリンクしようとした際、
古いVerのMyODBCを利用すると「ODBC--呼び出しが失敗しました」とエラーが表示され
インポートorリンクが出来ません。

※Access2000から、同様のverのMyODBCを利用して、Mysql3.*の他のDBの任意のテーブルを
 インポートorリンクすることは成功しています。

接続に失敗しているのだとは思うのですが、Access2000で、
(1)のインポートorリンクを成功させるための方法はありますでしょうか?


「環境」
OS:Windows7 32bit
MySQL5.5 (Windows版)
MyODBC 3.51.04
Access2000

お手数をお掛けしますが、よろしくお願いします。
387385:2012/04/19(木) 14:04:29.83 ID:Ib029TrQ
・・・

○DSN
×DNS

orz
388NAME IS NULL:2012/04/19(木) 18:32:58.62 ID:???
MySQL 5.0.95 で
slow queryを調べようと
/etc/my.confに
[mysqld]
log-slow-queries=/hoge/myslow.log
long-query-time=1
log-queries-not-using-indexes
log-slow-admin-statements

を追記してmysqlを再起動したところ、ログがたくさん出力され
# Query_time: 0 Lock_time: 0 Rows_sent: 1 Rows_examined: 126
このように Query_time: 0 まで出力されています。

long-query-time=2
にすると
SELECT sleep(3);
とかにしても出力されません。

variablesを見ると

mysql> show variables like 'long%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 1 |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> show variables like 'log%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log | OFF |
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| log_error | |
| log_queries_not_using_indexes | ON |
| log_slave_updates | OFF |
| log_slow_queries | ON |
| log_warnings | 1 |
+---------------------------------+-------+
こうなっているのですが、なぜ0秒のコマンドまで出力されているのでしょうか
389NAME IS NULL:2012/04/20(金) 00:57:06.77 ID:???
>>388
log-queries-not-using-indexes は、
インデックスを使っていないクエリをたとえ0秒でも出すオプションだから。
390388:2012/04/20(金) 07:35:11.33 ID:???
>>389
出力されていたのはインデックスを使っていたクエリだと思うのです。

同じ条件で
long-query-time=2
に変更しただけで 何も出力されなくなるので
no-indexのクエリではないと思います。
391NAME IS NULL:2012/04/20(金) 12:27:55.54 ID:???
>>390
うーん分からん。

# Query_time: 0 Lock_time: 0 Rows_sent: 1 Rows_examined: 126
126行スキャンして1行しか出さないクエリと言っているので
これについてはフルスキャンしてるんじゃないかなあ。

その後出なくなったのは、例えばクエリキャッシュが効いていたとか
別の理由じゃないかなあ。
392385:2012/04/21(土) 14:41:12.84 ID:1uIjPpQr
ODBCの設定で、トレースをしてみました
ACCESS2000で、MySQL5.5(Win7)のテーブルをインポートorリンクした場合
テーブル名に「_」(アンダーバー)が入力されていると、
ワイルドカード?として認識されるため、「\_」と変換されるみたいです。

例)
DIAG [S1000] [MySQL][ODBC 3.51 Driver][mysqld-5.5.22]Table 'testtest_db.seq\_mst' doesn't exist (1146)

MySQL3.*のテーブルでは、「_」(アンダーバー)は、SQL文を作成する際、
そのまま使われていました。

ODBC 3.51 Driver
MySQL 5.5

Access2000から上記の環境のODBCを利用して、MySQL5.5のDB内のアンダーバー付テーブルをインポートorリンクするには、どのような手段がありますでしょうか?
393NAME IS NULL:2012/04/21(土) 16:55:10.15 ID:29j42DcK
394385:2012/04/21(土) 17:52:16.75 ID:1uIjPpQr
>>393
ありがとうございます

Windows版のMySQLサーバ(5.5)をインストールしている環境は
Windows7 32bit版で、64ビット問題とは違うようです。

・該当DSNを使用したODBC接続は成功しています
・プログラム(VB6で作成)から、該当のDSNを使用してODBC接続を行い
 名前にアンダーバー(スコア)の入ったテーブルの参照も確認出来ています。
 
「ODBC--呼び出しが失敗しました」というエラーが発生するタイミングは
今現在で把握しているのは、
Access2000からMySQL5.5のDB接続用のMySQL ODBC 3.51ドライバで作成したDSNを使い
テーブルのリンクorインポートを行う際、
テーブル名にアンダーバー(スコア)の入ったテーブルのみです。
アンダーバー(スコア)が入っていないテーブルはインポートもリンクも可能です。

また、Access2003でも試しましたが、同様のエラーが発生しました。
それよりも新しいVerのAccessはないため試していません。

Access2000の設定、もしくは、MySQL ODBC 3.51 Driverの設定、もしくはその他の方法で、
上記のエラーを避ける手段を探しています。


※トレースで出力したログのエラー箇所
MSACCESS 9cc-960 EXIT SQLColumnsW with return code -1 (SQL_ERROR)
HSTMT 088E18D0
WCHAR * 0x00000000 [ -3] <empty string>
SWORD -3
WCHAR * 0x00000000 [ -3] <empty string>
SWORD -3
WCHAR * 0x00128C9C [ -3] "seq\_mst\ 0"
SWORD -3
WCHAR * 0x00000000 [ -3] <empty string>
SWORD -3

DIAG [S1000] [MySQL][ODBC 3.51 Driver][mysqld-5.5.22]Table 'testtest_db.seq\_mst' doesn't exist (1146)
395NAME IS NULL:2012/04/21(土) 18:36:09.33 ID:GHSqy5Mv
多分 答えにならないと思うが
ODBC5.1でも同じだろうか?
396NAME IS NULL:2012/04/23(月) 07:33:36.11 ID:???
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 '"20120409003341", created="2012-04-09 00:33:45"' at line 1
これは何のエラーですか?
397385:2012/04/23(月) 09:22:00.30 ID:ppMwU/3N
>>395
レスありがとう御座います。

MySQLサーバ5.5 (Windows)
サーバインストールマシン:win7 32bit
クライアントマシン:win7 32bit
ODBC5.1
この環境で、Access2000からODBC接続でリンクを実行したところ、
テーブル名にアンダーバー(スコア)が入っていても成功しました。
もし、ODBC3.51ドライバから同様の作業が可能か分かりましたら、ご教授いただければと思います。

***
ちなみにで申し訳ないのですが
クライアントマシン:win2k sp4 から、ODBC5.1ドライバを使用することは可能でしょうか?
win2kの端末から実行するとシステムエラー127によりDB(MySQL5.5、MySQL3.23いずれも)への接続が出来ませんでした。
検索を念入りにしている訳ではなく横着をして申し訳ないのですが、
ODBC5.1は始めての使用でして、仕様として無理なのか設定次第で可能なのかが分かれば教えていただければと思います。


>>396
ついでの記述で申し訳ないですが、構文エラーだと思われます。
実行時のSQL文をデバック取得し、201204・・・の前くらいから、構文がおかしくないかチェックするのがよいと思います。
398385:2012/04/24(火) 14:30:31.90 ID:MOjnp39Z
>>394
>win2kの端末から実行するとシステムエラー127によりDB(MySQL5.5、MySQL3.23いずれも)への接続が出来ませんでした。

自己解決。
MyODBC5.1.10を使用したのですが、5.1.8より後のVerからWin2kで認識出来ない
ようです。これが仕様なのか、バグなのかは分かりません。(バグのような気は
しますが) MySQL ODBC 5.1.8をインストールしたところ、MySQL5.5に接続できました。
※ただし、対応がMySQL4以降のため、MySQL3.23.55のサーバにはアクセス
出来ませんでした。またその際に、Win2kの端末でAccess2000からODBC5.1.8
接続でのリンクは成功しました。

ちなみに、環境的にMySQL3.23サーバをメイン(3台)で使用し、クライアントも
Win2kが二十数台残っている状況なので、所見としてMySQL5.5サーバを導入、
また、MyODBC5.1を使用するのは、安定動作の面で不安を感じます。
常に全てを最新に保てる環境ではないので、MySQL5.5の導入は出来れば見送り
たいと考えるようになりました。
※引き続き、MySQL5.5サーバで、Access2000からMyODBC3.51を使用して、
テーブル名にアンダーバー付でリンク貼る方法をご存知の方がいましたら、
教えてください。

※ちなみに、今回導入しようとしているMySQL5.5は、DB(MySQL3.23)サーバ
として使っているサーバの保守が切れるので、新しいサーバを念のため購入
した際、購入希望の機種がMySQL3シリーズは動作できない可能性がある。
と脅されましたので、MySQL5.5を社内の環境で運用可能か調査していました。

ついでの質問で申し訳ないのですが、
PRIMERGY TX150 S7 Linux (OS:RedHat Enterprise Linux 5.6)こちらに、
MySQL3.23のバージョン(もしくはMySQL4.*)をインストールして使っている人が
もしいましたら、評価を教えてもらえると幸いです。

長々とすみません。
399NAME IS NULL:2012/04/24(火) 18:08:59.44 ID:???
>>398
MySQL 4.0は動いた。
MySQL 3.23はたしかビルドが通らなかったと思う。

新しいサーバがRHEL 5.6なら、仮想化を使えばいいのでは。
今の環境をそのまま仮想環境に移行して、バージョン塩漬け。
400385:2012/04/25(水) 15:50:51.33 ID:ISxy2/+A
>>399
レスありがとうございます。
ビルドが通らないとなると・・・スパッと諦めて他の方法を検討します^^;
仮想化を必要としてなかったため経験ないですが
旧サーバのOSがインストール出来れば、MySQL3.23.55を試してみます。
ダメなら、MySQL4.0でサーバ構築するか。
いずれにしても、大変参考になりました。
ありがとうございます。

しかし、こういってはなんですがたかだか10年程度の世代の違う環境が混在しただけで
環境の更新に苦労するのが・・・疲れます。
システム担当としては失格なのでしょうが、自分の能力が世の中についていけてないのをヒシヒシと感じます^^;
401NAME IS NULL:2012/04/25(水) 16:35:32.89 ID:???
その10年でMySQL AB社は2回買収されました。
プロダクトが残っているだけでも奇跡
402NAME IS NULL:2012/04/25(水) 18:56:00.16 ID:???
5年経ったらPCもシステムも切り捨て 人も
403NAME IS NULL:2012/04/25(水) 22:22:23.70 ID:???
そしてブラックボックスになってしまったプログラムだけが動いている…と w
404NAME IS NULL:2012/04/27(金) 00:12:55.19 ID:zlgl+19I
Mysqlのインストはyumでかんたんにできる(まえはソースからいれたかも)

だけど、4年くらいいっさいやってなかったら、
すっかりMySQLのSQL文を忘れてしまい、覚えようとしても覚えられません。

で、いい本やサイトを探してます。

要は初心者というかサルでも分かるような本やサイトで、
できれば本ならカラーだと(のほうがみやすい)助かります。
分厚い本やページ数が多いサイトでもかまりません。

おすすめの本やサイトご存知、ないのでしょうか?
よろしくお願い申し上げます。
405404:2012/04/27(金) 00:16:06.56 ID:???
誤字すみません。

キーボードがいかれてて・・・

<誤>
かまりません。

<正>かまいません。

<誤>
おすすめの本やサイトご存知、ないのでしょうか?

<正>
おすすめの本やサイト、ご存知のかたいらっしゃいませんでしょうか?

よろしくお願い申し上げます。
406NAME IS NULL:2012/04/27(金) 12:04:42.47 ID:???
>>404
オライリーのやつでいいよ
クックブック上下買え
407NAME IS NULL:2012/04/28(土) 00:51:20.89 ID:i08GbiU/
phpからMySQLに接続して処理させていますが、一つのphpファイルの中で
mysql_connectの処理をどう配置するかで迷っています。
処理の中では、データベースから読み込む関数と書き込む関数と処理を分けてるのですが、
読み込みと書き込みそれぞれの処理で一回一回接続・切断をしたほうがよいものでしょうか?
それとも、1つのphpのファイルの中で、1回接続して全ての処理を終わらせてから切断した方が
よいものなのでしょうか?
408NAME IS NULL:2012/04/28(土) 02:45:31.09 ID:???
もちろん後者
クラスでまとめれば完璧
409NAME IS NULL:2012/04/28(土) 08:28:13.03 ID:i08GbiU/
>>408
レスありがとうございます。 後者で組んでみます。

もう一つ質問させてください。
書き込む時間をカラムに入れ込んでいるのですが、時間の取得はphpのdate関数を使うのと
データベースのnow関数を使うのでは、どちらがサーバーに負担が少ないのでしょう。
あまり大差はないのでしょうか?
410NAME IS NULL:2012/04/28(土) 10:01:23.20 ID:???
横槍です。

書き込み時間をセットするカラムがあるんですよね?
NOW関数か、phpのdate関数かによるサーバ側の負荷は、
出力する形式次第だけの問題な気がします。
出力形式が一緒であれば、負荷は一緒だと思いますし。

クライアント側では、どちらを使うかによって若干の違いがあるかもしれません。
また、NOW関数が何のNOW関数かによって差が出るかもしれません。
詳しく考えたことがないので曖昧ですが。

勘違いしたこと言ってたらごめんなさい。
411NAME IS NULL:2012/04/28(土) 11:29:26.79 ID:???
>>409
どっちがと言うと、確かに微々たる物でも違いはあるだろうけど、
こんなとこでそんなの聞いてる段階の人が気にするような違いじゃあないよ。

そんなの気にするよりは、記録したい時間は
・厳密にアクセスを受け付けた時点のものか(ならばPHP側で時刻取得)
・厳密に最終的に記録した時点のものか(ならばDB側で)
とか考えるのが先じゃない?
他に、一回で複数レコードの記録が発生するとき、そのレコード達に記録される
時刻は、アクセス受付時のもの一つに揃って欲しいかそうでもないかとか。

そういう業務上の論理をすっ飛ばして、どっちがサーバ負荷が低いだろうかなんて
気にするのは馬鹿らしいよ。

論理の必要性を踏まえて、その上でとことん効率を求めなければならない高負荷サイトの
実装/管理者なら気にするところだろうけど、質問内容からすると貴方はそうじゃないでしょ?
気にしなさんな。

そんなに厳密にどっちの時点? ってのがどっちでもいいなら、
now()使っとくのが簡単だよ。
412NAME IS NULL:2012/04/28(土) 13:47:24.90 ID:???
計測してみるのが一番確実だよね
413NAME IS NULL:2012/04/30(月) 08:50:09.71 ID:FgtJ2kL6
SELECT EXTRACT(YEAR FROM "1999-07-02");

これを実行すると

エラー
実行した SQL:

SELECT EXTRACT(

YEAR
FROM "1999-07-02"
)
LIMIT 0 , 30;

MySQLのメッセージ:

#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 'FROM "1999-07-02" )
LIMIT 0, 30' at line 1

となります。
何故でしょう?
414NAME IS NULL:2012/04/30(月) 09:49:08.93 ID:???
シンタックスが間違ってるから
415NAME IS NULL:2012/04/30(月) 10:13:55.08 ID:???
>SELECT EXTRACT(YEAR FROM "1999-07-02");

エラー無しで 1999がちゃんと返ってきたけど
ver 5.5.19
416NAME IS NULL:2012/04/30(月) 11:03:04.98 ID:???
check the manual that corresponds to your MySQL server version for the right syntax
って親切に書いてあるじゃん
417NAME IS NULL:2012/05/01(火) 20:09:24.63 ID:???
mysql cluster を入れようとしても
$ sudo yum install --enablerepo=epel,remi,dag mysql-cluster.x86_64
Package mysql-cluster is obsoleted by mysql, trying to install mysql-5.5.23-1.el5.remi.x86_64 instead
って言われて、 mysql と mysql-libs くらいしか入らない。

パッケージ管理したいから make したり、http://dev.mysql.com/doc/refman/5.5/en/mysql-cluster-install-linux-binary.html みたいな入れ方をしたくないんだよなぁ。

centos 5.6 なんだけど
http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-Cluster-7.2/
から
MySQL-Cluster-client-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-devel-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-embedded-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-server-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-shared-compat-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-shared-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-test-gpl-7.2.5-1.rhel5.x86_64.rpm

あたりを落としてきて、入れるしかない?

でも、本番サーバは centos6で、そうなると、そっちの環境は
MySQL-Cluster-test-gpl-7.2.5-1.el6.x86_64.rpm
の、 el6 でいいのかな?
418NAME IS NULL:2012/05/01(火) 21:50:49.48 ID:???
http://dev.mysql.com/downloads/cluster/
ここから落としたやつを rpm のパッケージにするのかな。

どうやってやればいいですかね。。
419NAME IS NULL:2012/05/01(火) 22:23:03.97 ID:???
本家のもパッケージ管理されてると思うけど、yumで管理したいってこと?
iijあたりをローカルにミラーしてcreaterepoすればいいんじゃないの
420NAME IS NULL:2012/05/01(火) 23:06:34.41 ID:???

suse 用の sles や、debian 用の deb はあったけど、 centos 用の rhel がなくて、、結局
http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-Cluster-7.2/

から rhel のやつをとってきて
MySQL-Cluster-client-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-devel-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-embedded-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-server-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-shared-compat-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-shared-gpl-7.2.5-1.rhel5.x86_64.rpm
らを

sudo rpm -ivh MySQL-Cluster-*
でいれますた。
421NAME IS NULL:2012/05/02(水) 00:00:58.68 ID:???
>>410>>411
お礼が遅くなりました
レスありがとうございます。
ご指摘の通り、出力するタイミングを考えて(使用側はさほど厳密性がいらないようですが)
now()で書き込む直前に処理させようと思います
422NAME IS NULL:2012/05/03(木) 04:07:28.24 ID:tS/TQ5Jx
すみません、初歩的な質問かと思いますが、よろしくお願い致します。

MTのサーバーの移転作業で日本語が「???」となる文字化けで困っています。
文字コード等の問題ということは分かってきたのですが、
共有サーバー(さくら)なので「my.cnf」?等のファイルが直接触れず、コードの変更ができません。
phpMyadminやSSHのコマンドラインから変更することは可能なのでしょうか?
それともVPSサーバーなどに移るのが得策でしょうか。
ちなみに移転前の現在はVSPサーバーを使っています。(人様が導入しました)

PHP 5.2.17 MySQL 5.5 MT 3.21ja mac OSX 10.6.8

どうぞ宜しくお願い致します。
423NAME IS NULL:2012/05/03(木) 14:08:31.45 ID:???
>>422
情報小出しにすると解決しないよ。
現行のmy.cnfとダンプファイルをさらせる範囲で、
あと移行先のMySQLバージョン、my.cnfぐらい。
424NAME IS NULL:2012/05/03(木) 18:46:37.77 ID:tS/TQ5Jx
【現行の環境】PHP 4.4.7 MySQL 4.1.22 MT 3.21 ja
【移転先環境】PHP 5.2.17 MySQL 5.5 MT 3.21 ja

【my.cnf(現行VPSサーバー)】
[client]
user=xxx(伏せます)
default-character-set = ujis
[mysqld]
default-character-set = ujis
[mysqldump]
default-character-set = ujis

移行先のmy.cnfはさくらサーバーだからなのか、そもそもmysql系統のファイル置き場が見つけられません。

ダンプファイル…よく分かっていないのですが、
-- phpMyAdmin SQL Dump
-- version 2.11.10
-- http://www.phpmyadmin.net
(略)
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
(略)
ENGINE=MyISAM DEFAULT CHARSET=ujis AUTO_INCREMENT=6 ;
(※各テーブルのCHARASETはujisのようですが、
 文中のアマゾンへのリンク等でutf8と言う文字も見つけました)

あと参考になるかわからないのですが…。
【現行のCHARASET?】
character_set_client utf8
character_set_connection utf8
character_set_database ujis
character_set_results utf8
character_set_server ujis
character_set_system utf8
character_sets_dir /usr/local/mysql-4.1.22/share/mysql/charsets/

【移転先CHARASET?】
character_set_client utf8
character_set_connection ujis
character_set_database ujis
character_set_filesystem binary
character_set_results utf8
character_set_server ujis
character_set_system utf8
character_sets_dir /usr/local/share/mysql/charsets/

以上です。宜しくお願い致します。
425NAME IS NULL:2012/05/04(金) 00:50:03.87 ID:???
>>424
mysqldump --default-character-set=ujisで
明示的にEUC-JPで引っこ抜いてみて。今はUTF-8になってると思う。
426NAME IS NULL:2012/05/04(金) 01:51:22.17 ID:sglJpw9f
>>425
ありがとうございます。
すみませんが、これはphpMyadminのSQLに入れて実行すると良いのでしょうか?
#1064 - You have an error in your SQL syntax; 〜 と出てしまって実行できません…。
427NAME IS NULL:2012/05/04(金) 01:55:54.64 ID:sglJpw9f
追加で、ターミナルSSHで実行としようとしても反応がありません…。
428NAME IS NULL:2012/05/04(金) 06:34:11.93 ID:???
>>427
SSHから実行するんだけど、足りないオプションは自分で補ってね。
-u ... -p --all-databasesとか
429NAME IS NULL:2012/05/04(金) 16:58:47.48 ID:mUAVOCUR
<Sale>中国語版の書籍<IT|3D|NN|理系|上古漢語などなど>(格安) 280円より
http◎lang-8○com/194279/journals/1457398/
430NAME IS NULL:2012/05/04(金) 20:04:29.39 ID:???
MySQL5.0を使っていますがGRANT構文で権限を付与したら
FLUSH PRIVILEGES;は必要ですか?
431NAME IS NULL:2012/05/04(金) 20:14:36.44 ID:???
面倒ならサーバ再起動しようぜ
432NAME IS NULL:2012/05/04(金) 20:24:03.93 ID:???
>>430
GRANT使った場合はFLUSH PRIVILEGES不要
433NAME IS NULL:2012/05/04(金) 20:33:27.85 ID:???
は〜い
434NAME IS NULL:2012/05/05(土) 01:59:03.27 ID:p1vOv43V
KEY `hoge` (`columnA`,`columnB`,`columnC`,`columnD`)
上のような結合キーを作ったテーブルで、個別のキー単体で検索した場合にインデックスは使ってくれるんでしょうか?
それともセットで検索した場合でないと使ってくれないんでしょうか?
435NAME IS NULL:2012/05/05(土) 02:43:19.90 ID:???
>>434
Aならセーフ
BやCならアウト
436NAME IS NULL:2012/05/05(土) 18:24:49.79 ID:FfcPD0YX
初めまして。
皆様お知恵をお貸しください。

テーブル:
t_work
フィールド:
f_workID
f_a1
f_a2
f_a3
f_b1
f_b2
f_b3




テーブル:
t_user
フィールド:
f_userID
f_userName

f_a1以降にt_userテーブルのf_userIDが入っています。

該当のt_workテーブルにID登録されているユーザー名[f_userName]を表示しようとし、

t_work.f_a1 = t_user.f_userID
t_work.f_a2 = t_user1.f_userID
t_work.f_a3 = t_user2.f_userID
t_work.f_b1 = t_user3.f_userID



とテーブル名にエイリアスをつけて表示されようとした所、
テーブル結合は61までという上限に引っかかってしまいました。

すでに登録の方が作られており、テーブル構成の変更は出来ない状態です。

何かよい方法がはありませんでしょうか。
よろしくお願いいたします。
437NAME IS NULL:2012/05/05(土) 18:33:49.20 ID:???
>>436
それどういうシステム?
438NAME IS NULL:2012/05/05(土) 18:55:47.17 ID:FfcPD0YX
>>436
レスありがとうございます。
単純化してはありますので
言葉では大変説明しづらいのですが、
t_workの中に、担当者と本当は作業予定日も入っております。
さらにt_workにも親テーブルがあり、その親テーブル(t_oya)から
ユーザー名と作業予定日を見に行くシステムです。
冗長なのだろうとは思いますが、何かお知恵がありましたら
よろしくお願いいたします。
439NAME IS NULL:2012/05/05(土) 18:56:56.47 ID:FfcPD0YX
すいません。アンカーミスです。
>>438>>437様への返答です。
440NAME IS NULL:2012/05/05(土) 19:12:10.94 ID:???
テーブル設計がおかしすぎる
フィールドで持つのやめればいいんでねの?
441NAME IS NULL:2012/05/05(土) 19:16:19.04 ID:FfcPD0YX
>>440
私もそう思うのですが、>>436に書いたとおり動いてしまっている案件でして、
すでにDBの変更が出来ないのです。

インターフェースはPHPなのですが、
そちらで処理出来ればとも思い、試行錯誤しております。

多少力業でも良いので何かアイデアがありましたらご教授ください。
442NAME IS NULL:2012/05/05(土) 19:18:41.73 ID:???
>>441
複数クエリのUNIONでも怒られるの?
あと力技でもいいなら、分割してSQL発行してPHP側で結合とか
443NAME IS NULL:2012/05/05(土) 19:25:45.21 ID:FfcPD0YX
>>442
ありがとうございます。
複数クエリのUNIONですか?まだやった事がないので調べて見ます。

分割してSQL発行して…はやっては見ているのですがうまくいっていません。

担当者名で検索->t_userからあいまい検索してuserID抽出->
t_work内から抽出したuserIDを含むレコードを検索までは行けたのですが、
この方法だとどのフィールドにそのuserIDが登録されているかを調べる方法を
見つけられませんでした。
444NAME IS NULL:2012/05/05(土) 20:15:40.93 ID:???
1.userテーブルから全部取ってきてPHPの配列に入れる
2.workテーブルから全部取ってきてPHPの配列に入れる
3.PHP側で結合するなり検索するなり好きに処理書く
でおk
445NAME IS NULL:2012/05/05(土) 20:29:32.82 ID:FfcPD0YX
>>444
ありがとうございます。

その方法も試してはいるのですが、時間とスキルが足らず、
四苦八苦しております。

その方向でももっと考えて見ます。
446NAME IS NULL:2012/05/05(土) 21:58:40.36 ID:???
この方法で苦労するのなら他の方法はオススメ出来ないな
447NAME IS NULL:2012/05/06(日) 05:21:35.39 ID:???
ユーザー名だけ欲しいならサブクエリにしてしまえば?
後、他の人が言うように設計した奴をどうにかしないと
何度でも問題に突き当たると思うね

select
 t_work.*,
 (select f_userName from t_user where f_userID = f_a1) as a1,
 (select f_userName from t_user where f_userID = f_a2) as a2,
...
 (select f_userName from t_user where f_userID = f_a100) as a100
from
 t_work
448NAME IS NULL:2012/05/06(日) 15:56:16.27 ID:kaAb9YNz
>>428
大変遅くなりましたが、ありがとうございました。

しかしながら、何度も試しているのですが、実行がうまくいきません…。

mysqldump -u ユーザーネーム -pパスワード データベース名 --default-character-set=utf8 > /www/htdocs/mt/mt.sql

このように打っているのですが、enterを押すと次の行に「->」と言う表示が出てしまいます。
ルートパスの問題でしょうか…?色々調べているのですが、あまりに初歩的すぎるのか解決方法が見つかりません…。

問題点がありましたらご指摘頂けますと、大変嬉しく思います。
どうぞ宜しくお願い致します。
449448:2012/05/06(日) 15:59:02.75 ID:kaAb9YNz
度々すみません、スクリプトはこちらでした。

mysqldump -u ユーザーネーム -pパスワード データベース名 --default-character-set=ujis > /www/htdocs/mt/mt.sql
450NAME IS NULL:2012/05/06(日) 16:12:38.91 ID:???
>>448
mysql3.23しか使ったことないけど
それ、mysql起動してない?

3.23の話しだけど、デフォならc:\mysql\bin に入って、そこでmysqldump実行したらいけそう
451448:2012/05/06(日) 16:29:05.64 ID:kaAb9YNz
>>450
早速ありがとうございます!
mysqlを起動してしまっていました…。
一旦exitしてから実行したら上手く出来たようです。大変感謝致します…!
452NAME IS NULL:2012/05/08(火) 22:11:40.49 ID:???
>436
なんか、Excelのシートをそのままテーブルにしました、って感じだな。
んで、Lookup関数で名前は引っ張れると考えているような…
リレーショナルデータベースの基本中の基本がなっていないですねぇ。

他の方も言っている様に、根本的な設計がおかしいです。
また、t_workテーブルはカラム数が可変(増えていく)ように見えます。
そんなことしていると、レコード長の制限に引っかかったりしますよ。
設計した奴をシメて、初めからやり直すことを薦めます。


まぁ、これでは解決しないと思うので、SQLらしい回答も

userIDが一致するuserNameが含まれるような結合にすれば可能です。
全ての組合せとなる直積集合(デカルト積の方が伝わるかも)はクロス結合で生成できます。
その中からuserIDが一致するものを抜き出せばOKということです。

で、クエリを書くと下記のようになります。

SELECT
t_work.f_workID,
MAX( CASE WHEN t_work.f_a1 = t_user.f_userID THEN t_user.f_userName ELSE NULL END ) AS a1,
MAX( CASE WHEN t_work.f_a2 = t_user.f_userID THEN t_user.f_userName ELSE NULL END ) AS a2,
(必要な数だけ書く)
MAX( CASE WHEN t_work.f_zX = t_user.f_userID THEN t_user.f_userName ELSE NULL END ) AS zX
FROM t_work
CROSS JOIN t_user
GROUP BY t_work.f_workID

簡単に解説

CROSS JOIN t_user
クロス結合です。ON条項のないINNER JOINでも同じ結果になりますが、直積を求めていることを
明示するためにもCROSS JOINを使いましょう。

GROUP BY t_work.f_workID
workID毎に纏める、まぁ普通のGROUP BYです。

MAX( CASE WHEN t_work.f_a1 = t_user.f_userID THEN t_user.f_userName ELSE NULL END ) AS a1
今回のクエリのポイントです。
t_work.f_a1 = t_user.f_userIDが成立するuserNameを引っ張り、それ以外ではNULLにします。
MAX等の集計関数はNULLを除外するので、t_work.f_a1 = t_user.f_userIDの時の値のみ残ります。
※集計関数のNULLは要注意事項です

SELECT *
FROM t_work
CROSS JOIN t_user
ORDER BY t_work.f_workID
を実行すると、理解しやすいかも

今回みたいなテーブル構成の場合CASE式を駆使すると意外に対応できたりします。
PHPのswitch-caseのような「文」とは全く違うので、混同しないようにしましょう。
453452:2012/05/08(火) 22:27:04.03 ID:???
あ、SELECT * 〜のクエリを試せば想像できると思いますが、全ての組合せを生成するので
クロス結合はかなり高コストなクエリです。
なので、頻繁には使わない方がいいです。

結局「設計をやり直せ」に戻ります
454NAME IS NULL:2012/05/11(金) 11:13:15.19 ID:3XKKtx03
MySQLってカラムの追加は向いてるけど、データの激しい更新は向いてないって本当なんでしょうか?
たとえば1秒間に100回更新するカウンターとかはMySQLでするんじゃなくテキストでやった方が良いと聞いたんですが
455NAME IS NULL:2012/05/11(金) 12:36:13.12 ID:???
>>454
今試してみたらMySQLでカウンタは毎秒1744回更新できたよ。
(Xeon W3520 2.67GHz、MySQL 5.5.24、InnoDB、Java)
これで何か問題ある?
456NAME IS NULL:2012/05/11(金) 12:37:48.94 ID:3XKKtx03
わざわざありがとうございます
会社でカウンタ作るときわざわざMySQL使うなといわれたのですみません
457NAME IS NULL:2012/05/11(金) 12:40:49.56 ID:???
新入社員がボロクソに扱われる季節か
458NAME IS NULL:2012/05/11(金) 18:44:58.36 ID:???
高いボラクルとか買って景気回復に貢献してください
459NAME IS NULL:2012/05/11(金) 19:56:01.82 ID:???
>454
同時アクセスとかを考えると、テキストファイルよりMySQLの方がマシだと思うが、
カウンタのためだけならMySQLは入れなくてもいいような…

memcachedとかの方がパフォーマンスもいいだろうし
460NAME IS NULL:2012/05/12(土) 01:21:38.26 ID:???
新入社員で思い出したが
俺の会社で一つのDBにテーブルが200万個あるのが設計ミスに思えて仕方が無い
皆こんなに作るモン?
461NAME IS NULL:2012/05/12(土) 01:32:30.84 ID:???
>>460
具体的にどう設計ミス?
462NAME IS NULL:2012/05/12(土) 01:45:11.04 ID:???
ID出した方が良いか
俺個人のがphpmyadmin使ってるからかもしれないけど
テーブルはスッキリ、詰め込めるものは全部不恰好でもレコードでって考えてる

ちなみにその会社の設計は200万個のテーブルにそれぞれ1万個のレコードがある感じ
463NAME IS NULL:2012/05/12(土) 09:20:41.76 ID:???
数だけじゃ何も判断できないだろ。

まぁ、その使用する環境でそれだけのテーブルを扱う場合に
パフォーマンスが出ない、なんて問題があったらシステム設計ミスと
いえるかも知れんが。
464NAME IS NULL:2012/05/12(土) 09:36:38.81 ID:???
別にテーブル数は100万個あったって問題はないぞ
なんたってテーブルキャッシュがデフォで65535個もあるんだからなぁ!
465NAME IS NULL:2012/05/12(土) 11:54:58.56 ID:vQgN3wIa
ゲーム内のランキングを取得するSQL文を教えていただきたいと思い書き込みました。
MySQLのバージョンは5.5.8です。

以下、テーブルです。

USER_TBL
------------
ID, - 主キー


ACTION_MST
------------
ID, - 主キー
SCORE, - 行動に対する獲得スコア


SCORE_TBL
------------
ID, - 主キー
USER_ID, - USER_TBL外部キー
ACTION_ID, - ACTION_MST外部キー
REGIST_DATE, - スコア獲得日


このテーブル構成にて、本日より過去5日間の獲得スコアランキングを
SQL文にて取得したいと考えております。

http://blog.syuhari.jp/archives/64
この説明等を参考にしたのですが、ここで説明されている
scoreカラムは1つのカラムであり、今回の場合は5日間のスコア自体を
関数で計算しながらという事になると思うのですが、うまくいきません。

ご回答頂ければ幸いです。
466462:2012/05/12(土) 12:04:42.99 ID:+gwxXnlU
例えると利用者が200万人、買ったもの履歴が1人大体1万個みたいな感じ
利用者の情報が入ったテーブルと
利用者ごとにテーブル用意して、そのテーブルに購入履歴のレコードを記録してる

俺としては購入履歴を全部一緒にして200億ぐらいレコードのあるテーブルにしていいと思ってるんだけど
467NAME IS NULL:2012/05/12(土) 12:36:43.09 ID:???
joinとkあunionとかする時めちゃめんどくさいと思うけど(まぁそれを手作業ではしなくて良い状況なんでしょうが)
468NAME IS NULL:2012/05/12(土) 13:35:52.49 ID:???
>>466
俺も200万テーブルはいかがかと思うが
設計当時のハードウェア制約やパフォーマンス稼ぎ名目で正規形を崩す事があるからなんとも言えない
バッドノウハウだとしても稼動中のシステムの改修は中々やらせてもらえないだろう
469NAME IS NULL:2012/05/12(土) 14:11:25.16 ID:???
テーブルが多いと接続時時間が掛かるってのは聞いたことある
use databaseでね
200万のテーブルではなく200万のDBファイルにすればいいのではないのか
470NAME IS NULL:2012/05/12(土) 15:16:35.08 ID:???
まぁ、俺だったらパーティショニングするけどね
それも一つでパーティショニングするのではなく、無理難題を何度も乗り越えてきてもはやDB歴戦の勇者となった俺は2つでパーティショングする
8種類で分けたのを18種類でわけて164通りとかそんな風に。これがとてつもなく早い
471NAME IS NULL:2012/05/12(土) 16:14:22.42 ID:+gwxXnlU
二段階に分けるってのは凄い勉強になったけど、それ144通りじゃない?
472NAME IS NULL:2012/05/12(土) 16:24:14.34 ID:A28FyteB
今webアプリを作ってるんですが、mysqlへの接続するのに
接続先ホスト(アプリケーションサーバと同じ端末localhostのmysql)が
127.0.0.1なら接続できるのに 192.168.1.100と指定すると接続できません
何が原因なのでしょうか

ポートの問題なのかなと思ったんですが、nmapすると
3306/tcp open mysql
として開いているようです。他にどんな可能性があるのかすみませんがご意見お願いします
473472:2012/05/12(土) 16:57:12.59 ID:???
ごめんなさい、解決しました
ユーザ名とパスワードを別ホストから使えるよう許可する必要があったんですね
スレ汚しすみませんでした
474NAME IS NULL:2012/05/12(土) 20:01:04.76 ID:???
学んだな
475NAME IS NULL:2012/05/12(土) 20:38:44.78 ID:???
phpmyadminで200万テーブル扱えるんだ…
ブラクラにならないんだ。すげー

MyISAMのテーブルロック回避でユーザーごとにテーブルを作成した、とかなんだろうけど
UNIONで集計とかは考えたくないなぁ
476NAME IS NULL:2012/05/12(土) 20:50:03.72 ID:???
>465
過去5日分を集計したテーブルを予めつくればいいんじゃないの?
477465:2012/05/12(土) 20:54:24.40 ID:???
>>476
すいません、書き方が悪かったです。
アクセス日より過去5日ですので、当日分は常に変動すると思うのです。
478465:2012/05/12(土) 21:34:19.67 ID:???
>>476
何度もすいません。
テンポラリテーブルというものがあると知ったので
スコアを抽出したテーブルを一時的に作ってランキングを抽出しようと考えたのですが
テンポラリテーブルは自己結合ができないとの事で、また悩んでおります。
479NAME IS NULL:2012/05/12(土) 21:56:51.07 ID:???
MySQLは1テーブルあたり1つ以上のファイルを作る。
なのでOSがファイルを200万個扱えるかどうかという話がある。
それくらいだとLinuxではiノードの数が足りなくなる場合がある(増やせるけど)。

あと扱えはするけど、古いOSだとlsするだけで数分かかったり、
さらにulimit -nの制限をくらうので同時には開けず、
テーブルアクセスのたびにopen/closeを繰り替えす残念な挙動になる。
Linuxの都合から言えばテーブル数は1万以下にはしたい。
480NAME IS NULL:2012/05/12(土) 21:57:31.77 ID:???
普通のテーブル作ってそれを更新すりゃいい話じゃないの?
ランキングなんて、見る人によって内容が変わるもんじゃないでしょ。
481NAME IS NULL:2012/05/12(土) 22:07:33.27 ID:???
>>478
一時テーブルを2回結合するとエラーが出る!不思議!
でも普通のテーブルをTRUNCATE TABLEしてからINSERT INTO ... AS SELECT ... してから結合すると…?
482NAME IS NULL:2012/05/12(土) 23:47:33.63 ID:???
REPLACE INTO文ってROLLBACKできるんでしょうか
483NAME IS NULL:2012/05/13(日) 11:10:18.00 ID:???
mysqlで全文検索を実装したのですが
大量のレコードに引っかかるワードで検索すると
単純なselect...match..against構文でも10秒以上かかってしまいます
一定以上時間かかるようなクエリは途中で実行を終了させる、というようなことはできますでしょうか
484NAME IS NULL:2012/05/13(日) 12:50:11.69 ID:jKuh5bmn
PHPとMySQLで開発していて、PHPのソースはSubversionで管理していますが
DBのテーブルの変更を、Subversionみたいに(じゃなくてもいいけど)管理する方法ないでしょうか
複数の鯖で運営する時、DBのテーブル構成の同期を取るのにいつも苦労しています
485NAME IS NULL:2012/05/13(日) 16:07:24.39 ID:???
同期をとるっつーのならレプリケーションでは?
やったこと無いから知らんけど w
486NAME IS NULL:2012/05/13(日) 16:18:13.75 ID:???
487NAME IS NULL:2012/05/13(日) 18:02:10.09 ID:???
マルチというか、スレ違いと言われてこっちに来ますた
データの同期じゃなくてテーブル構成の同期だけなので、レプリケーションじゃないです
488NAME IS NULL:2012/05/13(日) 18:35:38.96 ID:???
>>487
mysqldump --no-dataの出力か、MySQL WorkbenchでExportしたファイルを
Subversionで管理してみたらいいんじゃない。
489NAME IS NULL:2012/05/14(月) 11:35:35.76 ID:rmHVUy71
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
490NAME IS NULL:2012/05/14(月) 12:34:52.99 ID:6ANnHhUA
SELECT * FROM tableA WHERE id = 'nuber2' FOR UPDATE
でレコードの排他ロックを行っているのですが

hoge.phpにて
$sql = 'SELECT * FROM tableA WHERE id = 'nuber2' FOR UPDATE';
if($result = mysql_query($sql,$link_id)){
   echo 'ロック';
}
sleep(10);
とやっているのですがスリープ中にage.phpにて
$sql = 'SELECT * FROM tableA WHERE id = 'nuber2'';
if($result = mysql_query($sql,$link_id)){
   $rows = mysql_fetch_assoc($result);
   echo $rows['name'].';
}
とやってもage.phpでも取得できてしまいます
ストレージはInnoDBになってるのですがどうも原因がよくわからず
LOCK TABLES tableA WRITEとかでのテーブルごとのロックはできてるんですが
491NAME IS NULL:2012/05/14(月) 17:36:57.31 ID:???
志村ー
検索するほうでも FOR UPDATEつけないとあかんでー
492NAME IS NULL:2012/05/14(月) 21:03:27.71 ID:CB4EPI8d
493NAME IS NULL:2012/05/15(火) 06:29:09.62 ID:bfF6xyzj
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
494NAME IS NULL:2012/05/15(火) 19:24:07.70 ID:bfF6xyzj
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
495NAME IS NULL:2012/05/15(火) 23:07:41.42 ID:???
どうも仕事で嫌なことがあると戻ってくるみたいね
496NAME IS NULL:2012/05/16(水) 04:25:09.96 ID:/ibgSKqe
私が千歳科学技術大学 グローバルシステムデザイン学科 専任講師・理学博士:深町 賢一だが何か?
用があるなら、http://www.chitose.ac.jp/course/teacher/glo/000057.html
497NAME IS NULL:2012/05/16(水) 04:58:59.13 ID:QUWdYWsE
このスレじゃ瞬殺されそうなほど下らなくて厨な質問で申し訳ないが、
MySQLのコミュニティーエディションをダウンロードして、
早速アクセスとかファイルメーカーのような使い方って出来ないですよね?

石、投げないで
498NAME IS NULL:2012/05/16(水) 10:14:54.20 ID:???
できない。MySQL自体にGUIはない。
499NAME IS NULL:2012/05/16(水) 17:44:05.90 ID:???
>>498
やはり・・・
レスありがとうでした
500NAME IS NULL:2012/05/16(水) 23:52:10.15 ID:???
>>497
Accessでリンクテーブル使う
501NAME IS NULL:2012/05/17(木) 22:08:59.56 ID:+V33Ovju
今までプログラミングで文字列というとダブルクォートとシングルクォートしか知らなかったんですが
'key'='7001'だと無理で
`key`='7001'だと出来たんですが

「'」と「`」ってどう違うんでしょうか?
文字列の時はシングルクォートでいいんですよね?アクセントの使い方がイマイチよくわかりません
502NAME IS NULL:2012/05/17(木) 22:11:04.86 ID:???
アクセントって英語の勉強かよ
それバッククォートって言うんだぜ。俺中学の時英語の先生に指摘してやったぜ
503NAME IS NULL:2012/05/17(木) 22:24:56.09 ID:???
んだからテーブルとフィールドには`必ず入れろと
セキュリティ対策にもなるから必ず入れとけっつーの
504NAME IS NULL:2012/05/19(土) 02:06:01.31 ID:r7mkedqU
質問です
UPDATE〜SET〜WHEREでデータの更新した場所を
mysql_fetch_arrayで取得しようとしても取得できませんでした

この場合mysql_queryの返り値がtrueだったので取得できないのは当たり前なのですが
UPDATEした場所のレコードを取得するにはどうしたらいいのでしょうか?
またselectで二度目のmysql_queryを実行しなければならないのでしょうか?
505NAME IS NULL:2012/05/19(土) 08:18:21.00 ID:???
updateは基本的に行は返さん
トリガでも使え

postgresだったらそのままの事がreturning句で出来るがmysqlは多分出来ない
506NAME IS NULL:2012/05/20(日) 00:40:29.50 ID:qNCu6poQ
2度目のselectはいやなんか。
間の更新が気になるなら強い分離レベルにして同じトランザクションで実行すればよい。
select for updateで行ロックとかでも良いのかな。
507NAME IS NULL:2012/05/22(火) 05:16:07.32 ID:s3FE6m1g
以前ココでテーブルの数が数万個あったら時間がかかるので設計ミスとかいうのを聞いたんですが
フィールドの場合も同じで最低でも100個以下とかに抑えたほうが良いんでしょうか?
508NAME IS NULL:2012/05/22(火) 07:04:28.90 ID:???
>>507
そもそもInnoDBにレコード長8KBの制限があって、500カラムとかまず作れない。
正規化して100カラムぐらいならいいんじゃないの別に
509NAME IS NULL:2012/05/22(火) 13:22:34.72 ID:s3FE6m1g
> そもそもInnoDBにレコード長8KBの制限があって、500カラムとかまず作れない。
良い事聞きました、ありがとうございます!
510NAME IS NULL:2012/05/22(火) 19:56:43.01 ID:kuoj32zL
load data I file を実行して容量が足らなくなりエラーが発生し、その後ロックが解除されません。
killコマンドとunlock tablesコマンドを実行してもプロセスの状態がfreeing itemsのままで暫く待っても変化がありません。
アドバイスをお願いします
511NAME IS NULL:2012/05/22(火) 20:15:44.42 ID:???
>>510
覚悟を決めてmysqldをkill -9するしかないんじゃ。
MyISAMは該当テーブルが壊れると思うので作り直し。
InnoDBは助かるかもしれないけど自信ない。
512NAME IS NULL:2012/05/23(水) 15:37:19.59 ID:Jy5HMPPP
質問致します

表 sakananovitamin
osakana  vitaminB vitaminC vitaminD
まぐろ   20        30        10
かつお    20       10        20
こはだ    10       10        0

やりたいこと
・PHPで上の表をHTMLでだしたい
・ただしそれぞれのレコードで、ビタミンB、C、Dで最大のフィールドの値を強調して下のように表示したい
<tr><td>まぐろ</td><td>20</td><td style="color:red;">30</td><td>10</td></tr>
<tr><td>かつお</td><td style="color:red;">20</td><td>10</td><td style="color:red;">20</td></tr>
<tr><td>こはだ</td><td style="color:red;">10</td><td style="color:red;">10</td><td>0</td></tr>

やったこと(ここまでならできること)
$sql = "SELECT * FROM sakananovitamin ";
$result = mysql_query($sql,$link);// $link =略

print"<table><tr><td>お魚</td><td>ビタミンB</td><td>ビタミンC</td><td>ビタミンD</td></tr>"
while($rows= mysql_fetch_array($result)){
print"<tr><td>".$row["osakana"]."</td>";
print"<td>".$row["vitaminB"]."</td>";
print"<td>".$row["vitaminC"]."</td>";
print"<td>".$row["vitaminD"]."</td></tr>";
}
print"</table>";


よろしくおねがいいたしますm(._.)m
513NAME IS NULL:2012/05/23(水) 15:58:39.00 ID:???
それphpの質問じゃね?
とりあえず「レコードの中で一番でっかい値のヤツを赤色にしたい」にしたいんだろうけど
その場合はまず3つの値を配列に入れるなり、比較関数使うなり比較して、その中の最大値を調べて
printでHTML表記するときその値と一緒だったら赤くしろ

あとhtmlだったら<tr><td><?=$row["osakana"]?></td>ってやったほうがいい
514NAME IS NULL:2012/05/24(木) 14:40:00.44 ID:PlrrbWOV
TSV形式でテーブルをダンプしたいのですが、mysqlサーバとダンプコマンドを実行するのが別のホストなので、
mysqldump -TやSELECT INTO OUTFILEは使えないです。

そこで
mysql -B -e "SELECT ..." > fileでやろうと思ってるのですが、この場合ENCLOSED BYなどの指定は
できないのでしょうか?
TSVでダンプするもっといい方法はありますか?
mysqlはサーバ、クライアントとも5.1.55です。

ちなみに、文字は以下のように変換されるようでした。
TAB→\t
\t→\\t
CR→^M
LF→\n
515NAME IS NULL:2012/05/24(木) 14:44:57.24 ID:PlrrbWOV
×CR→^M
○CR→CR (変換なし。0x0Dのまま)
516NAME IS NULL:2012/05/25(金) 02:10:43.70 ID:Rf8GVzqJ
キャッシュは問い合わせた結果のみをメモリにキャッシュしてるのでしょうか?
ディスクから読み出したデータを、今回使わなかったもの(条件判定に使った列)も含めてキャッシュさせることは可能でしょうか?
517NAME IS NULL:2012/05/25(金) 04:34:02.24 ID:???
>>516
query_cache_sizeは問い合わせた結果のみ。
key_buffer_sizeとinnodb_buffer_pool_sizeは条件判定だけしたものも含む。

意図的にキャッシュを暖めておくのはテクニックとしてときどきやる。
http://www.mysqlperformanceblog.com/2008/05/01/quickly-preloading-innodb-tables-in-the-buffer-pool/
518NAME IS NULL:2012/05/25(金) 17:47:22.36 ID:???
>>517
ありがとうございます。
519NAME IS NULL:2012/05/25(金) 22:12:46.58 ID:+VPI0aJI
>>513
ありがとうございます
if うんちゃらかんちゃらでやってみます
520NAME IS NULL:2012/05/26(土) 11:57:05.90 ID:???
横やり失礼。MySQL再起動してキャッシュが暖まるまで、
アプリが激重(普段0.1秒オーダーで表示される画面が5秒とかかかる)なんだけど、
DB・クエリの設計が糞なのかな。MySQLがそういうもんなのかな?
ちなみに InnoDB のみ使用。
521NAME IS NULL:2012/05/26(土) 12:59:56.17 ID:???
>>520
5秒ってことは画面を出すために数百I/O走ってるってことだから、
糞とまでは言わないけど改善の余地はありそう。

インデックスが最適な張り方になってないとか、
LIMIT、OFFSETの指定がでかすぎるとか。

そういうクエリはスロークエリを出したときに
# ... Rows_sent: 50 Rows_examined: 15000
Rows_sentに比べてRows_examinedが大きい傾向があるので
まずそういうクエリを探してみる。
522NAME IS NULL:2012/05/26(土) 16:33:12.01 ID:VdAzzISV
MySQLのテーブルの基本情報が取得できるかの確認のため一番早そうな select count(*) from テーブル名 を実行してるのですが

count(*)でレコードの数を確認する場合って予めレコード数が登録されているのでしょうか?
それともcountするたびに1個ずつレコードを数えているのでしょうか?
523NAME IS NULL:2012/05/26(土) 19:02:06.63 ID:???
MyISAMの場合は、記録されてる値を参照するだけだから早いらしい。
InnoDBは、いちいち数えてるらしい。
524NAME IS NULL:2012/05/26(土) 19:15:06.22 ID:VdAzzISV
マジっすか、もしやと思い聞いといて正解でした
InnoDBでもテーブルの取得確認するときすばやく簡単に出来る値確認とか無いですかね?
525NAME IS NULL:2012/05/26(土) 19:39:41.81 ID:???
INSERTするたびにどっかに書いとけば?
526NAME IS NULL:2012/05/26(土) 19:49:08.59 ID:???
そもそもテーブルの基本情報の取得って何さ
527NAME IS NULL:2012/05/26(土) 20:11:59.18 ID:???
テーブルが存在するかどうかとか?
ロックされてるかとかそんな感じか?
528NAME IS NULL:2012/05/26(土) 22:56:46.05 ID:???
なんでもいいからtableをセレクトして確認したいってことだろ
529NAME IS NULL:2012/05/27(日) 00:02:35.41 ID:???
じゃあSELECT * FROM unko LIMIT 1でよくね?
530NAME IS NULL:2012/05/27(日) 00:12:19.30 ID:???
俺さぁ、ほかのプログラミングスレで思うんだけど
hogeとかfugeとかxxxとかtestとかaとかって変数名とか使えばいいのにわざわざ
sex unko mankoとかするやつってなんなの?
ああいうの質問に答える気が失せるんだが
531NAME IS NULL:2012/05/27(日) 00:48:30.37 ID:???
いや、もともとhogeってポーランド語でうんこって意味だぞ?
532NAME IS NULL:2012/05/27(日) 02:48:53.70 ID:???
10分間調べちまった
hogが豚でhogeなんっつーもんどこにもなかったぞ
533NAME IS NULL:2012/05/27(日) 03:52:05.73 ID:???
>>530
DT臭い工業高校の生徒さんで、そんな字書くことで射精しているんだから大目に見たりw
534NAME IS NULL:2012/05/27(日) 04:16:41.55 ID:???
就職してから会社で仕事するためにプログラミング学ぶようなヤツじゃない精神年齢が幼いヤツって事だから
そういうヤツが沢山居る方がプログラミング界の未来は明るい
535NAME IS NULL:2012/05/27(日) 20:05:59.97 ID:???
そりゃオンライン辞書に「ビチグソ」なんて口語は載ってないよな
536NAME IS NULL:2012/05/28(月) 10:11:05.44 ID:/y0nTuhH
レコードが下に行くにつれて上のものとの合計を表示させるにはどうすれば良いですか?
例えば結果は以下のような5行
番号, カラムA, カラムB
1, 0, 1
2, 1, 1
3, 1, 1
4, 1, 1
5, 0, 1
で、これを
1, 0, 1
2, 1, 2
3, 2, 3
4, 3, 4
5, 3, 5
といった形で表示させたいのです。
番号はそのままで特定のカラムだけこのような仕様にしたいのですがこれは可能でしょうか?




537NAME IS NULL:2012/05/28(月) 10:27:23.37 ID:???
>>536
サブクエリで自分の番号より上の物をカウントする
538NAME IS NULL:2012/05/28(月) 19:48:56.57 ID:PCvuge+6
MySQLに限らないテーブルの最適化の問題だと思うのですが、質問させてください
あるテーブルにカラム1,カラム2,カラム3,…と複数のカラムがあって、
そのうち一つのカラムの値が何かによって他のカラムの中身の性質が変わるというのはおかしいでしょうか?

具体的に言うと商品販売のサービスで注文状況のステータス用のテーブルなんですが
以下のようなイメージを考えています

注文受注)
ordered, NULL, 2012-05-30 09:10:11 ※カラム2はnull
発送済み)
shipped, クロネコ, 2012-05-30 12:20:30 ※カラム2は配送業者
キャンセル要望発生)
canceled_byBuyer, 1, 2012-05-30 14:05:40 ※カラム2はキャンセル理由

おかしいでしょうか?
539NAME IS NULL:2012/05/28(月) 21:14:04.18 ID:???
>>538
うちの会社のシステムにそういう設計してるDBがあるけど、
性能が出なくて改修するのに大赤字になったからやめたほうがいいよ。
540NAME IS NULL:2012/05/28(月) 22:30:20.94 ID:HBhFDl+H
ブラウザゲームでカラムが
イベントグループ、イベント、そのイベントが起こる確率 といったテーブルがあるとします

例:
group1 event10 50%
group1 event2 30%
group1 event9 20%
group2 event4 100%

いま、プログラム側で乱数を発生させてそれを基に確率のカラムを参照してイベントを選択するような処理をしたいと考えています
このとき同一のイベントグループに属する全ての行を取得すれば所望の処理は実現できますが、確率が細分化されたとき(1%:event3 2%:event6・・)には
それだけ多くの行を取得しなければなりません

そこで乱数発生→それを基にして確率のカラムを参照して一発で対象のレコードを取り出す為にはどのようなテーブル構成が望ましいでしょうか
どなたかご教示願います
541NAME IS NULL:2012/05/28(月) 22:47:13.20 ID:???
イベントグループがそう多くないなら、イベントグループごとにテーブル作る。
カラムはイベントIDだけ。
各イベントの発生確率に応じた比率のレコード数で書き込んでおく。

で、
SELECT ev_id FROM EvGroup1 ORDER BY rand() LIMIT 1






いや、冗談ですけどね。
542NAME IS NULL:2012/05/28(月) 23:20:25.34 ID:???
>>540
selectの速度重視なら確率範囲の上下限を入れとけば?
何万レコードもあるわけじゃないだろうから全部取得しても大して違わないだろうけど。
543NAME IS NULL:2012/05/29(火) 00:33:36.06 ID:KrEU2IUU
>>537
回答ありがとうございます。
すみません、ちょっとよくわからないのですが、簡単に例を書いてもらうことはできますか?
544538:2012/05/29(火) 02:10:52.57 ID:e6byRQIc
>>539
ありがとうございます
カラム2をどんな値が入るかわからない、例えばお問い合わせフォームの自由入力欄と思えば
問題ないのではと思ってたんですがダメなんでしょうか?

このやり方をしないとすると、配送業者テーブル、キャンセル理由テーブルなどが必要になって
insert時のトランザクションや、select時のcase, joinなどなどが発生し重くなるのではという
考えだったんですが…
545NAME IS NULL:2012/05/29(火) 02:31:15.21 ID:BE4Y+zyI
レプリケーション構成でslave自体が更新処理をやっちゃいけないのは分かるんだけれど、
slaveがproxyになって更新クエリをmasterに丸投げするようには出来ないんでしょうか
546NAME IS NULL:2012/05/29(火) 02:32:17.70 ID:???
>>540
ケータイからなんで適当ですが

例:
# group_id event_id ratio_min ratio_max
group1 event10 0 50
group1 event2 50 80
group1 event9 80 100
group2 event4 0 100

SELECT event_id FROM events
WHERE group_id = ? AND ratio_min <= ? AND ratio_max < ?;
547546:2012/05/29(火) 02:35:42.70 ID:???
ごめん、不等号の向きがみすってました。
SELECT event_id FROM events
WHERE group_id = ? AND ratio_min <= ? AND ratio_max > ?;
548NAME IS NULL:2012/05/29(火) 04:07:22.96 ID:JPDfjh3l
id、nameカラムがあるデータベースから
nameカラムだけ順次表示していきたいのですが、
idカラムだけが出力されてしまいます。
どこが悪いのでしょうか?

データベースの構造は以下です
http://or2.mobi/index.php?mode=image&file=33254.jpg
http://or2.mobi/index.php?mode=image&file=33253.jpg

コードです
<?php
$server = "localhost";
$mydb = "test";
$usr = "root";
$pass = "";
$link = mysql_connect($server, $usr, $pass);
$db = mysql_select_db($mydb, $link);

$query = "select id name from homo";
$result = mysql_query($query);

/* 取得、表示 */
$query = "select id name from homo";
$result = mysql_query($query);

while($row = mysql_fetch_assoc($result))
{
printf("<li>%s</li>", $row["name"]); //ここで"name"を指定して取得したいが"id"を取得してしまう
}
?>
549NAME IS NULL:2012/05/29(火) 04:39:33.54 ID:???
>>548
idのあとにカンマが足りない
select id, name from homo
それだと
select id as name from homo
と同じ
550NAME IS NULL:2012/05/29(火) 06:53:56.07 ID:???
>>543
こんな感じ
551NAME IS NULL:2012/05/29(火) 06:54:15.32 ID:???
552NAME IS NULL:2012/05/29(火) 06:55:50.20 ID:???
>>543
たびたびすまん。リンク先のをSUMに変えれば目的は達成できるかと
553NAME IS NULL:2012/05/29(火) 09:01:16.20 ID:???
>>544
SQLというものが教科書どおりのモデルを前提に設計されてるので、
設計の定石を外すと急にシンプルなSELECT文が書けなくなるんよ。

配送業者テーブル、キャンセル理由テーブルを作るのが正しくて、
注文状況テーブルだけで何とかしたい場合でも
配送業者カラムとキャンセル理由カラムを分けて作った方がいいよ。
VARCHAR/TEXTは空ならほとんど容量くわないし。
554NAME IS NULL:2012/05/29(火) 09:46:39.65 ID:dnQr6YFz
サーバのバージョン: 5.5.20
エンジンはInnoDBです

毎日1万件ほどデータを取得して、Perlでマルチスレッドを使ってinsertしているんですが
10件ほどレコードが欠けてしまいます。
>>305あたりのように、ロックをかけないといけないんでしょうか?
マルチスレッドを使わなければ、すべて正常にinsertできることは確認しています
555NAME IS NULL:2012/05/29(火) 10:53:25.48 ID:???
>>554
試してないけど
スレッドごとにデータベースハンドルを分けないとダメなんじゃない?
10スレッドならMySQLに10本つなぐ。

forkのときは分けないと確実にダメって話がある。
http://www.jdcn.co.jp/blog/archives/2011/06/perlforkdbi.php
556NAME IS NULL:2012/05/29(火) 12:06:43.90 ID:JPDfjh3l
>>549
ありがとうございます!おかげさまでうまくいきました
557NAME IS NULL:2012/05/29(火) 14:24:00.79 ID:???
>>555
今こんな感じで、サブルーチン内の最初でDBに接続してる。
スレッドごとに接続できていると思ったんだけど…
Perl側の問題かな?threads_yield?
それとも、キューを得るごとに接続しなおさないといけないのかな?

# キューの生成
my $queue = new Thread::Queue;
$queue->enqueue(1..10000);

# スレッドの生成 (サブルーチン routine を実行するスレッドを10個生成)
my @consume_queue;
for(my $i = 0; $i < 10; $i++) {
push @consume_queue, threads->new(\&routine, $queue);
}

# スレッド実行
foreach my $send_queue (@consume_queue) {
$send_queue->join;
}

# MySQLへinsert等の実行内容
sub routine {
my $queue = shift;
my $dbh = DBI->connect(略);
my $sth = $dbh->do(q|SET CHARACTER SET utf8;|);

while(my $row = $queue->dequeue_nb) {
$sth = $dbh->do(qq|INSERT INTO 略|);
}
}
558NAME IS NULL:2012/05/29(火) 16:52:35.65 ID:???
>>557
データベースハンドルは分かれてるね。
例えばだけどScientific Linux 6でこういう状態なんだけど

$ ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
libmysqlclient.so.16 => /usr/lib64/mysql/libmysqlclient.so.16 (0x00007ffc814ea000)

これもしかしたらスレッドセーフライブラリのlibmysqlclient_rじゃないといかん気がする。
差し替えられる?
559NAME IS NULL:2012/05/29(火) 17:31:35.77 ID:???
>>546
ありがとうございます
大変参考になりました
560538:2012/05/29(火) 18:09:43.68 ID:???
>>553
丁寧なご意見ありがとうございます
もう一度良く考えてみたいと思います
561NAME IS NULL:2012/05/29(火) 22:08:36.94 ID:???
>>558
Winなのでmysql.dllは見つけましたが、libmysqlclientが見当たりません。
これはコンパイルして生成すればいいのでしょうか?
562NAME IS NULL:2012/05/29(火) 22:29:39.67 ID:KrEU2IUU
>>551 >>552
お手数おかけして申し訳ございません。
無事成功しました!
どうもありがとうございます。
563NAME IS NULL:2012/05/30(水) 00:10:37.01 ID:???
>>561
Winならlibmysql.dllがどこかにあってそれでスレッドセーフらしい。
うーん分からなくなった
564NAME IS NULL:2012/05/30(水) 00:26:05.61 ID:???
>>563
ありました。

Perl内とApache内にバージョンの違うlibmysql.dllが入ってるんで
どっちでうまくいくのか試してみます。
うまく行かなければまた来ます。ありがとうございました。
565NAME IS NULL:2012/05/30(水) 12:48:17.73 ID:mokoOBTF
うまくいきませんでした \(^o^)/

10本接続してinsertする際に
2つが同時にinsertしてもMySQLとしては問題無いですよね?
566NAME IS NULL:2012/05/30(水) 19:02:03.40 ID:XRAc8zNk
質問です
MySQLで12345で検索するとき'12345'とINT型のクォートでくくらず12345で検索すると
クォートでくくらない方が数倍早かったのですが

これってINSERTする時に''でくくるか、くくらないかでも後々の検索速度変わったりするのでしょうか?
567NAME IS NULL:2012/05/30(水) 20:20:21.10 ID:???
>>566
あるあるおハマり大事典 - InnoDBなのに行ロックしないの - (ひ)メモ
http://d.hatena.ne.jp/hirose31/20091106/1257493652

コメントも含めて読んだらわかる
568NAME IS NULL:2012/06/01(金) 03:54:24.48 ID:???
せめてオラクルさえ手放してくれればココも活気が出るんだろうけどなぁ
569NAME IS NULL:2012/06/01(金) 08:11:21.95 ID:???
クライアントライブラリをLGPLかBSDにしてくれるだけでもいいのよ
570NAME IS NULL:2012/06/01(金) 08:17:45.01 ID:???
自宅サーバーでMySQL使って金儲けとかできんからね
571NAME IS NULL:2012/06/01(金) 18:18:08.10 ID:???
>>569
さらに通信すればOK
572NAME IS NULL:2012/06/01(金) 21:32:57.94 ID:???
ドライバのLGPL版のクローンとかないのかね
573NAME IS NULL:2012/06/02(土) 07:42:44.90 ID:Nc/647wC
ブラウザゲームなどにおけるフラグ管理テーブルの設計について質問です

1ユーザーにつき、boolean型のデータを200〜300程度格納したいとします
その場合どのような設計が望ましいでしょうか(殆どが参照クエリであるとします)

1. (user_id,flag_no,flag_value)といったカラムで行数を積んでいく
2. (user_id,flag1,flag2,....)といったカラムで非正規化

1だとレコード数が膨大になりそうで、2だと二進十進変換してintで纏めればカラム数も
あまり増えないのではないかと思うのですが色々とまずい気がします
574NAME IS NULL:2012/06/02(土) 07:46:53.34 ID:???
全部同じテーブルじゃないとイカンのか?
ネトゲだったら倉庫、バッグ、装備って分ければいいかなーと思うけど
そんでレコードの容量は1つ7KBぐらいならギリギリだと思う
575573:2012/06/02(土) 08:22:04.80 ID:Nc/647wC
>>574
別々のテーブルに分けた上での一つのテーブルになっています
576NAME IS NULL:2012/06/02(土) 09:21:18.60 ID:???
>>573
「あるユーザのフラグ何番を調べる」という処理がすべてであって、
「フラグ何番が立っているユーザ一覧を出す」という処理が決してないなら、

(user_id INT PRIMARY KEY, flags VARCHAR(200)) にして
SELECT SUBSTRING(flags, 35, 1) FROM user_flag WHERE user_id = 500;

もありかな〜と思った。
DB設計のお作法的には良くないんだけど、今回だけ特別に。
577NAME IS NULL:2012/06/02(土) 18:37:06.06 ID:y6vM1GM3
MySQL verchar型ってあるじゃないですか。
入る文字数を1〜255の間で決めれるじゃないですか?

郵便番号だろうと、名前だろうと、キャッチコピーだろうと
全部255じゃだめなんですか?

今の時代サーバーも高性能、高容量になってるだろうから
1も255も変わらなさそうなんですが。
578NAME IS NULL:2012/06/02(土) 18:51:18.67 ID:???
>>577
通常なら、全部255で問題ない
1億レコード作る気ならちょっと考えるけど
579NAME IS NULL:2012/06/02(土) 19:03:58.14 ID:y6vM1GM3
>>578
きゃあああああああああ
580NAME IS NULL:2012/06/02(土) 19:07:58.03 ID:???
>>577
「実践ハイパフォーマンスMySQL 第2版」P.89のコラムを参照
581NAME IS NULL:2012/06/02(土) 21:43:52.73 ID:???
MySQLのVARCHAR(255)には、InnoDBでutf8の場合に
ユニークインデックスを作れる最大長っていう意味もある。

MySQL 5.5のutf8mb4だとこの最大長が191になっているので、
最近は自分で何か作るときは191にしてる。
582NAME IS NULL:2012/06/02(土) 21:57:23.22 ID:???
ヘェーヘェーヘェーヘェーヘェー
583NAME IS NULL:2012/06/04(月) 23:49:38.26 ID:xJFIjG+I
レプリケーションのスレーブサーバは、複数の別個のサービスのマスターのスレーブとして使えるんですか?
例えば、example1.comとexample2.comがあって、全く別のサービスだけどスレーブは一つにまとめたいということです
バージョンは5.5.25を使っています
それぞれのサービスでデータベース名を違うものをつけていれば大丈夫なんでしょうか
584NAME IS NULL:2012/06/05(火) 02:33:09.58 ID:???
>>583
機能としてはないけど無理やりやっている人はいる。
http://www.slideshare.net/do_aki/20110809-my-sql-casual-talks-vol2

普通はスレーブ一台でもmysqldをポート3306、3307、
datadirを/var/lib/mysql1、/var/lib/mysql2と分けて
複数動かすんじゃないかと思う。
585NAME IS NULL:2012/06/05(火) 02:38:35.91 ID:???
>>583
Masterサーバ1台、Slaveサーバ1台で、その中で
論理データベース2つという事なら可能(負荷/遅延など考慮せず)

Masterサーバが2台、Slaveサーバが1台の場合は
mysql_multi とか使わないとできないんじゃないかな。
うちでは、4台ぐらいの Masterサーバを1台のデータバックアップ用
スレーブに放り込んでるが、mysql_multi を使ってる。

また、MySQLクラスタならマルチソース・レプリケーションが
できるらしいというのは先日の MySQL Webセミナーで聞いた。
586585:2012/06/05(火) 02:46:25.34 ID:???
かぶった(´・ω・`)

そういえば、「MySQLレプリケーション:実践テクニック」で
584 さんが紹介されてる資料みたいな方法でのマルチソース
レプリケーションについて紹介があった。
ただ、同じ論理データベースを作ってしまったりといったトラブルが怖いな...

587NAME IS NULL:2012/06/05(火) 04:55:30.25 ID:???
複合主キーでインクリメントするために
MyISAMってやつでやってるんですけど
量多くなってきたら遅くなったりしますか?
588NAME IS NULL:2012/06/05(火) 08:51:28.90 ID:???
>>587
量が増えたら遅くなるよ
589NAME IS NULL:2012/06/05(火) 16:26:22.39 ID:???
>>587
量が増えても速度に影響は無い
590NAME IS NULL:2012/06/05(火) 18:36:24.35 ID:L8yyqDFy
SELECT a.%(score_col)s AS a_score, b.%(score_col)s AS b_score
FROM %(table)s a, %(table)s b
WHERE a.%(col1)s = %(a_value)s AND a.%(col2)s = b.%(col2)s
AND b.%(col1)s = %(b_value)s
これをmysqlに直したい。
mysqlで2つの値をひとつのテーブルから取得したいのですが、
どのようにしたらいいのでしょうか?
mysql table 2つ取得でぐぐってもでできません。
ヒントください。
591583:2012/06/05(火) 19:38:01.62 ID:???
>>584,585
ありがとうございました
いろんなやり方があるんですね、ちょっとずつ勉強していきます
592590です。:2012/06/05(火) 21:16:08.01 ID:L8yyqDFy
http://www.ueblog.org/blog/entry/collective_2_1/
のdef sim_distanceの関数部分です。
よろしくお願いします。
593NAME IS NULL:2012/06/05(火) 21:25:39.41 ID:???
>>590
そのまま書き下したらいいように見えるけど、何か問題あるんだろうか。
「SQL 自己結合」でぐぐってみてはいかが
594NAME IS NULL:2012/06/05(火) 22:21:39.56 ID:y12/UfnF
内部結合のあるSELECTでLOCK IN SHARE MODEやFOR UPDATEを指定した時、両方のテーブルの該当行にロックがかかるのでしょうか。

例えばこのようなSQLのとき:
SELECT author.id FROM posts p INNER JOIN authors a ON a.id = p.author_id WHERE p.id = ? FOR UPDATE;

ロックは以下の順番でかかるでしょうか。
(1) p.idの行にロック
(2) 次にauthorsの該当行にロック

実行計画による?
595NAME IS NULL:2012/06/05(火) 22:54:29.90 ID:???
>>594
試したら両方のテーブルの該当行にロックがかかった。

順番は、
SELECT sleep(1), author.id FROM posts p ...
という感じでゆっくりロックしつつ別のセッションからいろいろ突っついてみると、
アクセスした順番にロックがかかっているように見える。よって実行計画による。
オプティマイザの機嫌次第でデッドロックが起きるねこれは
596NAME IS NULL:2012/06/06(水) 00:30:04.47 ID:???
>>595
検証していただき、ありがとうございます!
どうやら本番のコードでは避けた方が無難のようですね。
大変助かりました。
597NAME IS NULL:2012/06/06(水) 01:27:39.26 ID:V1og8Iw1
テーブルというのはどういう基準で分けるんでしょうか?
例えば2chを例にすると、
カテゴリ>板>スレッド>レス
とそれぞれ内包される関係になると思います(toroなどの鯖は今はおいておきます)

それぞれ、
カテゴリ、板
板、スレッド
スレッド、レス
というテーブルを作ったほうがいいのでしょうか
それとも、
カテゴリ、板、スレッド
と3つ共存するようなテーブルを作ってしまってもいいのでしょうか
598NAME IS NULL:2012/06/06(水) 01:33:02.79 ID:???
テーブル→多くて数十個まで
板毎にテーブル-------レス情報
               レス情報
               レス情報
板毎にスレッドテーブル-----スレタイ
                  スレタイ
                  スレタイ

俺だったらこうする
599NAME IS NULL:2012/06/06(水) 09:06:13.96 ID:emn2VUKP
-----------------------------------------
メインテーブル
-----------------------------------------
ユニークID
スレッドID → スレッドテーブルとリレーション
板ID → 板テーブルとリレーション
レス番号
書き込み日時
あぼーんフラグ
名前
Email
書き込み内容
ホスト

-----------------------------------------
板テーブル
-----------------------------------------
板ID
板名

-----------------------------------------
スレッドテーブル
-----------------------------------------
スレッドID
スレッド名
600NAME IS NULL:2012/06/06(水) 11:20:49.18 ID:V1og8Iw1
>>598-599
ありがとうございます!
601NAME IS NULL:2012/06/06(水) 16:53:18.10 ID:V1og8Iw1
主キーであるidカラムに、デフォルトで
CURRENT_TIMESTAMPをint型で入れたいのですがうまくいきません
どうしたらいいんでしょうか
http://www.dotup.org/uploda/www.dotup.org3063320.jpg
http://www.dotup.org/uploda/www.dotup.org3063324.jpg
nullに関するエラーが出たのでオンオフしてみましたが、結果は同じでした
602NAME IS NULL:2012/06/06(水) 19:55:23.17 ID:???
CURRENT_TIMESTAMP を int型にしたいって、、一体なにをしたいんだ?
603NAME IS NULL:2012/06/06(水) 20:00:44.61 ID:???
わけわからんなw
エスパーするとunixタイムスタンプにしたいとか?
604NAME IS NULL:2012/06/06(水) 20:07:33.77 ID:V1og8Iw1
>>602-603
全然分かってなくてすいません
unix時間をIDにしたいのです
2chのスレ番号みたいな感じです
http://toro.2ch.net/test/read.cgi/db/1322402682/
でいうと1322402682です
605NAME IS NULL:2012/06/06(水) 20:49:31.48 ID:???
まず、current_timestampが返す型はtimestamp型だ
この関数はデフォルト値には使えるが当然カラムがなかなか無茶苦茶な発想に見えるのだが
timestamp型じゃないとダメ。
なのでここでまず無理
逆に言えば通常の関数はデフォルト値には使えない。

デフォルト値はあきらめたとしてさらにintにしたいんだろ?
unixタイムスタンプというのは一秒単位なわけで、
current_timestampよりはかなり精度が落ちる
ということは情報を切り捨てなけりばならないか、datetimeのnow関数を元の値にして unix_timestamp関数で更新時に埋め込んだとする。

しか主キーと言うことは当然ユニークでなければならないが、一秒単位でかぶらないという保証はあるの?
ていうか、かぶったらエラーにしたいってこと?
なかなか無茶苦茶な発想に見えるのだが、
なぜシーケンスじゃダメ?
なぜ主キーじゃないとダメ?
なぜunixタイムスタンプ?
606NAME IS NULL:2012/06/06(水) 21:35:42.75 ID:???
>>601
試行錯誤した結果、
create table t (c1 timestamp primary key default current_timestamp);
なら作れる。

でもみんなが言うように、普通は
create table t (id int primary key auto_increment, updated_at timestamp);
create index t_ix1 on t (updated_at);
ってやると思う。
607NAME IS NULL:2012/06/06(水) 22:52:30.85 ID:V1og8Iw1
>>605
ありがとうございます。
想像以上にややこしいようで、すいませんでした

まずは、慣れ親しんだ2chモドキを作ってみたいというのが大元でした
大昔に2chブラウザも作ったことがあるので、ちょっとぐらいは理解しているというのもあり、
またゴールがみえているのでとりあえず真似して作ってみたいと思いました。

>なぜシーケンスじゃダメ?
これもすいません、質問の意味があまりわかっていないです。
しかし、主キーにせざるを得ない状況、というの物はありません。
>なぜ主キーじゃないとダメ?
>なぜunixタイムスタンプ?
時間は必ず加算され続けるので、一意にならない
仮になったとしても、それはそれで得るものがあるかなと思いました

スレ番号がunix時間とのことだったので調べたところ、
intにすればそこそこ

真似してみようと思ったのですが、
もしかして主キーはunix時間じゃないのでしょうか
608NAME IS NULL:2012/06/06(水) 22:58:24.18 ID:V1og8Iw1
すいません、かきこんでしまいました・・・

>なぜunixタイムスタンプ?
時間は必ず加算され続けるので、一意にならない
仮になったとしても、それはそれで得るものがあるかなと思いました
後は書き込み時間と主キーが同じなら、
書き込み時間をカラムとして保存するよりもデータ圧縮にもなるかな?と思ったのです

スレ番号がunix時間とのことだったので調べたところ、
intにすればそこそこ早いというので試してみたかったというのもあります

後は2chを全体的に真似してみようと思ったのですが、
もしかして主キーはunix時間じゃないのでしょうか

やはり主キーは普通に1から順にして、auto_incrementにすべきでしょうか
609NAME IS NULL:2012/06/06(水) 23:23:01.43 ID:LDzCDyQv
質問です
あるテーブルにPHPで作ったアプリケーションから単純なselectを実行してるんですがエラーになります
同じselect文をphpMyAdminのクエリ機能でクエリするとエラーにならず結果(該当レコードなし)が返ります

PHPアプリでのエラー
object(Zend_Db_Statement_Exception)#169 (8) { ["_previous":"Zend_Exception":private]=> NULL ["message":protected]=>
string(96) "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'sample.'api_twitter'' doesn't exist"

ターミナルから直接mysqlのテーブル一覧を見ると、該当テーブルは存在しています
mysql> show tables;
+-----------------------+
| Tables_in_sample |
+-----------------------+
| api_twitter |


どんな原因が考えたら良いんでしょうか。すみませんがよろしくお願いします
610609:2012/06/07(木) 00:44:06.79 ID:???
ごめんなさい、自己解決しました
PHPの問題でした
611NAME IS NULL:2012/06/07(木) 08:41:17.02 ID:???
>>608
普通主キーは安定したものにする
レコードが特定出来るように
2chはファイルで管理してるからキーも何も
612NAME IS NULL:2012/06/07(木) 13:52:07.12 ID:???
CSVを定期的にMySQLへインポートしているのですが、次のようにしています。

作業用テーブル作成 → 作業用テーブルにガリガリINSERT → 運用中のテーブルをリネームor削除 → 作業用テーブルを本運用テーブル名にリネーム

この際、当然ながら 0.001秒くらいテーブルが存在しなくなる時間が存在しており、ごく稀にこの空白時間にひっかかる事があります。

シームレスにテーブルを入れ替えることってできるでしょうか?
613NAME IS NULL:2012/06/07(木) 14:46:56.98 ID:???
rename table A to B, C to A
で出来るみたいだけど
614NAME IS NULL:2012/06/07(木) 15:28:28.12 ID:???
なんでcsvを直接本運用テーブルに入れないの?
615NAME IS NULL:2012/06/07(木) 20:52:30.00 ID:???
>612
CSVファイルとインポート先テーブルの列構造が同じなら、
-----
1.空のテーブルをCSVエンジンで作成
2.インポートしたいCSVファイルを出来たhoge.CSVに上書き
3.FLASH TABLE;
4.ALTER DATABASE hoge ENGINE=InnoDB;
5.RENAME TABLE target_db TO sute_db, hoge TO target_db;
6.DROP TABLE sute_db;
-----
みたくすると、多分一番速くてリソースも使わない
616615:2012/06/07(木) 20:53:41.79 ID:???
間違った
>4.ALTER DATABASE hoge ENGINE=InnoDB;
ではなく
ALTER TABLE hoge ENGINE=InnoDB;
617NAME IS NULL:2012/06/08(金) 11:19:01.25 ID:???
インポートしたいCSVファイルをCSVエンジンでいきなりテーブルAとする。
挿入先テーブルをMとして、

INSERT INTO M (中略) SELECT (中略) FROM A (後略)

で、なんかマズい?
618NAME IS NULL:2012/06/08(金) 19:25:46.83 ID:v3PjVOwl
あるでデータがCSVで落とせるのですが、
時間がないので、
本来リレーションさせる系のデータも
そのまま生でvarchar型等で挿入してしまっても
大丈夫ですよね??
いちおー落ち着いたら、前データを数字に置換し
リレーション型にしようかと思ってます。
619NAME IS NULL:2012/06/08(金) 19:38:41.51 ID:???
後からマイグレーションするの?
自分でケツ拭くつもりなら、まぁいいんじゃない
時間がなくてもER図くらいは描いといたほうがいいと思うけどね
620NAME IS NULL:2012/06/09(土) 06:12:23.48 ID:???
PHP Error(USER): [DB Error] : message="DB Error: unknown error" info="INSERT INTO
`M_user`(`regist_datetime`,`update_datetime`,`user_mailaddress`,`user_type`,`user_password`,`user_status`,`user_ua`,`user_device`)
VALUES(NOW(),NOW(),'[email protected]','NO','1234',1,'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko)
Chrome/19.0.1084.52 Safari/536.5','PC'); [nativecode=1213 ** Deadlock found when trying to get lock; try restarting transaction]" in
/home/prj/101/contents/private/lib/magicwork/DBO.php on line 227

ユニクロのDBエラーw
http://www.uniqlo-cool.com/
621NAME IS NULL:2012/06/09(土) 07:54:56.29 ID:???
>620
メアドぐらいマスクしろよ…

INSERTでデッドロックってどうやったらかかるんだ?
トリガで何かやってんのかね?
622612:2012/06/09(土) 11:12:39.85 ID:???
CSVをPHPで選別・加工しまくって入れてるので。カラムもレコードもまるで違います。
(元のCSVが2GB、そこから作るInnoDBが100MBなレベル)

あと、削除分もあるので運用中のテーブルにREPLACEするだけではだめなんです。
(テーブルに更新用フラグ作って、立ってないレコードを一括DELETEとかでもできるでしょうけど)
また運用テーブルをリネームしてどけることで、一世代分のバックアップもかねてます。

>>613 の方法が一番ベターみたいですね。さっそく試してみます、ありがとうございます。
623NAME IS NULL:2012/06/09(土) 15:28:03.44 ID:???
一番ベターって何?
624NAME IS NULL:2012/06/09(土) 18:15:08.08 ID:???
the betterest
625NAME IS NULL:2012/06/09(土) 18:17:54.54 ID:???
Better than the Best!
626NAME IS NULL:2012/06/10(日) 10:14:31.71 ID:???
god better best
って先週学校でやった
627NAME IS NULL:2012/06/10(日) 18:15:07.19 ID:???
Godじゃあしゃーなしだ。
628NAME IS NULL:2012/06/10(日) 19:57:52.49 ID:???
good goodder gooddestと習ったが
629NAME IS NULL:2012/06/10(日) 20:49:26.40 ID:???
God Godder Goddest
630NAME IS NULL:2012/06/10(日) 21:30:31.13 ID:Y4HpMp2i
substrまたはsubstring関数で文字列を切り抜くと、文字列末が文字化けします。
どうすればいい?
631NAME IS NULL:2012/06/11(月) 08:29:12.26 ID:???
>>630
クライアントとサーバの文字コードの違いかな

試してないんで全く分からずに書いてるけど、
クライアントとサーバの文字コードを一緒にしてみるとか。
それが無理なら、クライアント側でサーバの文字コードを認識するような工夫がいるんだと思う。
SQL文でPHPのmb_substrみたいなのがあればいいんだろうけど、知らないんでごめん
632NAME IS NULL:2012/06/11(月) 12:04:35.44 ID:???
さんきゅ!
いろいろためしてみるー
633NAME IS NULL:2012/06/11(月) 19:14:49.39 ID:LWqiz9+D
基本的なことですいません、教えてください
社員のデータベースを作り、色々なことに使おうと思うのですが
東京だけselectで抜き出し、社員番号を1から順に振り直す、というようなことはできますか?

社員番号 支店 名前
1 東京 山田
2 大阪 田中
3 東京 山本
4 東京 佐々木
5 大阪 神埼
634NAME IS NULL:2012/06/11(月) 19:16:30.74 ID:LWqiz9+D
用途は社員旅行等、他愛のないものなのですが
歯抜けだと不便なので補完したいのです。
それとも表計算ソフトなどで加工したほうが早いでしょうか
635NAME IS NULL:2012/06/11(月) 19:18:22.07 ID:???
1 東京 山田
2 東京 山本
3 東京 佐々木
4 大阪 田中
5 大阪 神埼

こうしたいこと?
636NAME IS NULL:2012/06/11(月) 19:20:58.90 ID:LWqiz9+D
こんな感じです。
1 東京 山田
2 東京 山本
3 東京 佐々木

1 大阪 田中
2 大阪 神埼
637NAME IS NULL:2012/06/11(月) 21:21:24.96 ID:???
テーブルの中身を更新したいのか、表示のときだけ連番を振りたいかによって異なる。
表示のときだけ連番を振るのはこんな感じ。

mysql> set @id = 0;
mysql> select @id := @id + 1, job, ename from emp where job = 'salesman' order by ename;
+----------------+----------+--------+
| @id := @id + 1 | job | ename |
+----------------+----------+--------+
| 1 | salesman | allen |
| 2 | salesman | martin |
| 3 | salesman | turner |
| 4 | salesman | ward |
+----------------+----------+--------+
638NAME IS NULL:2012/06/11(月) 21:33:56.93 ID:???
クエリ一本でお望みの結果いけるぜ
window関数案件だが、mysqlはwindow関数無いからどうしてもループが多くなって、たくさんの行の解析には向かないけどな。

お家帰ったら書き込むから待っとれ
639NAME IS NULL:2012/06/11(月) 21:36:25.98 ID:LWqiz9+D
>>637
ありがとうございます!
>>638
ワクワクテカテカであります
640NAME IS NULL:2012/06/11(月) 22:12:22.76 ID:???
帰ったぜ。
empid | br_name | name
-------+---------+--------
0 | 東京 | 山田
1 | 東京 | 山本
2 | 東京 | 佐々木
3 | 大阪 | 田中
4 | 大阪 | 神崎
とする。
で、求めたい支店毎の社員idをbr_empidとする。
select
empid
,br_name
,name
,(
select
count(*)
from
emp b
where
b.br_name = a.br_name
and b.empid <= a.empid
) as br_empid
from
emp a
order by
br_name
,br_empid
,empid
な感じで、相関クエリにしちゃえばOK。
意外と簡単。
order byとかは好きにしてくれ。
641NAME IS NULL:2012/06/13(水) 17:58:30.86 ID:exJuEynU
Perlを長年やってきたのですがphpに乗っかろうと思い、MySQLの入門書を二冊ほど読んでphpと連動して使うようになったのですが
POSTされてきた文字列をINSERTするにあたって、ただ入れるだけの場合

$_POST['name']をmysql_real_escape_stringでエスケープするのみで
INSERT INTO `table` SET `id` = '.$_POST['name'].'
とクォートでくくるだけでセキュリティ上本当に大丈夫なんでしょうか?

htmlに関してのエスケープは入れるときではなく取り出す度にやろうと思いまして
642NAME IS NULL:2012/06/13(水) 23:23:01.19 ID:???
>>641
「安全なSQLの呼び出し方」を読もう。
http://www.ipa.go.jp/security/vuln/websecurity.html
643NAME IS NULL:2012/06/17(日) 09:34:18.86 ID:???
よろしくお願いします。 centOS6、mysql5.5.25です

現在初めてレプリケーションを実装して動かしているんですが
スレーブに対して実行してるselectが凄く遅くて困っています
マスタ(=アプリケーションサーバ)に同じことをする場合に比べて4倍くらい時間がかかっています

両方とも同じローカルネットワークにあり(マスタ:192.168.0.11、スレーブ:192.168.0.12)、
物理的な距離の問題?などないはずですが、マスタサーバで
ping 192.168.0.11 と ping 192.168.0.12 したとき、後者は前者の4,5倍の時間がかかっています

これはどうしようもないんでしょうか? 解決方法などあればご意見お願いします
また、実際にどこかのレンタルサーバを借りて同じことをした場合、もっと時間がかかるんでしょうか
644643:2012/06/17(日) 09:35:18.95 ID:MPnMohdg
ごめんなさい、あげさせてください
645NAME IS NULL:2012/06/17(日) 10:22:19.10 ID:???
pingで違うって自分で書いてるんだから、MySQLと全然関係ないやん。
646NAME IS NULL:2012/06/17(日) 10:32:48.87 ID:???
そうだね、あってんじゃん
647NAME IS NULL:2012/06/17(日) 11:41:35.45 ID:3UmA6AnU
実はディスクがRAID1
648643:2012/06/17(日) 11:57:18.75 ID:MPnMohdg
>>645
どうもありがとうございます、すみませんがもう少し聞かせてください
きっとここにいる人は今回の例のように「レプリケーションを組んでselect系の処理はスレーブに任せる」
という作業はしたことある人が多いと思うんですが、
その時、別端末のスレーブへの問い合わせがマスタ(兼アプリケーション)への問い合わせより
全然遅いというのはざらにあることなんでしょうか?

僕のネットワークやサーバの設定が特別に酷くてこんなに差が出てるのか、
端末をまたぐ以上不可避の問題なのか知りたいです

mysqlに直接関係なくて申し訳ありません
レプリケーションの設定マニュアルやクエリ振り分けのハウツー解説サイトは見たものの
実装後のこういう問題については見つけられず、スレーブ対象で
たった10行のテーブルから1行selectする処理で5秒かかっていて困っています
649NAME IS NULL:2012/06/17(日) 12:50:45.62 ID:???
エスパーするとskip-name-resolve
650643:2012/06/17(日) 13:57:47.92 ID:???
>>649
ありがとうございます! 解決しました!
651NAME IS NULL:2012/06/17(日) 14:08:19.49 ID:???
やっぱDNSか
652NAME IS NULL:2012/06/17(日) 15:38:45.99 ID:???
たまにはエスパーしてみるもんだな
653NAME IS NULL:2012/06/17(日) 16:22:04.23 ID:???
PHPでMySQLから文字取得して表示するときに文字化けします。
全部SJISに設定しているはずですが、実際にはUTF-8で出力されちゃいます。
MySQLから取得した文字以外は正常にSJISで表示できてます。

Linux fedora15
MySQL 5.5.23
PHP 5.3.13

MySQLは
character_set_filesysytem=binary
character_set_system=utf8
以外全部sjisで、my.cnfでもsjisにしています。
PHPはmbstring.internal_encording等SJISにしてます。
654NAME IS NULL:2012/06/17(日) 17:39:51.69 ID:???
655NAME IS NULL:2012/06/17(日) 17:46:05.57 ID:???
>>654
mysql_set_charset()もPHPに記述しましたがダメでした・・・
656NAME IS NULL:2012/06/17(日) 17:54:27.51 ID:2N1SRC0A
質問させてください。
MySQL+PHPで1週間のスケジュール表を作っています。
ユーザーのテーブルは既に作成済みでuseridが割り振られています。
スケジュールのテーブルはどのように作ったら良いでしょうか?
657NAME IS NULL:2012/06/17(日) 18:59:22.01 ID:???
php-mbstringをインストールしていなかったのでインストールしました。
でもやっぱり文字化けするので、
MySQLから取得する毎にmb_convert_encorfing("$ros[""]", "sjis", "auto")で正しく表示されました。
でも根本的に解決できてない…
658NAME IS NULL:2012/06/17(日) 20:31:11.82 ID:???
DB設計のスレって即死したまま?
659653:2012/06/17(日) 21:39:31.58 ID:???
解決しました。
全ての環境をSJISに設定する前にDBに登録していた文字列がUTF8だったために文字化けしていました。
でもMySQLの環境をSJISにしちゃうとLinuxの端末はUTF-8ですしいろいろやっかいなので、
PHP側でいちいちmb_convert_encortingかけてやったほうがよさそうですね。
これだからケータイサイトは…
どうもお騒がせしまいた。
660NAME IS NULL:2012/06/17(日) 23:56:48.20 ID:???
ケータイ側に出すとこ、〜から受取るとこで変換するのが定石だと思ってたぜ、俺。
661NAME IS NULL:2012/06/18(月) 00:36:47.04 ID:xQyQkINj
id | date1 | date2 | mesg1 | mesg2
----------------------------------
01 | 06-19 | 06-20 | xxxxx | yyyyy
02 | 06-18 | 06-19 | aaaaa | bbbbb

このようなテーブルがあります。
date(1,2)の06-19がdate1ならmesg1を
date(1,2)の06-19がdate2ならmesg2を
取り出してmesgでソートしたい。
つまりこの場合id02を先頭に持ってきたい。

WHERE (date1 = '06-19) OR (date2 = '06-19)
で06-19を取り出してどうやってORDER BYすると良いでしょうか?
下らない質問ですがよろしくお願いします。
662NAME IS NULL:2012/06/18(月) 00:45:08.15 ID:???
>>659
skip-character-set-client-handshake入ってない?
入りと出でキャラクタセットが異なるならこのパラメータは外す必要がある
663NAME IS NULL:2012/06/18(月) 20:59:55.77 ID:???
>>661
マルチ
664NAME IS NULL:2012/06/18(月) 21:01:43.96 ID:???
>>663 ごめん勘違いだった
665NAME IS NULL:2012/06/18(月) 23:55:04.38 ID:???
ごめんで済むとかないわ
とりあえず脱いでもらおうか
666NAME IS NULL:2012/06/19(火) 08:52:22.71 ID:???
昨日からずっと靴下だけなんだがどうすれば
667NAME IS NULL:2012/06/19(火) 11:54:41.64 ID:dMnsFLWZ
会員登録機能付きポータルサイトを作成してるんですが、
ポータルサイトのデータのテーブルは、あれとこれとリレーションして・・・
とつながっていくんですが、
会員登録情報のテーブルがどことも繋がらず孤立してます。
こういうものですか?
668NAME IS NULL:2012/06/19(火) 12:49:06.19 ID:???
>>667
じゃあ会員登録要らないじゃん。
個人情報集めたいだけ?

だれがなにしたとかのビッグデータが最近のはやりだろうがー
669NAME IS NULL:2012/06/19(火) 13:36:55.85 ID:lfWzwZwu
>>667
分析や広告に利用する
パスワードリマインダーとかにも
使わないなら無くていいかと
670NAME IS NULL:2012/06/19(火) 13:57:59.13 ID:???
ログインのためだけに使うなら孤立して当然じゃないの
671NAME IS NULL:2012/06/21(木) 05:57:06.76 ID:GhITmyrm
質問です。
スペックが低めのvpsでwebアプリのバックエンドとしてmysql動かしたいんだけど
レコード数が7000万くらいあってindexもつけてるので、insertに時間がかかりすぎる、一日経っても終わらない感じ
んで僕のローカルPCでやると数時間で済むから、
ローカルでやってからmysqldumpしてそれをvpsに送ってロードしようと思った
でもmysqldumpってインデックスは保存してくれない?みたいで、ダンプファイルからのロードもなかなか終わらない感じがした
mysqldumpのダンプファイルにインデックスまで保存する方法はありますか?
又は他の方法があれば教えてください。
いろいろググってみたけれども普段簡単なselect文くらいしか使わないにわかだからさっぱりだった
mysqldumpに--skip-disable-keysをつけるとダンプファイルをロードした後にindexつけてくれるよ!ってあったけど
ロード中につけるのと後につけるのとでそれぞれ何が嬉しいのかもさっぱりわからなかった
ちなみにお仕事じゃなくて個人の趣味でやっとります
672NAME IS NULL:2012/06/21(木) 13:35:39.37 ID:???
かいけつしました。
http://d.hatena.ne.jp/ichii386/20070924/1190610994
ここを参考にしました
673NAME IS NULL:2012/06/21(木) 13:36:31.21 ID:GhITmyrm
671=672
674NAME IS NULL:2012/06/22(金) 11:48:12.85 ID:pbtRwu58
MySQL.com のアカウントを削除することは可能でしょうか?
インストールの際にアカウントを作成する必要がないということを後から知りまして、
不要なアカウントが増えたことに気分が悪い状態です
675NAME IS NULL:2012/06/22(金) 23:04:13.99 ID:Cn9YFSwo
行数と列数は固定値ではなく随時追加削除が可能な2次元の表があります
行や列に位置情報は持たせず1件でも更新があれば
クライアントで現在の表のデータをまとめDBで全件更新するシステムを考えてます
1件でも行や列に作用があったら表の全データをDBに送り
一度表に関連する行と列を全てdeleteしinsertしなおすという手法を考えてます
当然行や列が増えるとやばそうなことになるのですが
こういうシステムってありだと思いますか?
さすがに列値の更新と行の削除ならそこまでしなくても大丈夫ですが
676NAME IS NULL:2012/06/23(土) 02:06:17.77 ID:???
RDBで、カラム数可変ってのはどうなんだろな。
やり始めの頃に「欲しいな」と思ったことは無くは無いけど。

つか、毎度毎度全書き換えするんだったら、
全書き換えの際の元になるファイルをそのまま使えばいいじゃん。
どうしてもDBも絡ませたいなら、キー情報とそのファイル内への
ポインタ情報だけDBに持たせとくとか。
677NAME IS NULL:2012/06/23(土) 03:05:34.62 ID:???
おっしゃるとおりなのですが表としてのみつかうわけではないので
表を作ってしまうというのはできず・・・
かといって全更新でないと色々と実装が大変で困ったものです
678NAME IS NULL:2012/06/23(土) 06:50:56.75 ID:???
>>675
MySQLをやめて最近の列指向DBの採用だな
679NAME IS NULL:2012/06/23(土) 11:47:15.78 ID:EwT5t8nA
UNIQUE制約つけると自動でインデックスが作成される的なことを吹きこまれて???状態だったのですが
一意を保証するUNIQUE制約と
CREATE INDEXのUNIQUEインデックスって別物ですよね?
UNIQUE制約つけてる場所にCREATE INDEXでインデックス貼っても無駄にならないですよね?
680NAME IS NULL:2012/06/23(土) 18:31:44.94 ID:???
ユニーク制約かけてるカラムに、さらにcreate indexでユニークのインデックス作るの?
無駄だと思うよ。
ユニーク制約かけた時点で自動的にユニーク用のインデックスが作られるわな。
681NAME IS NULL:2012/06/23(土) 20:24:27.51 ID:???
>>680
ありがとうございます
UNIQUE制約つけるとインデックスも作成されるという
吹き込まれたことは正しいことだったんですね
682NAME IS NULL:2012/06/23(土) 21:19:18.43 ID:VC/yQrwj
>吹き込まれたことは正しいことだったんですね


吹き込んだ奴が常日頃信用されていない事がよく分かるレス
683NAME IS NULL:2012/06/23(土) 21:54:32.57 ID:???
あほかい
自分で確認くらい出来るだろうに
684674:2012/06/24(日) 02:07:06.96 ID:8bK9xUPQ
精神が侵されるぅううううううううううううううううううううう!!!!!
685NAME IS NULL:2012/06/26(火) 11:07:08.36 ID:???
いええええええええええええええええええい!!!!!!
686NAME IS NULL:2012/06/30(土) 03:38:07.08 ID:U8O6meg/
var5.5でレプリケーションの勉強をしてるんですが、マスタの内容がスレーブに反映されないエラーが起きました
当初事態を把握できず、5回ほどinsertを繰り返してスレーブのログを見たり show slave status \G;して
Slave_SQL_RunningがNOになってるのに気づいたのでした
それで、SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;したものの回復せず、次に
my.cnfにslave-skip-errors=1062と記述し、サービスを再起動してそのあとに実行したinsetは反映されました(Slave_SQL_Runningも正常になった)

ここで質問なのですが、
「SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;を5回繰り返す」にせよ「my.cnfにslave-skip-errors=1062と記述して再起動」にせよ
最初のエラーが発生したあとのSQLのリクエストはすべて無視されてしまうんですよね?
(マスタで5回insertしたのに、スレーブにはその分のデータがなかった)
そうだとすると、とりあえず動くようにするというだけで全然レプリケーションの意味がない気がします
エラー発生後のリクエストを順に実行して整合性を保つ方法ってないんでしょうか?
どうやったら良いんでしょうか、ご意見お願いします
687NAME IS NULL:2012/06/30(土) 04:16:07.51 ID:???
masterのMySQL止めてデータをslaveに移してから
レプリケーション再開したら直るけど、master
動かしながらやる方法は知らない
688NAME IS NULL:2012/06/30(土) 05:57:48.25 ID:???
>>686
折を見てスレーブ再構築するしかないよ。
あとbinlog_format = mixed試してみて。
689NAME IS NULL:2012/06/30(土) 09:58:23.14 ID:OoZcXmth
世の中のマスターってそんなに簡単に止められるものなの?
うちのマスターは夜中でも止められない。
マスター止めるかお前が辞めるか好きな方選べみたいなノリすらある。
690NAME IS NULL:2012/06/30(土) 11:36:18.22 ID:???
MySQLのバックアップ方法で質問ですが、現在はAutoMySQLBackupを使って一端固めて
それを外部からrsync使ってバックアップしていますが、もう少し効率的なバックアップ方
法ってありますでしょうか?
ちなみに、これとは別にリプリケーションによる障害対策は行っています。
691NAME IS NULL:2012/06/30(土) 14:40:58.44 ID:???
>>689
スレーブ再構築はマスタとめなくてもできるよ
InnoDBしか使っていなければ
692NAME IS NULL:2012/06/30(土) 14:42:42.65 ID:???
>>690
LVMスナップショットでやる方法もあるけど、
実績重視で特に変更しなくてもいいと思う
693NAME IS NULL:2012/06/30(土) 17:22:03.72 ID:k0CJivDe
BOOLEAN MODEでの後方一致検索のやりかたを教えてください。

たとえば、hogeを検索するのに、
select word from wordList WHERE MATCH (word) AGAINST ('hog*' IN BOOLEAN MODE);
だと検索にかかるのですが、

select word from wordList WHERE MATCH (word) AGAINST ('*oge' IN BOOLEAN MODE);
だと検索に失敗します。

最終的にLIKEと同じような使いかたができることを確認したいのですが。。
select word from wordList WHERE MATCH (word) AGAINST ('*og*' IN BOOLEAN MODE);
694NAME IS NULL:2012/06/30(土) 20:28:35.53 ID:???
>690
スレーブを止めて好きな方法でバックアップする。
STOP SLAVEでレプリケーションだけとめてmysqldumpでもいいし、
サービス自体とめてファイル単位のバックアップソフトでもいい

マスタからバックアップを取りたいなら、--master-dataオプション付でmysqldump
#こっちは>689にもいえるかな
オプションでつける数字は
・バイナリログ使って最新まで復旧させたい:1
・別のデータベース名でリストアするかもorレプリケーションできなくていい:2
で設定しておけば、まず大丈夫
695694:2012/06/30(土) 20:33:49.79 ID:???
あ、後半のmaster-dataは全テーブルがInnoDBの場合限定ね
696NAME IS NULL:2012/06/30(土) 21:38:24.80 ID:???
>>868
slave-skip-errorsは
"このエラーでレプリケーションに失敗しても、その行を無視してレプリケーションを続行"だから、
その設定なら1062(一意制約違反)以外のエラーならスキップされない。

あと、レプリケーションが止まるのは"何度リトライしても絶対に反映できないエラー"の時で、
ロックのタイムアウトとかは勝手にリトライするから大丈夫。

後から来たデータが正しいか前からあったデータが正しいかは基本的に判断できないけど、
常に前からあったデータが正しいと仮定して動作させるのがslave-skip-errorの動作。
697NAME IS NULL:2012/06/30(土) 21:42:11.51 ID:???
>>693
後方一致は指定できない。
セパレートされた単語でしかHITさせないのがmatch .. against。
698NAME IS NULL:2012/07/01(日) 02:44:10.54 ID:???
>>692
>>694
なるほど、ありがとうございました。
リプリケーションのDBはスレーブに関しても止めたくないので、現状で
このままで行こうかと思います。
とはいえ、そろそろDB自体がかなり大きくなっているので、杉のステージ
にする必要が出てきたような気もします。
699NAME IS NULL:2012/07/01(日) 02:44:44.80 ID:???
>杉のステージ
>次のステージ
失礼しました。
700693:2012/07/01(日) 11:52:46.76 ID:???
>>697
>セパレートされた単語でしかHITさせないのがmatch .. against。
ありがとうございます。
LIKEと同じ使いかたが出来ないと分かりました。

しかしセパレートされた単語の後方一致も不可となると、
ひどく使いにくい気がするのですけれども、そこは(何らかの方法で)セパレートを増やすしかないですか。
701NAME IS NULL:2012/07/02(月) 14:35:12.28 ID:???
>>700
日本語だと単語境界が上手く判定しづらいってことで、
2文字ずつにトークナイズするのが主流っぽい。

プラグインを入れられる環境ならmroongaを使えば、特にSQLをいじらずにその辺を上手くやってくれるらしい。
ただしよく落ちると知り合いが嘆いてる。

SQLを書き換えても良いなら"MySQL 転置インデックス"でググるとヒントがあるかも。
ただしすごく重いと知り合いは嘆いてる。

俺はどっちも試してない。。(´・ω・`) ごめんよ。
702NAME IS NULL:2012/07/03(火) 21:32:54.68 ID:???
>>701
ありがとうございます。参考になりました。
703NAME IS NULL:2012/07/03(火) 21:55:19.40 ID:yHAOcDp7
以下のようにitem_id=3と2のときの上に来るように、
ソートに例外条件を追加したいのですが、
条件数が増えたときに、もっと簡単に記述する方法はないでしょうか?

SELECT item_id, use_count FROM countTable order by
(CASE WHEN item_id = 3 THEN 1 ELSE 0 END) DESC,
(CASE WHEN item_id = 2 THEN 1 ELSE 0 END) DESC, use_count DESC

item_id use_count
3 5
2 7
1 12
4 10

一般的に、条件数が十個くらいなら、こういう書き方してもそれほど負荷にはならないものなのでしょうか?
704703:2012/07/03(火) 22:08:02.90 ID:???
すみません。それと、item_id = 3, 2はこの順番になるようにしたいです。
(CASE WHEN item_id = 3 or item_id = 2 THEN 1 ELSE 0 END) DESC
と書ければすこしはマシになるのですが。
705NAME IS NULL:2012/07/04(水) 10:02:33.52 ID:???
>>703
並べ替え用の条件テーブルを作ってJOINするのが一番綺麗かも。

CREATE TABLE sortPri ( item_id INT, order_pri INT, PRIMARY KEY (item_id));

SELECT * FROM sortPri;
+---------+-----------+
| item_id | order_pri |
+---------+-----------+
| 2 | 100 |
| 3 | 200 |
+---------+-----------+

で、こうJOIN。
SELECT countTable.item_id,countTable.use_count
FROM countTable LEFT JOIN sortPri USING(item_id)
ORDER BY sortPri.pri DESC;


ちなみにORDER BY カラム位置 の構文は、今後廃止される可能性があるってなってるから
CASE .. WHENでやるにしてもNULL ELSE item_idのが良いかと思う。

ttp://dev.mysql.com/doc/refman/5.1/ja/select.html
706NAME IS NULL:2012/07/04(水) 14:51:26.36 ID:???
>>705
ありがとうございました。
ORDER BY sortPri.pri DESC, use_count DESCでうまく行きました。
707NAME IS NULL:2012/07/10(火) 20:59:30.35 ID:???
?のバージョンで統計情報の収集を行い、その後、統計情報が正しく実行出来たか確認する方法を教えて下さい。
なお、アナライズ実行時の返り値以外の方法でお願いします
708NAME IS NULL:2012/07/10(火) 21:01:42.71 ID:???
5.1のバージョンです↑
709NAME IS NULL:2012/07/10(火) 22:51:42.31 ID:???
多分ない
まず、各コネクションは独立して、不可侵なことが保証されているので、
統計情報の更新を実行したコネクション以外状況は判断できない。
後から確認したいなら、どこかにログを残しておくぐらいかな。

まぁ、統計情報更新クエリがDB障害によりエラーになった場合は
MySQLログに出力される可能性はあるので、ログを監視すれば
分かるかもしれないが、そういう時は統計情報以前にDBがおかしい。

質問の趣旨が「統計情報が不正確でオプティマイザが正常に判断できない」
というものなら、「そういうものです」。
統計情報はMySQLに限らずほとんどのRDBMSがサンプリングで行うので、
サンプルで取り上げられたデータの偏りで決まってしまう。
普通は保存データ量が増えるに従いデータの中身も程よく分散してくるので、
オプティマイザも正しく判断するようになります。

全データを網羅して統計情報を構築するRDBMSってあるのかな?
710NAME IS NULL:2012/07/13(金) 21:59:15.34 ID:???
ゴキ光線は風前の灯やな( ´Д`)y━・~~
711NAME IS NULL:2012/07/14(土) 17:10:18.97 ID:???
管理ツールのお勧めってありますか?

adminer あたりにしようかと思ってますが
712NAME IS NULL:2012/07/14(土) 23:49:25.21 ID:???
>>711
ゴキブリってどや
713NAME IS NULL:2012/07/15(日) 01:42:22.33 ID:RrRsvsQU
ttp://jul.2chan.net/img/9/src/1342280425177.png

ttp://multip.net/view/giZtiUaM5q

大津イジメ自殺のアレで、
小網武里のイジメ証拠動画がアップきた!!!

撮影者は不明。

つか、これ傷害罪確定だろ。

こんなこと毎日されたら、そりゃ自殺するな。

なお、画像なんかは拡散OKっす。
714NAME IS NULL:2012/07/16(月) 16:59:31.68 ID:???
table(
uid int unique,
tid int
)

SELECT * FROM table;

でリクエストした時、例えばリクエスト結果の中に tid=AAA が何番目にあるかを
知る方法ってあるんでしょうか?
715NAME IS NULL:2012/07/17(火) 16:07:49.87 ID:/0OPFvGM
コマンドプロンプトから varchar(10)に'あ'をinsertしたら正しくない文字ですとでてしまいます
'a'ならちゃんと格納できます
日本語が格納できないようなのですが原因は何が考えられるでしょうか?
716NAME IS NULL:2012/07/17(火) 16:22:35.05 ID:???
OS,バージョンとかデータベースやテーブルの日本語の設定はどうなっているかとか情報を全然出さずに
717NAME IS NULL:2012/07/17(火) 16:38:02.59 ID:???
ゴキ光線のお小言が始まるでぇ〜( ´Д`)y━・~~
718NAME IS NULL:2012/07/17(火) 16:41:43.32 ID:???
すみません自己解決しました
コマンドプロンプトから格納に指定した文字列はutf-8とは違う文字コードだったのが原因のようです
mysqlの方で扱う文字をcp932に変更したら格納できました
719NAME IS NULL:2012/07/17(火) 16:55:32.35 ID:???
>>714
結果セット内の順番を知りたいというのはアプローチが誤っている
なぜ知りたいのか、その目的を書くべき

>>718
クライアント側の文字コードを変更する方法がある
mysql> set character set cp932;
720NAME IS NULL:2012/07/17(火) 22:53:28.49 ID:???
>>714
ごめん、下策しか思いつかなかった。

SET @a:=0; SELECT * FROM (SELECT @a:=@a+1 AS rownum,`table`.* FROM `table`) AS dummy WHERE tid = ..;

1. tableを2回フルスキャンするからすごく重い
2. テンポラリテーブルを使うので、max_heap_table_sizeとtmp_table_sizeをそれなりの値にしないとMyISAMに変換されて更に重い
3. tidにINDEXが貼ってあってもサブクエリ化するので利かなくなる
721NAME IS NULL:2012/07/18(水) 02:08:46.73 ID:???
>>719
MySQL の勉強を兼ねて Twitter のようなものを作っているのですが、レス先の前後 (実際にはレスされた一覧の表示は
30件ずつ表示してて、それらはページ単位で扱っています) を表示したいと考えています。

1つの発言に数千、数万のレスが付く可能性も現実としてありえるということを考えた場合に、
プログラム側で無駄なループを省きたいため、指定したカラム中の値が一致した行が結果の中の何番目に
あるのかと言うのを知れたらなと。考えていました。


>>720
勉強しはじめたばかりなのでパッと見理解出来ないので、じっくり解読してみます。
ありがとうございます。
722NAME IS NULL:2012/07/18(水) 13:00:29.89 ID:???
>>721
日時カラムを持って、日時でソートすればええんでわ。
723NAME IS NULL:2012/07/18(水) 14:10:49.29 ID:???
入門書を読みながら、XAMPPでMySQLをはじめたのですが、
テーブルにレコードを追加するSQL文(INSERT INTO〜)を実行しても「返り値が空でした。」となってしまい、レコードが追加されません。

どのような原因が考えられますでしょうか?
724723:2012/07/18(水) 14:18:43.79 ID:???
連投すみません。以下のような文です。

INSERT INTO anketo (nickname,email,goiken) VALUES ("名前","Eメール","ご意見")
725NAME IS NULL:2012/07/18(水) 16:15:22.78 ID:???
それはMySQLのコンソールで直やってみたのか、それともPHP経由とかのどっち?
MySQLのコンソールで直やってみて駄目っていうなら入力間違いだし、直でならOKっていうなら
PHPとかの設定間違いなんだろうし
726NAME IS NULL:2012/07/18(水) 16:43:29.10 ID:???
>>721
結果セット内での位置がわかったところで
結局は一度全部取得しなきゃならないわけで、
取得するに主キーをハッシュキーにしたハッシュテーブルを一緒に組み立てて
逆引き出来るようにしたらいいじゃないかな
727NAME IS NULL:2012/07/18(水) 16:44:15.65 ID:???
- 取得するに主キーを
+ 取得する際に主キーを
728NAME IS NULL:2012/07/18(水) 18:56:14.76 ID:J6edWvlF
mysql内で変数が使えると聞いたのでさっそくつかってみたのですが、

SELECT
@num1:=5
@num2:=7
@num1 + @num2 as answer

とすると ちゃんと
[answer] => 12
となるのですが、

@num1:=5
@num2:=`hoge_column`
@num1 + @num2 as answer
と、カラム指定をすると、挙動がおかしくなります。

何が原因と考えられるでしょうか?
729NAME IS NULL:2012/07/18(水) 19:33:17.61 ID:???
アドバイスもらいたいなら、どう「おかしく」なったのかちゃんと書こう
730714:2012/07/18(水) 22:00:43.87 ID:???
>>726
こうやってスレを見てると、ループで回すのが普通って感じがしてきました。


質問を重ねて申し訳無いのですが、

select * from table where tid='AAA';

としようとする時、tid='AAA' を含む、tid='AAA' の前後 10 件を取得する。

と言ったのは、どう書けば良いのでしょうか?
731714:2012/07/18(水) 22:42:04.31 ID:???
ググッてたら、order を使えば前後が取得出来そうですね

SQL って発想力必要だなぁ
732NAME IS NULL:2012/07/21(土) 11:20:13.40 ID:???
date型に紀元前の日付入力するにはどうしたらいい?
733723:2012/07/21(土) 15:52:25.48 ID:???
>>725
遅レスすみません。自己解決しました。
SQLに直だったのですが、入力するフォームが違っていたようです。
SERECTなどの形式がボタンを押すだけで出てくるフォームがあったので、
そこかと思っていたのですが、違いました。なぜそこではダメだったのかは未だ謎です。
734NAME IS NULL:2012/07/22(日) 02:35:20.93 ID:GFxzwA7B
LAMPにてWEBシステムを構築しています。
・centos5
・mysql(5.0.95)
・apache(2.2.3)
・PHP(5.2.17)

phpからPDOを使用し、各種クエリーを発行しているのですが、
ある一定時間経っても終了しない場合、なんらかの処置をしたいと考えています。
そこで、クエリータイムアウト的な機能を調べてみたのですが、どうにも見つけることができませんでした。
自前で「processlist」を参照し、killするしかないのでしょうか?
735NAME IS NULL:2012/07/22(日) 06:53:11.91 ID:???
非同期で SQL を発行しない限り、実行時間は PHP > MySQL である。

PHP の時間時間の制限を php.ini に書けば良い。
ただし Apach のタイムアウトもあるから、気を付けて。
736NAME IS NULL:2012/07/23(月) 02:07:52.47 ID:???
>>735
ご回答頂きまして、ありがとうございます。
私も当初、ご教授頂いた方法を検討していました。具体的には、
 max_execution_time(もしくは、set_time_limit関数)
へ値を設定する方法です。しかしながら、
リファレンスには、
> このスクリプト自体の実行時間にのみ影響を与えます。
> system() を用いたシステムコール、ストリーム操作、 データベースクエリ等のスクリプト実行以外で
> 発生する処理にかかった時間は スクリプトが実行される最大時間を定義する際には含まれません。
とあり、実際、動作を確認したところ、クエリー発行後、上記変数に設定した秒数を経過してもスクリプトは停止しませんでした。
また、apacheについてですが、具体的には、
 TimeOutディレクティブ
へ値を設定する方法だと思うのですが、こちらは、socketに対するもので、処理自体が停止するものではないようです。
737NAME IS NULL:2012/07/24(火) 22:35:48.73 ID:???
>>734
PHPはまったく知らんで言うが、
alarmは使えないの?
Perlだったらきっとそうするところ。
738734:2012/07/24(火) 23:34:46.67 ID:BXivuFmq
>>737
ご回答頂きまして、ありがとうございます。
調べてみましたがphpでは、「alarm」のようなタイマー(スケジューラー)関数は無いようです。
739NAME IS NULL:2012/07/25(水) 11:33:40.80 ID:jKWHyDhx
以下のように、空文字列のはずのフィールドがNULLと表示されてしまいます。
別のサーバで試すと空文字列として表示されるので、どこか設定
があると思うのですが、どこを見ればいいでしょうか?
バージョン5.0.22です。

CREATE TABLE `n` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into n (name) values ('');
insert into n (name) values (NULL);

[test]> select * from n;
+----+------+
| id | name |
+----+------+
| 1 | NULL |
| 2 | NULL |
+----+------+
2 rows in set (0.00 sec)

[test]> select * from n where name='';
+----+------+
| id | name |
+----+------+
| 1 | NULL |
+----+------+
1 row in set (0.01 sec)

[test]> select * from n where name is null;
+----+------+
| id | name |
+----+------+
| 2 | NULL |
+----+------+
1 row in set (0.00 sec)
740NAME IS NULL:2012/07/26(木) 01:22:36.00 ID:AwMJ+F5s
START TRANSACTION

LOCK TABLE テーブル名 WRITE

〜 SELECT, DELETE, INSERT の混ざった処理 〜

UNLOCK TABLES

COMMIT


という流れでSQL文を実行しているのですが、
テーブルロックをかけなかった場合は DELETE が一瞬で終わるのに、
かけた場合では50ミリ秒ほどかかってしまいます。
これは何故なのでしょうか?

MySQLで、InnoDBです。
741NAME IS NULL:2012/07/26(木) 10:16:25.40 ID:PX3MqUQ9
Postgresだと
SELECT id FROM (VALUES (1),(2),(3)) AS hoge(id);
というSQLが可能ですが(多分標準SQL)
これをMySQLで実現するには、テンポラリテーブル作るしかないのでしょうか?
742NAME IS NULL:2012/07/26(木) 11:16:24.09 ID:???
>>739
5.0.96と5.5.25では再現しなかった。
sql_modeかなと思ったんだけど、いくつか試しても見当たらない。。
別のサーバってバージョンとかmy.cnf同じ?


>>740
試したけど有意な差は出なかった。。
始める前に
SET PROFILING=1;
DELETEした直後に
SHOW PROFILE;
で、どこで時間がかかったかざっと見られる。

別の話だけど、LOCK TABLESかけるとトランザクションは暗黙のCOMMITされるから
completion_typeを1に設定してないとROLLBACK利かなくなるよ。


>>741
テンポラリテーブルかFROM句サブクエリかな。。
743741:2012/07/26(木) 11:58:12.64 ID:PX3MqUQ9
>>742
解答ありがとうございます。
サブクエリで複数行の一時テーブル的なのって作れるんでしょうか?

上記の例で言うと
ID
1
2
3
といった形になるのですが。
744740:2012/07/26(木) 14:51:31.46 ID:AwMJ+F5s
>>742
レスありがとうございます。
ご推察の通り、原因はテーブルロック時に行われる暗黙のCOMMITにありました。
自動コミット機能をオフにすることで、高速に動作させることが出来ました。
ありがとうございました本当に助かりました!
745NAME IS NULL:2012/07/26(木) 14:57:15.58 ID:???
>>743
SELECT id FROM (
SELECT NAME_CONST('id',1) UNION SELECT 2 UNION SELECT 3
) AS duumy;

になっちゃうと思う。
美しくなくてごめん。。
746NAME IS NULL:2012/07/26(木) 14:58:45.74 ID:???
>>744
おまけのつもりだったんだけど、助けになれたなら良かった!
747741:2012/07/26(木) 16:29:18.45 ID:PX3MqUQ9
>>745
UNIONでって事ですね。
理解しました。
20個行とかになってしまうので、ちょっと厳しいですね。

テンポラリで対応する事にします。
ありがとうございました。
748NAME IS NULL:2012/08/01(水) 16:12:07.08 ID:UWVp+x7J
id , reg_gmt , res_gmt , title と言うカラムがあります。
res_gmtが空白に一致するもので、reg_gmtで昇順ソートしたものを取得するにはどのようにしたら良いですか?
749NAME IS NULL:2012/08/01(水) 22:38:19.27 ID:???
tritonnとphp、IISを使用した検索システムがあります。
タスクを使用して朝と昼にoracleのテーブルを基にmysqlにテーブルを作成する運用をしています。

テーブル作成直後は検索効率が落ちるため、select * from db1をぶちこんで全てのレコードを
テーブルにキャッシュさせるようにしたいのですが、タスクスケジューラやbat処理では
自動でキャッシュされなくて困っています。

現状batファイルと同じ内容を記述したphpを実行させるボタンをページに作成しておき、
クリックしてキャッシュさせています。

違いといえばcmdが絡むので、shiftjisを経由していることくらいなのですが、
select文実行前にはutf8を使用するようには記述しています。
ご助言をいただけると助かります。
750749:2012/08/01(水) 22:42:42.81 ID:JN6avP4B
sage消し忘れました。
751NAME IS NULL:2012/08/01(水) 23:47:26.04 ID:???
>>748
SELECT .. FROM .. WHERE res_gmt = '' ORDER BY reg_gmt; ってことで良い?
それとも、基本はres_gmtでソートするけど、空白の行だけ代わりにreg_gmtを使ってソート?


>>749
Trittonってことは本質MyISAMエンジン、で合ってるっけ?
MyISAMのデータのキャッシュはOSのファイルシステムにお任せなので、
キャッシュされてるかされてないかを探るのは大変だと思う。
クエリキャッシュのことじゃないよね?

何を以て`phpから叩くとキャッシュされる'けど`batからだとキャッシュされない'って思ったか教えてもらえると助かる。
あと、文字コードはデータキャッシュ関連の動作には関係しないのでそこはOKかと。

今思い付いたんだけど、batから叩くときのデフォルトデータベース指定してる?
(SELECT文そのものが転けてないかなって思った。指定してたらごめん)
752749:2012/08/02(木) 06:44:47.62 ID:C7npLqI0
>>751
MyISAMであってます。
クエリキャッシュのことではない、はずです。
(完全にシステムを把握していないので、確認不足です)

phpにはMySqlConnection()使ってdbと接続情報を関数定義した後、
接続にutf8を使うようにセットし、その後select * from db1文を
セットするまでの記述をしています。

Web上ではjavascriptを使ってこのphpを実行し、終了したらajax処理で
画面更新しています。
batはphpの実行ファイルのパスを記述して、直後にこのphpのパスを記述しています。

batではこけてるので、このphpのコピーをphp.exeに関連付けてタスクスケジューラに
いれてますが、それもこけています。
753749:2012/08/02(木) 07:54:51.84 ID:7tofjJgZ
>>751
携帯から追記します。

前レスの内容から、同じ処理を別の手段で実行しているにも関わらず
batではこけるということで、batではうまくいかない、と思っています。

しかし、oracleからmysqlのテーブルを作成するまでをbatで処理しており、
そちらもphpを実行する内容ですが、正常に終了しているので、
batを開始してphpを実行し、select文を発行してキャッシュさせよう、
というところでつまっています。
754NAME IS NULL:2012/08/02(木) 13:51:17.17 ID:???
>>753
ということは、batで叩いたときにはキャッシュできないというより
SELECT自体が失敗してるってことかな?

phpファイルの読み取り/実行権限
- IIS経由だとIISワーカーグループ(だっけ?)だけど、batだとそのユーザーになる
bat実行時にそもそも何かエラー吐いてないか
- pauseとかでキャッチしてみる

辺りはどう?
755749:2012/08/02(木) 21:05:39.37 ID:7tofjJgZ
>>753
false時にメッセージを返すようにしても、メッセージは返らなかったので、成功しているようです。

ついでにselect文発行後に待機時間を設定したところ、検索速度が向上したため待機した場合はキャッシュされているようです。

ただ、その後、30分や1時間あけて検索を行うと初回のみ検索が遅くなる場合があるようです。

検証回数が少ないので、なにが影響しているはわかっていません。

今のところ、batだとselect文発行からキャッシュまでの処理が完了する前にプロセスが終了しているので
キャッシュされていない、ようにみえますが、通常の動作なのかも不明です
756NAME IS NULL:2012/08/02(木) 22:12:14.00 ID:???
「キャッシュされない」
「こける」
「成功している」

全部同じ現象を指しているのか???
757NAME IS NULL:2012/08/03(金) 00:01:13.01 ID:???
>>755

そっかー。疑って失礼。。

↓明日時間が取れたら試してみる。
Sennaは用意出来ないから純MyISAMでだけど。。


読み込みの動作自体、キャッシュに載せてからそれをユーザー空間にコピーしてるっぽいから、
キャッシュに載り切る前にbatが終わるっていうのは考えにくいかなぁ、と思ってる。

ttp://msdn.microsoft.com/en-us/library/windows/desktop/aa364218(v=vs.85).aspx

あとNTFSだったらCopyOnWriteで書き込むから、
インポートした時にキャッシュされてもおかしくない気がするよなぁ。。


時間が経った後に初回だけ遅いっていうのは、キャッシュからこぼれたからだと思う。
2回目以降に速度が改善してるならなお。

ただし、2回目が全く同じクエリだったならクエリキャッシュって可能性のが強いか。。
758749:2012/08/03(金) 06:47:48.08 ID:nVSxR0GP
>>757
前任者はOralceのバッファキャッシュみたいなことを常にするようにしたい、らしかったそうです。
私が現在クエリキャッシュと今行っているselect文のキャッシュの違いについて
完全に把握していないのですが、
クエリキャッシュは同一の問い合わせがあった場合、前回の結果をそのまま返す機能で、
select文のキャッシュはディスクではなく、メモリ上のキャッシュで処理を行う、
という認識でよいでしょうか。

>> ただし、2回目が全く同じクエリだったならクエリキャッシュって可能性のが強いか。。
この認識であれば、2回目の検索では異なる条件のクエリを実行していますので、
クエリキャッシュではないと思われます。
1.select文を発行しない→15秒かかる
2.→select文発行後検索を行う→0.1秒かかる
3.→→再度同じ条件の検索を行う→0.001秒かかる
というように違いがあり、1.の自動化を目的としています。

>>↓明日時間が取れたら試してみる。
お手数おかけしますが、非常に助かります。ありがとうございます。
759NAME IS NULL:2012/08/03(金) 14:28:26.15 ID:XR0LUV2I
今日より、5日前より以降にアップデートされた
データのみ抽出 をしたくて

WHERE
`up_date` > 'current_timestamp + interval -5 day'

と書いたのですが 1件も出て来ません。
なぜでしょうか
760759:2012/08/03(金) 14:34:49.10 ID:XR0LUV2I
ADDDATE(now(), INTERVAL -5 DAY)
にしたらうまくいきました。
761NAME IS NULL:2012/08/03(金) 14:56:50.40 ID:XR0LUV2I
sql って WHERE文に、
何もなくてもとりあえず実行できるようにできないものですか?

WHERE
$変数
みたいなことをやってあらゆる条件文を足せるようにしてるのですが
全く条件がない場合 WHERE のみになっていまうので
エラーになってしまうのです。
762NAME IS NULL:2012/08/03(金) 15:37:50.32 ID:???
>>758

ごめん、今日がっつりやる時間取れそうにない_| ̄|○

クエリキャッシュは認識の通り。
Oracleのバッファキャッシュに相当するものはMyISAMエンジンには無くてOSに全任せ。
OSがファイルキャッシュを持っていればそこから読むし、無ければDISKから読んでOSからmysqldに返す。
(なもんで、mysqldから見るとDISKから読んでるのかOSのキャッシュから読んでるのか判らない)

OS任せの部分だから、これをちょっと改変してキャッシュの載り具合を比較するしかないかなと思ってた。

ttp://gallery.technet.microsoft.com/scriptcenter/50efb1d2-3c1c-4765-b91d-120c162b90f1/


>>761

WHERE句を自動生成する様な場合、
$a = "WHERE 1=1";
foreach (..) {
$a .= "AND .. ";
}
ってやるケースがある。
これならforeachで1個も回らなくてもWHERE 1=1になって常にtrueだから。
763NAME IS NULL:2012/08/03(金) 23:14:29.18 ID:???
質問です。

MySQLで小数点を使う場合に、下記の3つの選択肢があります。
1)floatを使う
2)doubleを使う
3)decimalを使う。

体重を管理するソフトを作ってまして、この際、体重の値を格納するカラムに使う型は、
何にするべきでしょうか?(小数点は2ケタで考えています)

また、それぞれどの場面で、どの型を使うという考え方がありましたら教えてください。

764NAME IS NULL:2012/08/04(土) 13:44:48.07 ID:???
4)100倍して、整数型に入れる
765NAME IS NULL:2012/08/05(日) 00:03:51.57 ID:???
>>763

体重ならどれでも良いと思う。俺ならDECIMAL。

どの型を選ぶかの目安は、

0) 1レコードあたり数byte無駄に使うのが許せる?
 ⇒許せる .. decimal型
 ⇒許せない .. 1)へ

1) 1/100兆〜/100程度まで誤差が出ても許せる?
 ⇒許せる .. 2)へ
 ⇒許せない .. decimal型

2) 格納する値は小数点以下含めて7桁以内、または15桁以内で収まる?
 ⇒7桁以内に収まる .. single型
 ⇒15桁以内に収まる .. double型
 ⇒15桁では収まらない .. decimal型

かなと。

アプリの側で10^3倍して整数型に入れるのも勿論アリ。
ただ、アプリ側の人が(コードのメンテ含め)面倒で間違えやすくなると思うし、
DECIMALは多少データサイズが不利(数バイト単位)だけど、
数千万レコードでミリ秒単位のレスポンスを争うわけじゃなければ問題にならないと思うから
そんな環境でなければDECIMAL型で良いと思う。
766NAME IS NULL:2012/08/05(日) 00:05:32.01 ID:???
あ、ごめん、singleじゃなくてfloatだ。。。
767NAME IS NULL:2012/08/05(日) 00:58:10.06 ID:ys5zxbE7
>>763
体重ならグラム管理にして抽出SQLか表示側で調整したほうがよくね
>>764の通りだが
768NAME IS NULL:2012/08/06(月) 10:20:08.08 ID:MtYz/kb4
mysqldump -u root -p DB名 テーブル名

とすれば特定のテーブルのみダンプ出来ますが、
逆に「特定のテーブルのみ除外」するにはどう書けばいいのでしょうか?
MySQL5.1.54を使用しています。
769NAME IS NULL:2012/08/06(月) 11:11:00.76 ID:???
770NAME IS NULL:2012/08/06(月) 13:21:54.95 ID:MtYz/kb4
>>769
希望通りできました。ありがとうございました。
771NAME IS NULL:2012/08/06(月) 22:53:06.69 ID:FO8S+xhX
質問です。mysql5.5.25を使ってます
ファックスの番号を入れるカラム fax1,fax2,fax3があって、すべて
tinyint(4) /default NULL/NULL YES の構造になっているんですが、
フォームの入力で該当テキストエリアが空欄の状態でinsert / updateしようとすると0が入ってしまいます
これはこういう仕様なんでしょうか?
空欄の状態でinsert/updateした場合にNULLにしたいと思っているんですがどうしたら良いでしょうか
よろしくお願いします
772771:2012/08/06(月) 23:05:18.80 ID:???
すみません、全然正確じゃありませんでした
・空欄でinsertすると0が入る
・空欄でupdateしようとすると変更が反映されない(他のカラムも。update全体が無効のようです)
どうしたら良いのでしょうか
773NAME IS NULL:2012/08/06(月) 23:30:53.09 ID:Kjs7fwLl
mysqldump(1) && restoreについて質問です
# mysql -u root < dump.sql
すると、既存のDBやテーブルは1回全部消されてから、書き込まれるのでしょうか?
それとも、既存のDBやテーブルを残して、新しいものだけ追記されるのでしょうか?
それとも、既存のDBに「foo」、「bar」があり、dumpファイルには「foo」だけ
があった場合、リストアすると、「foo」だけになるのでしょうか?
774NAME IS NULL:2012/08/06(月) 23:38:11.28 ID:???
自分で実際にdumpとってエディタで見てみたらよろしいやん

DROP TABLE IF EXISTS `xxxx`;
CREATE TABLE `xxxxi` ( 〜 )   〜

となってるから
775NAME IS NULL:2012/08/07(火) 11:02:08.57 ID:???
>>772
INSERT文でカラム指定してる?
あと電話番号を数値は無理が無い?
0で始まるときは桁数で判断して埋めてるの?
776NAME IS NULL:2012/08/07(火) 11:14:01.06 ID:???
>>772
・空欄でinsertすると0が入る
テキストボックスが空欄の場合、0をセットするようにコーディングしているからでは。

・空欄でupdateしようとすると
エラーが出ていないのであれば、抽出しているレコードが、更新したいレコードと違う。
別のレコードを更新しているからでは。
777NAME IS NULL:2012/08/07(火) 14:46:52.86 ID:???
>>758

ごめん、やっとやってみたけど、俺のところでは再現しなかった。
IISから/batから同じphpスクリプト(SELECT * FROM t1だけ)を呼ぶと、
どっちの場合もちゃんとキャッシュに載る。

キャッシュ周りのヒット率とか見ながらやっても、ちゃんとヒットしてるっぽい。

役立たずでごめん(´・ω・`)
778NAME IS NULL:2012/08/07(火) 15:13:20.05 ID:???
>>771

フォーム空っぽの時のINSERTで、fax1 = ''ってしてるんじゃない?
整数型に空白文字列を突っ込もうとすると、NULLじゃなくて0になるよ。

UPDATEはぱっと思い付かない。。
779NAME IS NULL:2012/08/07(火) 20:47:00.09 ID:???
>>772
perl なら undef を $fax に入れればよいかと。
780NAME IS NULL:2012/08/07(火) 23:25:46.46 ID:???
>>765
型を決める優先順位としては、
精度(許容誤差)→有効桁→容量の
ほうがいいんでは?

絶対精度が必要なら、選択肢は
ひとつしかないんだから。
781NAME IS NULL:2012/08/07(火) 23:30:23.61 ID:???
>>771
そのINSERTとUPDATEは、同じ接続?
別の接続で、それぞれのSQL_MODEが
異なってたりはしない?
782NAME IS NULL:2012/08/07(火) 23:51:44.88 ID:24CtAp1+
レプリケーションについて質問です。
参照系の負荷が増えてきた場合、スレーブを増やして負荷分散していくと思いますが
どういう情報を見て「そろそろ増やすか」という判断をするのでしょう。
これが閾値に達したとか具体的な判断材料がありましたら、教えていただけないでしょうか?
783NAME IS NULL:2012/08/08(水) 13:11:22.72 ID:???
>>780
仰る通り。

誤差が許容できてかつ容量も気にしないんだったらDECIMALを推奨したくて、
あんな変な0)になった。。
784NAME IS NULL:2012/08/08(水) 13:14:17.93 ID:h4MbiXpm
>>782
iowaitが頻繁になったら
785NAME IS NULL:2012/08/08(水) 15:36:14.33 ID:sIm+wbEE
DATETIMEの値からの現在までの経過秒数はどのようにすれば出せるのでしょうか。
786NAME IS NULL:2012/08/08(水) 16:05:48.91 ID:???
UNIX_TIMESTAMP で秒数だして引き算するとか
787785:2012/08/08(水) 16:25:14.22 ID:sIm+wbEE
ありがとうございます
788749:2012/08/08(水) 20:58:51.97 ID:Apjd5TM1
>>777
お助けいただきありがとうございます。
通常select文発行するだけで、メモリにキャッシュされるということがわかっただけで
十分切り分けが行えると思います。

まだ原因はわかっておらず、待機時間を設定して回避してますが、
メモリの動作とにらめっこしながら確認していきたいと思います。
789748:2012/08/10(金) 10:30:49.14 ID:pvTRtdDK
>>751
いけました、ありがとうございます

もういっこ教えてください
id , reg_gmt , res_gmt , title と言うカラムがあります。
res_gmtに格納された数値が10以上のもののみで、reg_gmtで昇順ソートしたものを取得するにはどのようにしたら良いですか?
790NAME IS NULL:2012/08/10(金) 11:13:08.40 ID:???
where res_gmt >= 10
order by reg_gmt;
791NAME IS NULL:2012/08/10(金) 11:36:58.28 ID:???
こりゃひどいw
教科書超初級レベルそのまんま、かつどっちも同じとも言える問題をまた丸投げか。

>>748 の時点なら、これまで全くSQLに縁が無かった人が事情でどうしても
即席に何とかしなきゃいけない事情でもあったか? と思えなくもないが、
>>789 からすると、この十日ほどの間自分じゃ何も学んでないってことだな。
792NAME IS NULL:2012/08/10(金) 11:48:54.20 ID:???
スレの趣旨としてあってるのに文句言うほうがスレチ。
793NAME IS NULL:2012/08/10(金) 12:01:01.14 ID:pvTRtdDK
>>790
完璧でした、ありがとうございます
794790:2012/08/10(金) 20:03:12.89 ID:???
完璧と言われても嬉しくないw
何か引っ掛けがあって間違いでもあったかと思ってたけど w

>>792
MySQLの質問じゃなくてSQL質疑応答スレの方だろ、これ
795NAME IS NULL:2012/08/10(金) 23:13:47.16 ID:???
そっちでもヌルーされるレベルじゃね
796NAME IS NULL:2012/08/12(日) 14:10:19.57 ID:dvN7Vk7t
simplepieでrssを読み込みデータベースに書き込んでいるのですが質問したいです。

テーブル1にはrss収集する対象のサイトの情報を、
テーブル2にはパースしたrssの情報を書き込んでいて、
テーブル1のカラムはサイトid、サイトタイトル、サイトアドレス、rssのアドレス
テーブル2のカラムは記事id、記事タイトル、記事アドレス、記事の日時
です。

現状ではsimplepieでテーブル1のrssアドレスを読み込み、
各記事の情報をテーブル2にinsertしてるのですが
この時にテーブル1のサイトidもテーブル2に挿入したいのですが
どのようにすればいいでしょうか。
simplepie使ってるかたいらっしゃれば教えてください。
797NAME IS NULL:2012/08/13(月) 21:12:23.15 ID:???
>>796
どのようにって、当然にテーブル2は、
・サイトID(テーブル1の)
・記事ID
・記事URL
・etc
になるんじゃないの?
そうしなければどのサイトの記事なのかわからないでしょう。
いちいち、記事URLを解析して、サイトURLと照合してなんてやらない限り。
それよりはサイトIDカラムを設けるのが、テーブル1とのリレーションの点からも
素直だと思うが。
798NAME IS NULL:2012/08/13(月) 21:48:07.57 ID:hCv+mjeX
酔っ払った勢いで聞かせてください。

InnoDBで作ったDBを別のサーバーに移すのって、mysqldumpした
データを食わせるしか方法ないんですか?

MyISAMだとディレクトリまるごとコピって適当にあれこれすればなんとか
なったのに、InnoDBのデータ移転は時間かかって発狂しそうです。
なんか早く移す鳳凰ないっすかね?
799NAME IS NULL:2012/08/13(月) 21:57:41.67 ID:???
サービス停めて、myqlのデータディレクトリごと(ibdataとか全部)コピーすればいけるんじゃね?

俺はmsqldumpをそのままパイプでつないでリストアしている
800796:2012/08/13(月) 23:37:14.09 ID:pOLbPoto
>>797
おっしゃる通りで、テーブル2には一応サイトidカラムは設けています。
が、テーブル2に挿入時にテーブル1のサイトidをどうやって取得するかが思いつきませんでした。
悩んだ末結局1記事ごとにfeed配信元サイトurlを取得して、テーブル1からサイトidを
whereでurl照合してselectして挿入することにしました。これで問題ないんでしょうか?
801NAME IS NULL:2012/08/14(火) 01:24:02.46 ID:???
>>800

いや、あのさ、

>現状ではsimplepieでテーブル1のrssアドレスを読み込み、

この時点でサイトIDも得られるやん。
テーブル1からRSSのURL読み込むときに、ついでにサイトIDも得ておいたら済むっしょ。
それをホスト言語(この場合はPHPやわね)の側で覚えておいたら、
テーブル2に書き込むときは、覚えておいたそれを書くだけやと思うんやわ。
802NAME IS NULL:2012/08/14(火) 01:50:07.05 ID:???
具体的にどう記述すればサイトID得られるのかわからないんじゃないかな>>800の人は
803NAME IS NULL:2012/08/14(火) 08:56:07.54 ID:???
なんか、一応IDは付けたけどキーが何か理解してないって感じだな。
804NAME IS NULL:2012/08/14(火) 20:52:36.63 ID:esze3jrn
数MBの画像を投稿してもらうのに、保存先をMySQLのBLOBデータにしようかと思っているのですが、
素のファイルを公開フォルダに置くのに比べると、入出力の処理はどのくらい重くなりますか?
不向きでしょうか?
805NAME IS NULL:2012/08/15(水) 11:18:04.36 ID:???
オープンソースのECシステムをいじってたら、
テーブルのID値をauto incrementせずに、わざわざ1行・1カラムの別のテーブルに持ってて
そこから値を取り出してinsertして1加算していたんだけど、
これはなんでこういう実装になっているのでしょうか?
806NAME IS NULL:2012/08/15(水) 12:45:14.02 ID:ve1P3DnP
>>805
自分で番号を管理したいから
807NAME IS NULL:2012/08/15(水) 12:56:36.07 ID:???
>>806
だからそれはなんで?
808NAME IS NULL:2012/08/15(水) 13:36:13.21 ID:???
作者に聞けよ。

つか、普通に考えたら移植性のためだろ。
809NAME IS NULL:2012/08/15(水) 13:37:58.74 ID:???
質問を変えます。別テーブルで管理することによって、何のメリットがあるのでしょうか。
ちなみにID番号を引っ張り出すテーブルでは、auto incrementが使われていて、1ずつ増えます。
そのシステムのスレで聞いてもわからなかったので、一般的な回答があればお聞きしたいです。
810NAME IS NULL:2012/08/15(水) 13:52:53.93 ID:ve1P3DnP
トランザクションテーブルにTRUNCATEやALTER TABLEは発行したくない
速度的な問題も
http://kur.jp/2009/12/27/mysql-auto-increment/

まあ、負荷の少ないアップデート1回で
次の番号コントロールするための場合が多いかな

重複エラーやロールバックや再起動でずれることもあるし
811NAME IS NULL:2012/08/15(水) 20:31:05.25 ID:???
>>804
ファイルのほうがいいって教えてgooにかいてあったよ
812NAME IS NULL:2012/08/15(水) 21:54:03.80 ID:???
>809
オートナンバーはレコードが保存されるまで発番されない
よって、

1.ユーザーがアプリの新規登録ボタンを押し、入力画面を開く
2.ユーザーが色々情報を入力する
3.ユーザーが保存ボタンを押す
4.新規にレコードが作成され、番号が発行される

という流れになる。
別テーブルで管理をすれば、

1.ユーザーがアプリの新規登録ボタンを押す
2.番号管理テーブルから発番し、入力画面を開く
3.ユーザーが色々情報を入力する(この時点で番号は分かっている)
4.ユーザーが保存ボタンを押す

となる。
ECシステムだと店舗と顧客の関係だろうから、顧客からの問い合わせを受けている時点で
案件を示す番号がわかっているには重要。
※「次回問い合わせる際はこの番号をお伝えください」と顧客に伝えるため
そのため後者のような仕組みをとることはある。
…が、単なる連番なら詐称が簡単に出来るので、連番にはせずチェックディジットを含めた番号にすると思う。
813NAME IS NULL:2012/08/15(水) 22:52:56.13 ID:???
どもです。

>>808
移植性というとMySQL以外のDB、auto incrementがないDBを考慮してるんですかね。
でもid取得用テーブルの方でauto increment使ってるのでそれは違うか…。

>>810
運用中にTRUNCATEやALTER TABLEが発行されることはないはずです。
レコード追加の頻度などからも、速度のためというわけではない感じがします。

>>812
ユーザーアクションで追加されるもの以外に、管理者が商品やカスタムページを追加する用のテーブルなど
全部がそうなっているので、ユーザー向けの理由ではなさそうです。

やっぱり作者(企業)に直接聞かないと意図不明すね。聞いたら教えてくれるのかな…。
814804:2012/08/16(木) 14:21:04.67 ID:???
>>811
自分でも調べてみました。DBにはバイナリの代わりにパスを保存するほうが無難なようですね。
ありがとうございました。
815NAME IS NULL:2012/08/16(木) 14:26:23.30 ID:???
>>813
insertしたレコードのIDを取得する方法を 作者が分からなかったのでそういう実装にした みたいな
後ろ向きな理由の気がします。
816NAME IS NULL:2012/08/16(木) 23:15:09.58 ID:???
>>813
それ、本体のテーブルがInnoDBで番号用のテーブルがMyISAMだったりする?
817NAME IS NULL:2012/08/17(金) 01:13:07.71 ID:???
>>816
いえ、全部InnoDBです。

>>815
なるほど…
818NAME IS NULL:2012/08/17(金) 14:47:50.86 ID:1eWs/aiB
1分刻みの為替のデータをDBで管理しています。
ここから例えば5分おきのデータを一発で取得できるクエリーを書くことは可能でしょうか。
819NAME IS NULL:2012/08/18(土) 16:55:17.15 ID:???
>>794
>完璧と言われても嬉しくないw
>何か引っ掛けがあって間違いでもあったかと思ってたけど w
820NAME IS NULL:2012/08/19(日) 10:34:31.48 ID:???
>>818
時刻を秒の部分落として秒か分になおして
5分で割り切れるやつを取りだすとかでいいんじゃないかな。
821NAME IS NULL:2012/08/19(日) 17:36:27.61 ID:xwtWSsyk
urlというカラムがあったとして
レコードhttp://hoge.aiueo.jpを探す場合select * from hoge where url like "http://hoge%"で抽出できるのはわかるのですが
レコードhttp://hogeというのがあったとしてレコードに"http://hoge.aiueo"と部分一致するものを抽出するにはどうすればいいですか?
最初の例の逆?という意味です。
822NAME IS NULL:2012/08/19(日) 22:22:48.32 ID:???
二行目が何を言ってるのか自体解らんでワロタ
823NAME IS NULL:2012/08/19(日) 23:04:48.72 ID:???
>>821
SELECT * FROM hoge WHERE LOCATE( url, 'http://hoge.aiueo' )=1
でどうでしょう?
824NAME IS NULL:2012/08/19(日) 23:46:58.58 ID:???
>>822
すいませんもっと整理してわかりやすくいうべきでした
>>823
それでできました!助かりましたありがとう
825NAME IS NULL:2012/08/21(火) 20:46:59.02 ID:???
5.6っていつGAになるの?
826NAME IS NULL:2012/08/21(火) 21:29:04.86 ID:???
ギャラクシー・エンジェル?
827NAME IS NULL:2012/08/22(水) 00:41:51.54 ID:???

二行目が何を言ってるのか自体解らんで
828NAME IS NULL:2012/08/22(水) 11:48:32.54 ID:???
>>817
それ、メインのデータテーブルのIDは全て数字でしたかの?
だったら、データテーブルのIDをauto_incrementにしたいんだけど
プリフィックスとしてアルファベットつけたかったとか。
もしくはkeyの構造のためとかそっちの可能性はないかな。

結構、後ろ向きな理由のほうが臭いけど。
829NAME IS NULL:2012/08/22(水) 20:05:59.62 ID:cD/ZrOuD
2ちゃんねるはInnoDBなん? MyISAMなん? どちらでもないなん?
830NAME IS NULL:2012/08/22(水) 22:09:09.82 ID:???
単なるテキストファイルじゃなかったかな。
831NAME IS NULL:2012/08/23(木) 15:43:12.19 ID:???
以前mysqlをかじって、最近また勉強しようと思ってるんですが、
当時買った入門書やリファレンスが4基準です。今は5ですよね。
4と5ってどれくらい違うのでしょうか?
4の時の本は役に立ちませんか?
832829:2012/08/23(木) 20:20:01.30 ID:???
>>830
ありがぽん
833NAME IS NULL:2012/08/23(木) 21:16:48.13 ID:???
>>831
4勉強して差分を後でウェブで調べたほうがらく

しばらく使わない → 新しい本をかじる

のループはものすごい無駄。
834NAME IS NULL:2012/08/24(金) 09:23:17.34 ID:???
単なるテキストファイルじゃなかったか
835NAME IS NULL:2012/08/24(金) 11:11:32.31 ID:???
バックエンド変更したって話も聞かないしね。
8361/2:2012/08/24(金) 23:47:58.90 ID:8YwZVdoT
mysql 5.5.19
master_tbl マスター
scode ←商品コード
sname
last_insertDate

data_tbl データテーブル
scode ←商品コード
inputdate
value1


(http://uni.2ch.net/test/read.cgi/operatex/1345250215/43代行)
8372/2:2012/08/24(金) 23:49:15.89 ID:8YwZVdoT
1日1回データをdata_tblに追加します。んで各scode毎に最新追加日付を
master_tblのlast_insertDateにセットしているんですが(アプリで)、これ
トリガーで出来ますか?出来たら、教えて欲しいんですがm(__)m
最新日付は作業日の日付とは限らず入力時の最新日付です
例えば 2012/08/24に入れるけどscode XXXのデータのinputdateの最新日付は
2012/08/20で、セットするのはその2012/08/20を入れると言うことです

(http://uni.2ch.net/test/read.cgi/operatex/1345250215/44代行)
838NAME IS NULL:2012/08/25(土) 00:17:08.84 ID:???
>>837
アプリ側でやったほうがいいんではないでしょうか
8392/2 :2012/08/25(土) 08:48:05.96 ID:???
>>838
ありがとう。やっぱりアプリ側でになりますかね

http://uni.2ch.net/test/read.cgi/operatex/1345250215/60代行
840NAME IS NULL:2012/08/27(月) 01:39:20.21 ID:SNjxWl2b
ユーザーIDといえば採番ですが、パラメータにユーザーIDをくっつけると
いるのか、いないのかすぐバレるので文字列にしてみたのですが、
やっぱり何十万件とかたまってくると遅くなるから連番にしたほうがいいのでしょうか。
841NAME IS NULL:2012/08/27(月) 10:42:03.95 ID:???
気にしないでよし
どうしても気になるならidと文字列の対応表も作っておけばいい
842NAME IS NULL:2012/08/27(月) 16:55:26.11 ID:???
>>841
やっぱりそうっすよね。
ありがとん。
843NAME IS NULL:2012/08/29(水) 22:40:01.27 ID:???
なんや、なんや( ´Д`)y━・~~
こっちはえろー盛り上がってますやん(爆笑)
最近三ヶ月のレスの消費率グンと上がってるのはなんでなん?( ´Д`)y━・~~
844NAME IS NULL:2012/09/04(火) 07:18:47.24 ID:Fu96Qm7I
1分刻みの為替データから10分毎の最大最小値を求めるSQLを書いています。

これを期間指定して(例えば、今年の頭から8ヶ月分の10分毎のデータを)一発のSQLで取得したいのですが可能でしょうか。

参考までに一回分の最大最小取得のSQLを書いておきます。

select max( high_price ) max_price, min( low_price ) min_price from currency_exchange_table
where currency_pair = 'USD/JPY' and
exchange_date between '2012-7-2 12:00:00 +0900' and '2012-7-2 12:09:00 +0900';
845NAME IS NULL:2012/09/04(火) 10:05:32.70 ID:???
10分ごとを同じ数字になるように、例えば時刻データを秒になおして100で割れば
100秒ごとの数値が同じになる。
それをGROUP BY して集計関数で出せばいい。
846NAME IS NULL:2012/09/04(火) 19:06:48.85 ID:???
さんくす。
847NAME IS NULL:2012/09/05(水) 08:32:23.86 ID:???
PHPからデータベースを操作しています

 0.CREATE文でテーブルを作成
 1.INSERT文でレコードを挿入

これらをmysqli_multi_queryで1度に実行しました
さらに、

 2.INSERT文でレコードを挿入する
 3.INSERT文でレコードを挿入する
 4.INSERT文でレコードを挿入する...

というような感じで続いて行きます

さてテーブルを確認すると、
挿入されたレコードの順番(AUTO_INCREMENT設定したIDの順番)が、

 2→1→3→4...

となっていました
はじめにCREATE文だけを行い、実行後にmysqli_closeしてから同様の作業を続けた場合には、
1→2→3→4...という並びになりました

なぜだい?

MySQL v5.5.20
PHP v5.3.10
848847:2012/09/05(水) 08:33:05.74 ID:j3gp/4Dx
失礼
849NAME IS NULL:2012/09/05(水) 09:16:55.73 ID:???
並び順は保証されないんじゃなかったか?

order byで指定しろよ
850 忍法帖【Lv=40,xxxPT】(-1+0:8) :2012/09/05(水) 09:40:25.66 ID:???
IDの順番をコントロールしたいなら、insert時にSQL文で番号指定すればいいよ
851NAME IS NULL:2012/09/05(水) 10:17:08.05 ID:???
単にユニークなのを保証するだけだし
順番が必要なら別に項目作った方が・・・
Closeじゃなくてトランザクションで挟んでもよさそう。
852847:2012/09/05(水) 10:51:22.00 ID:XUXixlkH
レスありがとうございます

実際上はorder byで指定して使っているので動作に問題はないのですが、
前掲の例の  2→1→3→4...  の順に必ず並ぶため、
何かそうなるような仕様・法則があるのかと思い質問しました
853NAME IS NULL:2012/09/06(木) 04:58:02.61 ID:rA2q8u++
現在は数千くらいのデータ量なんですが この先、数万→数十万は行きそうなので
ちゃんとインデックスを作っておこうと思いました。

DBにあんま詳しくないもんでよく分からないんですが
例えば特定のフィールドでLIKEで部分一致させるような場合
インデックスの種類はどのようなものが良いんでしょうか?

例えば、対象フィールドに PRIMARY として作っておくだけでも全然効果あるんでしょうか?

初歩的な質問ですみません。
854853:2012/09/06(木) 06:05:50.08 ID:???
あぁ…部分一致だとFULLTEXTになるんですか…
しかも色々と面倒そうですね…
やっぱあらかじめ自分で検索用単語データを別途作っておいた方が良いのかなぁ。
855853:2012/09/06(木) 06:18:30.89 ID:???
う〜ん。よくわかんないけど…

何か検索された場合
単語とヒットしたデータの位置を格納したテーブルをまず検索する
そこでヒットしなければ改めて大元のデータ全部を検索する
ヒットしたら前述の単語とヒットしたデータの位置を格納するテーブルに
その情報を追加して行く…

みたいなのが一番効率と労力の軽減のバランスが良い気がするんですが。


FULLTEXTのインデックス化ってどんくらい使えるものなんでしょうか?
856853:2012/09/06(木) 07:45:15.16 ID:???
いやいやダメだ汗
ヒット数が多すぎるとデータ書き込みのコストがバカにならない…
検索する機会が少ないと問題ない気がするけど
一分に一回とかされたらもうダメ…
857NAME IS NULL:2012/09/06(木) 10:43:53.48 ID:???
どこの図書館のシステム作ってるんだよw
858NAME IS NULL:2012/09/06(木) 14:11:08.92 ID:???
>>853
今のところ、MySQLでは部分検索は前方一致しかINDEXが使えないので注意。
LIKE 'hoge%'の形ね。
LIKE '%hoge'やLIKE '%hoge%'だとINDEXはあっても使えない。

あと、FULLTEXT INDEXは今のところ日本語の検索には向かない。
あれは格納されているデータが半角スペースで単語に区切られている(=英文)と想定して
部分一致検索にINDEXを使える、というもの。

日本語でFULLTEXT INDEXを使える様にするにはmroongaとかがあるよ。

>>855で言っているやり方は転置インデックスと呼ばれるやり方で、
"MySQL 転置インデックス フルテキストインデックス"とかでググるとちらほら情報が出てくる。

がんばって。
859853:2012/09/06(木) 15:06:21.07 ID:???
>>858
うー なかなか部分一致を効率よくするには大変そうですね…
とりあえず言われた通り色々ググってがんがってみます。
860NAME IS NULL:2012/09/06(木) 22:42:49.23 ID:???
基本的な話しで恐縮ですが
テーブルの件数が多くなってパフォーマンスが落ちた場合
エンジンがInnodbなら、InnodbBufferPoolをでっかくすると思うんだけど
エンジンがMyisamの場合、どこをいじればいいの?
861NAME IS NULL:2012/09/06(木) 22:43:20.27 ID:kD3/4Jx+
mysql のチューニングの話しなんだけど
テーブルの件数が多くなってパフォーマンスが落ちた場合
エンジンがInnodbなら、InnodbBufferPoolをでっかくすると思うんだけど
エンジンがMyisamの場合、どこをいじればいいの?
862NAME IS NULL:2012/09/06(木) 22:54:19.34 ID:2PuTMH3G
postgres で

select birth_day + interval ’10 seconds';

を応用して

select birth_day + interval cast( a.n text ) || ' seconds' from ( select 10 as n ) as a;

に類することをしたいのだけど、シンタックスエラーになってしまいます。
不可能なんでしょうか
863NAME IS NULL:2012/09/06(木) 22:58:59.00 ID:???
cast( a.n text ) は cast( a.n as text ) のタイポっす。
失礼。
864NAME IS NULL:2012/09/07(金) 00:55:49.17 ID:8LvMxkPp
uga-
865NAME IS NULL:2012/09/07(金) 00:59:50.81 ID:???
to_timestamp
で自己解決しました。
866NAME IS NULL:2012/09/07(金) 09:51:06.43 ID:???
>>861
INDEX部分のキャッシュはkey_buffer_size、
データ部分のキャッシュはOS任せだから、
INDEXサイズと相談してkey_buffer_sizeを増やして、
それ以外は逆になるべくfreeにしてやるとOSのキャッシュが動きやすくなる。

レコードサイズが膨大になってるって話なら、パーティショニング。
867NAME IS NULL:2012/09/07(金) 15:32:24.31 ID:???
>>866
ありがとう!
参考にしてやってみます!
868NAME IS NULL:2012/09/07(金) 23:44:39.10 ID:Bf7kLZHy
最近MySQLに触り始めて、Statusをずっと見ているのですが

+------------------------+---------+
| Variable_name | Value |
+------------------------+---------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 3823 |
| Key_blocks_used | 39552 |
| Key_read_requests | 5222058 |
| Key_reads | 48824 |
| Key_write_requests | 594596 |
| Key_writes | 47872 |
+------------------------+---------+

こんな感じで、Key_blocks_usedの値がいつまで経っても増え続けます。
key_buffer_sizeを増やしていけば、いつかこの数字が動かなくなる時が来るのでしょうか?
Key_blocks_unusedが0になると重さ的にまずくなりますか? 512MBしかメモリを積んでいないPCなので、あまりkey_buffer_sizeを増やしたくはないのですが・・・
あとKey_writesの値が大きいのが気になります。これはどういうチューニングで数値を抑えられるのでしょうか。
869NAME IS NULL:2012/09/08(土) 13:30:42.68 ID:4J27k5Sp
mysqlの REPLACE文 を使って
カラム1とカラム2だけを更新しようとしました。

更新前 → 更新する値 → 更新後

カラム1 A → B → B
カラム2 A → C → C
カラム3 C → 未 → C

理想としてはこんな感じです。

ところが REPLACE文とは、一旦対象のレコードをデリートしてから
書き込むそうで

カラム1 A → del →  B → B
カラム2 A → del → C → C
カラム3 C → del → 未 → NULL

になってしまいました。
このデリートのロジックなくす方法はないですか?
素直にUPDATEでやれって感じですか?
870NAME IS NULL:2012/09/08(土) 14:09:35.71 ID:4J27k5Sp
解決しました
DUPLICATE KEY UPDATE
871NAME IS NULL:2012/09/10(月) 09:15:02.86 ID:???
genre_tbl
genre_id nt(5) PK
genre_kind varchar(30)
genre_idの99990,99999は特別な項目として予約
genre_idの99990,99999以外で使用している最大値を返す関数を作ろうとしています

select max(genre_id) from genre_tbl where genre_id not in (99990,99999);
で127が返ってきてるんで、これを
delimiter //
create function
sf_return_max_genre_id()
returns int
begin
return (select max(genre_id) from genre_tbl where genre_id not in (99990,99999) );
end //
delimiter ;

としたんですが、
+--------------------------+
| sf_return_max_genre_id() |
+--------------------------+
| 127 |
| 127 |
〜と複数の行が返ってきてます。ストアドファンクションって戻り値は一つだけではないんですか?
872NAME IS NULL:2012/09/10(月) 09:52:58.78 ID:???
>>868

Key_blocks_usedはMyISAMのインデックスがメモリに載ると増える。
上限は当然Key_buffer_sizeで、
Key_buffer_sizeがインデックスサイズの合計より十分大きければそこで止まる。

Key_blocks_unusedが0になっても、
よく使うインデックスがメモリに載ってればそこまで壊滅的なことにはならない。
頻繁にインデックスアクセスするテーブルのMYIファイルの大きさと比べて、
少なくともその分はkey_buffer_sizeを確保した方が良いかと思う。
(Key_blocks_*の単位はブロック(デフォルト1024byteだったかな?)なのでよしなに変換)

あと、Key_writesを減らすんだったらインデックスの数を減らすとかする。
でも、ちゃんと必要なインデックスで、更新もかかってるんだったら、
Key_writesが増えるのは当たり前なのでそんなに気にするところないと思う。
873NAME IS NULL:2012/09/10(月) 09:55:06.21 ID:???
>>871
それ、SELECT sf_return_max_genre_id() FROM genre_tblってやってない?
FROM指定すると、genre_tblの件数と同じだけ結果が返ってくるよ。
SELECT '0'だと1行だけ返ってくるけど、SELECT '0' FROM ..ってやると
テーブルの行数だけ返ってくるのと一緒。
874NAME IS NULL:2012/09/10(月) 09:59:37.13 ID:???
>>873
あぁっやってましたorz
そうだったんだ。ありがとうございます!
875NAME IS NULL:2012/09/10(月) 10:51:44.63 ID:???
>>872
なるほど、ちょっと確認してみます
ありがとうございました
876NAME IS NULL:2012/09/10(月) 18:55:30.39 ID:77QNIoWN
MySQLのステータス、Key_blocksとかConnectionsとかを見てると
一日一回くらいの割合で、数値がリセットされているのですが
これは正常な動作なのでしょうか、それとも知らない間に落ちてたりして勝手に再起動してたりするのでしょうか?
877NAME IS NULL:2012/09/11(火) 09:50:07.29 ID:???
>>876
Uptimeも巻き戻ってる?
Uptimeはmysqldが起動してからの秒数だから、
これも巻き戻ってるなら再起動してると思うけど。

Key_blocks_*は何もしなくてもキーキャッシュの破棄とかで減ったりすることもあるから
何とも言えないけど。
878NAME IS NULL:2012/09/11(火) 13:20:29.74 ID:uyhjbDfL
>>876
今確認すると、確かに起動時間が自分の認識よりずっと少ないです
落ちても勝手に再起動してくれるようになっているのでしょうか?
その前に落ちている原因を探る方が先ですが・・・
879NAME IS NULL:2012/09/11(火) 13:29:56.34 ID:uyhjbDfL
ログを見ると、restartがかかっているところで

This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help diagnose
the problem, but since we have already crashed, something is definitely wrong
and this may fail.

と書いてありました。ライブラリの破損がどうとか書いてありますが
具体的にどれを指しているのかが分からないとなんとも・・・
880NAME IS NULL:2012/09/11(火) 13:31:22.02 ID:uyhjbDfL
連投すみません、

It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = 321135 K
bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

つまりこれはメモリが足りないから落ちてるという事でしょうか
881NAME IS NULL:2012/09/11(火) 13:47:09.02 ID:???
>>880
This could be because you hit a bug..と
It is possible that mysqld could use up to..はmysqldがクラッシュした時の常套句。
本当にバグでもバグじゃなくても、メモリに問題があってもなくても出る。

大事なのは一番先頭とバックトレース。
先頭に近い方に、"mysqld got signal xx"って書いてない?
「それより更に手前の、タイムスタンプがついてなかったりするところ」と、
/usr/sbin/mysqld(handle_segfault..)とか書いてある辺りを見て、
その周りのメッセージで検索してみて。

あと、mysqld_safeを使ってる環境であれば、
mysqldがいなくなるとmysqld_safeが勝手に再起動してくれる。

がんがれ。
882NAME IS NULL:2012/09/11(火) 14:29:31.30 ID:uyhjbDfL
>>881
レスありがとうございます。ログを見ると、「mysqld restarted」から始まって
「InnoDB: Starting crash recovery.」・・・でリカバリが走って、その後
mysqld: Table 'general_log' is marked as crashed and should be repaired
mysqld: Table 'slow_log' is marked as crashed and should be repaired
となっていました。この二つのTableをチェックすると、確かに「error」とか「Table 'general.log' doesn't exist」とか出ていて
テーブルの修復も実行はされるものの何も変化が無いのですが、終了と起動は何事も無く行えます。

そしてその後、
SCHEDULER: Suspending operations
mysqld got signal 11;
>>880
>>879
となっていました。エラーで勝手に落ちる事もそうですが、それより寧ろTableが修復出来ない事と
errorになっていても普通に動いてる事の方が気になってしまいます。
883NAME IS NULL:2012/09/11(火) 14:47:00.64 ID:kpt7HVTE
すみません、ID変わりました
二つのTableはPhpMyAdminから操作すると何かおかしかったんですが、コンソールからやるとエラーが出なくなりました。
あとは「mysqld got signal 11;」のあとすぐに「This could be because you hit a bug〜」で
その後メモリが何とかと出てくるので、やはりメモリが原因でしょうか
884NAME IS NULL:2012/09/11(火) 14:51:59.88 ID:???
>>882
んー。
バックトレースの先頭に出てる関数の名前を適度にトリムして検索すると
バグなら見付かるかも知れない。

たとえば_Z26mysql_execute_commandP1THD+0x37b8
 ⇒mysql_execute_command、で検索。

壊れてるテーブルがgeneral_logとslow_logの2つだけなら動作には問題ないから普通に上がって動く。
ただし、ジェネラルログとスロウログは少なくともテーブルには吐けてない。

/var/lib/mysql/mysql/general_log.*とかslow_log.*は無事?
dでもなく大きくなったりしてない?
(それぞれ3つずつあるのが正しい状態)
あと、mysqlデータベースのgeneral_logとかDROP TABLEした?
それか、5.1未満(5.0, 4.1, 4.0, ..)から5.1以降にアップデートする時に
まるまるデータベースディレクトリコピーしてきたとか。
885NAME IS NULL:2012/09/11(火) 14:55:50.28 ID:???
>>883
あ、行き違った。

signal 11は確かにSIGSEGVだけど、
This could be because you hit a bug..と
It is possible that mysqld could use up to..は何が原因でもほぼ出るから
あんまり参考にはならないけれど。

メモリ関連で言うと、32bit Linuxで2GBの壁超えてたりとかする?
886NAME IS NULL:2012/09/11(火) 15:32:27.66 ID:kpt7HVTE
>>885
FreeBSDでメモリは512MBです
色々あるMySQLの使用メモリの計算式で計算してみても、現在の設定だと
300MBとか430MBとか必要になるので、これが一番怪しいかなと
887NAME IS NULL:2012/09/11(火) 15:45:24.91 ID:???
>>886
そうかー。。

ちなみに、俺の手元の環境は2GB Memory CentOS 6.2だけど、
VIRTに5GB/RSS 1.7Gくらい食わせても落ちたことはないなぁ。
(当然そこまでやるとswapはひどいけど)

役に立てなくてごめんー。
888NAME IS NULL:2012/09/11(火) 15:52:18.70 ID:kpt7HVTE
ありがとうございました
メモリの設定を見直して様子を見てみます
889NAME IS NULL:2012/09/11(火) 21:00:43.24 ID:1DTwZYME
5.5.11ではよくあるバグらしいよ。
うちもSIGSEGV食らって困りまくって、結局バージョン上げた。普通に治った。
890NAME IS NULL:2012/09/12(水) 08:17:03.96 ID:uxFpUlnF
適切なインデックスが設定されてるとして
億レベルのレコードがあるテーブルを
複数のテーブルに分ける(例えば1千万レコードずつ)のって検索速度的に意味ある?
891NAME IS NULL:2012/09/12(水) 10:46:52.69 ID:???
>>890
あるよ。
パーティショニングの方が良いと思うけど。
892NAME IS NULL:2012/09/12(水) 21:04:21.11 ID:yH/B7Dad
サーバー山ほど用意して、Spiderでパーティショニングですよ!
893NAME IS NULL:2012/09/12(水) 21:19:58.85 ID:???
>>891
横からで申し訳ないが、どのへんに効果があるのだろうか?
テーブルロックの影響範囲?(でも、ロックしたい時困りそう)
index 肥大化軽減?

ログテーブルなどは過去のデータを消しやすいように日付での
レンジパーティショニングしてるどそれ以外に
どういうメリットがあるか知りたいです。
894NAME IS NULL:2012/09/12(水) 22:55:31.63 ID:???
上で早さだと言ってるじゃないかw
895NAME IS NULL:2012/09/13(木) 03:06:42.03 ID:???
テーブル分割だと、連続していて欲しいデータが分断されちゃわない?
896 忍法帖【Lv=40,xxxPT】(-1+0:8) :2012/09/13(木) 10:04:02.62 ID:???
連続していて欲しいデータって、例えばどういうものかな?
897NAME IS NULL:2012/09/14(金) 02:59:55.66 ID:Bxso9aq/
PHPMyAdminで見ると、データベースサーバは「FreeBSD mysql-server-5.1.11」となっているのですが
ウェブサーバは「libmysql - 5.0.81」となっています。
どうしてこうなったのかは自分でもよく分からないのですが、libmysqlを5.1.11にするにはどうすればいいでしょうか?
事情でMySQLを5.5などにアップデート出来ないので、libmysqlのバージョンの方を合わせたいのですが・・・
898NAME IS NULL:2012/09/14(金) 16:52:54.52 ID:R26sG2cm
PhpMyAdminの状態から見るステータスと
show statusで見るステータスと数値が全然違うんですが
どっちを信用すればいいんでしょうか
899NAME IS NULL:2012/09/14(金) 17:55:48.87 ID:???
エンジンにmroongaを使った場合、optimize tableやanalyze tableに対応してないみたいで
mroongaの公式ページにもそのあたりの情報が乗ってないんだけど、やらなくていい仕組みになってるのかな
それとも、専用のメンテコマンドがあるんでしょうか。
900NAME IS NULL:2012/09/16(日) 10:19:20.16 ID:KcVHyoKg
質問させてください。

100万行程のCSVファイルをMySQLへ毎日流しこむ作業があります。
LOAD DATA INFILE構文を使おうと考えていますが、このCSVファイルは毎日少しずつ追加・編集されます。

既にあるDB内のデータと、CSVファイルを比較して
DBに無いデータは追加、修正・変更されているデータは更新といったような動きはできますでしょうか。

MySQLは5.5、サーバーはさくらのレンタルサーバ・スタンダードプランを利用しています。
901NAME IS NULL:2012/09/16(日) 11:24:08.08 ID:???
>>900

http://dev.mysql.com/doc/refman/5.1/ja/load-data.html

もし REPLACEを指定すると、インプット行は既存行を置き換えます。
言い換えると、主キーや固有インデックスに対して同じ値を持つ、既存行
であるという事です。詳しくは 「REPLACE 構文」 を参照してください。

もし IGNORE を指定すると、 固有キー値上の、既存行を複製するインプット行はスキップされます。
もしどちらのオプションも指定しなければ、その動作は LOCALキーワードが指定されたかどうかに
よって決まります。LOCALを利用すると、複製キー値が見つかった時点でエラーが発生し、テキスト
ファイルの残りは無視されます。LOCALを使用しなければ、デフォルトの動作は IGNOREが指定さ
れた時と同じです。これは、サーバは操作の最中にファイルの送信を中止する事ができないからです

902NAME IS NULL:2012/09/19(水) 10:33:03.11 ID:???
>>897
mysql接続用のモジュール(ウチの環境だと/usr/lib64/php/modules/mysql.so)が
libmysqlclient.so.16にリンクされてるからだと思う。
であれば、mysql.so/mysqli.so/pdo_mysql.so辺りの再コンパイル。

シンボリックリンクやリネームなんかで上手くいく場合もあるみたいだけど、
上手くいかなかった人も知ってるので個人的には再コンパイル推奨。

ttp://shimao-php-mysql.blogspot.jp/2008/05/mysql.html


>>898
言っているのがphpMyAdminの「状態」とかいうリンク先の情報と、
mysql> SHOW STATUS; の情報の違いであれば、
phpMyAdminから見ているのは"SHOW GLOBAL STATUS"の結果で
SHOW STATUSで表示されるのは"SHOW SESSION STATUS"の結果だから。

ttp://dev.mysql.com/doc/refman/5.1/ja/show-status.html
903NAME IS NULL:2012/09/19(水) 13:07:48.20 ID:Tn05cz/z
基礎的な質問なのですが
レプリケーションはデータベース単位ではなくて
サーバー単位で設定されるのでしょうか?
つまり、レプリケーションの設定を行えば、
マスターにデータベースを新規作成すると
スレーブにも自動的にデータベースが作成されるのでしょうか?
904NAME IS NULL:2012/09/19(水) 14:00:47.68 ID:???
>>903
デフォルトではそう。

オプションで
「あるDBのみレプリケーション」
「あるDBのみ除外」
「あるテーブルのみレプリケーション」
「あるテーブルのみ除外」
が設定できる。

ttp://dev.mysql.com/doc/refman/5.1/ja/replication-rules.html


そういえば5.5のマニュアル全然日本語化されないねぇ。
905903:2012/09/19(水) 16:07:30.79 ID:Tn05cz/z
>>904
おお、これは
詳しい解説ありがとうございます
906NAME IS NULL:2012/09/20(木) 03:30:28.37 ID:???
show tables; では確かに一覧の中に表示されるテーブルが、
select * from TABLENAME; では表示されません(Table 'database.TABLENAME' doesn't exist)。
原因は何が考えられるでしょうか。

具体的には…
データを同期させているノートPCとデスクトップPCでWordPressをいじってまして、当該テーブルは wp_* の各種テーブルです。
ノートPCでインストール・作成したWordPressが、同期したデスクトップPCではテーブルにアクセスできないために動きません。

両PCのDBはファイル単位(\xampp\mysql\data\database)で同期しています。
両PCから見える phpMyAdmin の表示は、当該データベースも特権ユーザー周りも同じに見えます。
WordPressのようなアプリケーションからではなく、自分で作成したテーブルは、両PCでこれまで問題なく動いてきました。

たぶんこれらの報告も同じ症状のように見えます。
http://okwave.jp/qa/q7544736.html?sort=datetime:ASC
http://hatomugi.sakura.ne.jp/forum/topic.php?id=108
http://aki.adam.ne.jp/bbs/question/detail.php?rt=683&id=683
907906:2012/09/20(木) 03:32:18.27 ID:heTxKW0o
age忘れ申し訳ありません。
908NAME IS NULL:2012/09/20(木) 11:01:30.26 ID:???
innodb auto_incrementについて質問です。
create table testtbl(
id int(5) auto_increment not null primary key,namestr varchar(3) default null
);
insert into testtbl(namestr) values('rrr'),('ff');
mysql> select * from testtbl;
+----+---------+
| id | namestr |
+----+---------+
| 1 | rrr |
| 2 | ff |
+----+---------+
2 rows in set
としておいて、
begin;
delete from testtbl;
insert into testtbl(namestr) values('ffd'),('srr');
comitt;
select * from testtbl;
mysql> select * from testtbl;
+----+---------+
| id | namestr |
+----+---------+
| 3 | ffd |
| 4 | srr |
+----+---------+
2 rows in set
idが3,4になりますが、これ、1からスタートさせることは出来ないのですか?
909906:2012/09/20(木) 11:24:24.34 ID:heTxKW0o
原因がわかりました。端的には「InnoDBでテーブルが作成されていたこと」が原因です。
これまでファイルコピーだけで便利に同期できていたのが、MyISAMのおかげだったとは知りませんでした。

MyISAMのテーブルの移動はもっと評価されるべき - (゚∀゚)o彡 sasata299's blog
http://blog.livedoor.jp/sasata299/archives/51345888.html

ファイルコピーしてもInnoDBだと別のPCで認識されないのは、どうしてでしょうか。
当該データベース・テーブルのファイルだけでなく、xamppのディレクトリ全体をコピーした上で、
MySQLの再起動も行ってなお認識しないのは、ちょっと不思議な気がします。
どのレベルの情報が同期されていないのでしょう。まさかWindowsのレジストリではないと思いますが。
910NAME IS NULL:2012/09/20(木) 13:09:05.74 ID:???
>>909
ibdata1コピーしてないんじゃないかなと思ったけど。
ibdata1は何も設定してなければ\xampp\mysql\data\ibdata1だと思うから、
\xampp\mysql\data\databaseだけをコピーしてるとコピーされないと思う。

InnoDBのテーブルは、データ実体がどこにあるか(ibdファイルなのかibdata1なのか)とか
ロールバックセグメントがどうだとか、InnoDBログファイルがどこまでチェックポイントされてるかとかを
ibdata1に書き込むから、ibdata1も一緒にコピーしないとテーブルとして機能しない。

あと、テーブルの移行先でibdata1を上書くときはくれぐれも気を付けて。
911NAME IS NULL:2012/09/20(木) 13:12:30.89 ID:???
>>908
ALTER TABLE testtbl AUTO_INCREMENT = 1;

ただしALTER TABLEは暗黙のコミットを引き起こすので注意。
ttp://dev.mysql.com/doc/refman/5.1/ja/implicit-commit.html

あと、必ず毎回空にするのであれば、
TRUNCATE testtblで中身をからっぽ&AUTO_INCREMENTを1に戻してくれる。
912NAME IS NULL:2012/09/20(木) 13:34:50.97 ID:???
>>904
>そういえば5.5のマニュアル全然日本語化されないねぇ。
オレはとっくにあきらめてる。orz

5.6では、正式リリースと同時とか
期待してるんだぜ。
913NAME IS NULL:2012/09/20(木) 17:57:41.80 ID:???
>>911
ありがとうございます。truncateでやることにします。
914NAME IS NULL:2012/09/20(木) 21:52:47.87 ID:vaj+9cSO
ここのURLにPHPで書かれているutf8_ngramをストアドプロシージャとして書き換える事は可能でしょうか。
http://d.hatena.ne.jp/k_yamamot/20100811/1281512139
915NAME IS NULL:2012/09/21(金) 10:33:51.71 ID:???
>>914
ストアドファンクションでできるよ。

空白の制御とか細かいところ作ってないけど、
20文字くらいを処理させるのに大体1ミリ秒弱だった。
916NAME IS NULL:2012/09/21(金) 13:57:17.82 ID:???
> 20文字くらいを処理させるのに大体1ミリ秒弱
え、1000回試行した1回あたり平均値の話?
917NAME IS NULL:2012/09/21(金) 14:18:24.61 ID:???
>>916
BENCHMARK関数使って10万回 * 3くらいやった平均。
918NAME IS NULL:2012/09/21(金) 14:19:09.41 ID:???
>>916
あ、INSERT部分じゃなくて文字列をパースして分かち書きにするところまで。。
919NAME IS NULL:2012/09/21(金) 15:30:38.31 ID:JY5vjra1
質問です。よろしくです。

10万件くらいレコード数があるものを

SELECT * FROM `shouhin` WHERE `check` = '1' ORDER BY `date` DESC LIMIT n*p, n

こんな感じで取り出してソートするとします。


n=1画面に表示する数 p=現在のページ数

checkには1か0しか入らない。
dateは 2012-09-21 12:00:14 みたいな形式。
(shouhinとdateにはインデックスを作っている)


もっと効率よい取り出し方はありますでしょうか?
920NAME IS NULL:2012/09/21(金) 16:17:31.91 ID:???
>>919
(`check`,`date`)の複合インデックスが良いんじゃない?
921NAME IS NULL:2012/09/21(金) 16:42:30.26 ID:???
>>920

レスありがとうございます。

他にも checkとpriceとか、checkとnoとか
色々な組み合わせで検索したりするんですが

それらも全部それぞれの組み合わせで
複合インデックスを作成しておいた方がいいという事でしょうか?
要するに、(`check`,`date`)、(`check`,`price`)、(`check`,`no`) とかで。

それとも全部纏めての複合インデックスの方がいいんでしょうか?
要するに、(`check`,`date`,`price`,`no`) とかで。

質問ばかりすみません。
922NAME IS NULL:2012/09/21(金) 16:59:11.40 ID:???
>>921
検索と更新の割合次第…としか言えないかなぁ。

インデックスは基本的に
・無駄なインデックスでも検索には基本的に影響が出ない
・有効なインデックスでも更新には常に影響が出る
ものだから、
更新が日に1回しかないのならがっつり作っちゃえば良いし、
更新が断続的に続くなら検索頻度が高い組み合わせだけで
複合インデックスを作った方が良い。

全部まとめて複合インデックスにするのは多分NG。
複合インデックスは順番どおりに使わないといけないってルールがあるから。

ttp://dev.mysql.com/doc/refman/5.1/ja/mysql-indexes.html

がんばれ。
923921:2012/09/21(金) 16:59:12.69 ID:JY5vjra1
(`check`,`date`)の複合を新たに作って試してみました。
現在はデータ件数6000件くらいのせいかほんの少ししか変りませんでした。
CPUが1GHzのヘボマシンなんですが
最初→0.73sec
現在→0.68sec
とかでした。

あと、既に checkとdateは個別のインデックスがあるんですが
個別で検索することもあるのでこの個別のインデックスは残しておいた方がいいんでしょうか?
つまり

(`check`)←既にあったもの
(`date`)←既にあったもの
(`check`,`date`)←新しく作成したもの

上記みたいにそれぞれ別にしておいた方がいいのでしょうか?
それか>>921に書いたように全部一緒にするのはどうでしょうか?
924NAME IS NULL:2012/09/21(金) 17:08:52.46 ID:???
>>923
`check`のカーディナリティが2だから、
複合インデックスにしてもORDER BY分しか速くならないからね。。

残しておくかどうかの基準は>>922といっしょ。
本気で見極めるなら、検索と更新のターンアラウンドタイムを取って確かめるしかない。
925921:2012/09/21(金) 17:09:23.31 ID:???
>>922
あっ、書いてる間にレスしてくれてたんですね(汗)
すみません。

そうですかー、全部纏めて作るのはNGなんですか。
そうなるとやっぱり組み合わせの分だけ作った方がいいような気がしますね。

データの追加とか更新はそこまで頻繁にはないので
検索重視のシステムを構築したいと思います。
ですのでやっぱりインデックスをがっつり作っておきたいと思います。

外部ページなんかも紹介してくださってありがとうございました。
非常に参考になりました。助かりました。どうもです。
926921:2012/09/21(金) 17:12:52.67 ID:???
おっと>>923の↓は
最初→0.73sec
現在→0.68sec
これの↓間違いでした… 一桁間違ってた。
最初→0.073sec
現在→0.068sec

>>924
レスありがとうございます。
カーディナリティですか?ちょっと勉強不足なんで調べてみますね。
更新頻度はあまり多くないので検索重視のシステムが作りたいと思っています。
自分でも色々調べてみますね。
927921:2012/09/21(金) 17:15:24.69 ID:???
あっカーディナリティっていうのは
checkには二通りの種類しかない=カーディナリティが2という事なんですかね。
確かにインデックス作ってもこれは効果が薄そうではありますね… う〜ん。
928921:2012/09/21(金) 19:23:06.79 ID:JY5vjra1
いやいやいやいや!
劇的に速度改善されました!

一応テストだったんで↓の最後のLIMITを指定せず
SELECT * FROM `shouhin` WHERE `check` = '1' ORDER BY `date` DESC LIMIT n*p, n

こんな感じでクエリ出して、スクリプト側からレコードを移動させて取り出していたんですが
SELECT * FROM `shouhin` WHERE `check` = '1' ORDER BY `date`

それだと
最初→0.073sec
現在→0.068sec
だったんですね。

でもLIMITを指定してから実行してみたら…
最初→0.73sec
現在→0.0014sec
になってました!

ただより遠くのレコードを取り出そうとすると
(要するに、n*p が大きくなると)
現在→0.046sec
くらいになってしまいますね(n*pが4000くらいです)。

ただ最初のあたりのレコードを表示させてる分には
メチャクチャ速くなってビックリしました。

でも何で遠くのレコード表示には時間が掛かるんでしょうね?
929921:2012/09/21(金) 20:10:54.05 ID:???
訂正です… ↓また最初のやつ一桁間違ったw
最初→0.073sec
現在→0.0014sec
これは↑間違えてないです〜
930NAME IS NULL:2012/09/22(土) 00:54:21.69 ID:???
>>929
それは良かった!

LIMITで指定するのが遠くなると遅くなる訳は少し長くなるけど、

・複合インデックスを指定する前
 ⇒WHERE `check` = '1'で多分インデックスが使えない
  (期待値的にインデックスを利かせるよりテーブルスキャンのが速いとオプティマイザが判断してると思う)
  ⇒20万行(レコード全部)テーブルからフェッチ。
 ⇒ORDER BYでもインデックスが使えない。
  (`date`にインデックスが無いから)
  ⇒取り出した20万行をテンポラリファイルに全て詰め込んでfilesort。
 ⇒LIMITでテンポラリファイルの先頭からn*p行を取り出して、n行クライアントに返す。
結局、20万行スキャンしてる。

・複合インデックスを指定した後
 ⇒WHERE `check` = '1'でインデックスが利く。
  ⇒仮に10万行スキャンとする。
 ⇒ORDER BYでもインデックスが使える。
  ⇒10万行(=WHERE句でHITした行数)をメモリ上でソート。
 ⇒LIMITでメモリ上のソート結果の先頭からn*p行だけをテーブルからフェッチして、
  n行をクライアントに返す。

n*pが小さければ小さい程実際にテーブルからフェッチする件数が減るから速い。
n*pがレコードの全件数に近くなれば近くなるほどテーブルからフェッチする件数が
全件スキャンに近くなるから差がほとんどなくなる。

て感じ。
931921:2012/09/22(土) 15:29:08.86 ID:???
やっと書き込めた!お礼遅くなりごめんなさいです!
>>930
非常に丁寧に細かい説明ありがとうございます。
やっぱり遠くにあるものを取り出す時は
処理コストが掛かるのはMySQLの仕様として仕方がないんですね。
安心しました。

とりあえずこの方向性でシステム調整して行こうと思います。
932NAME IS NULL:2012/09/23(日) 16:15:23.04 ID:???
例えば曲テーブルとジャンルテーブルがあって
一つの曲は複数ジャンルをもてる場合

音楽テーブルは
music_tabe
id(pk)
として、ジャンルテーブルは
music_genre_table
music_id(fk)
genre_id(pk)

music_genre_table
id(pk) auto_inclement
music_id
genre_id
みたいに持つのはどっちがよいですか。
音楽IDとジャンルIDで一意に特定できるので、上でもいいかと思うのですが
検索とか考えると下のほうが早いのかもと考え始めたらよく解らなくなりました。
933NAME IS NULL:2012/09/23(日) 16:28:09.62 ID:???
似たようなもん作っていて(音楽データではないけど)、下の作りでやってる
934NAME IS NULL:2012/09/23(日) 17:19:12.71 ID:???
>>932
上は音楽IDとジャンルIDで一意、じゃなくてジャンルIDだけで一意だがそれでいいのか?
下は音楽IDとジャンルIDでも一意じゃないがそれでいいのか?
935NAME IS NULL:2012/09/26(水) 02:42:34.22 ID:n63Twvlz
ライセンスがよくわからんのだけど、
受託でWEBアプリケーションを納品するときって、ソース公開しないといけないの?

それとも、MySQLの派生物じゃないから公開義務は発生しないの?
936NAME IS NULL:2012/09/26(水) 18:26:10.80 ID:???
>>935
俺もそんなに詳しくはないけど、
MySQL(や、その他GPLが適用されたプログラム)に含まれる
ソースコードそのものを取り込んで(改変して)いなければGPLは適用されない。

WEBアプリケーションを外部からアクセス可能にするだけでは
「再頒布」に当たらない(GPLなソフトウェアからの出力、と看做されたと思う)ので
GPLv2の再頒布にかかる規定(ソースコードの公開etc.)に従う必要はない。

ただ、客先への納品は再頒布だから、
・GPLが適用される ⇒ 客先へのソースコード公開が必要
・GPLが適用されない ⇒ 客先との契約次第
になる。いずれも客先への公開の問題で、世間一般に公開する必要はないはず。
937NAME IS NULL:2012/09/26(水) 19:24:05.06 ID:???
>>935
「MySQLの派生物じゃない」部分だけ納品するのなら当然GPLに従う必要はない。
938NAME IS NULL:2012/09/30(日) 12:05:15.66 ID:SqWyzZVW
初心者の質問です。
以下のような連想配列があります。

$_SESSION["login"]=array(
"name" => $row["name"],
"ID" => $row["ID"]
);

これの$row["ID"]1つだけを取り出したいとき、
どのように指定したらいいですか?
$user_ID に代入するとして教えてください。
939NAME IS NULL:2012/09/30(日) 12:06:38.06 ID:SqWyzZVW
間違えました…ここmysqlの質問板でした。
上の質問はスルーしてください。
940NAME IS NULL:2012/09/30(日) 15:18:51.96 ID:???
>>936, 937
さんきゅ。

>> 937
つーことは、MySQLのインストール作業をこっちでやらなければOKという解釈でもいいのか。
941NAME IS NULL:2012/10/02(火) 14:36:06.88 ID:/3YxDOCL
CREATE TABLE students (
 name CHAR(32) NOT NULL,
 PRIMARY KEY (name)
);

というテーブルがあって、name の頭文字を基準にパーティショニングしたい場合、
このテーブルに

 pn INTEGER NOT NULL // パーティション番号

のようなフィールドを持たせ、
データを挿入する際は、アプリケーション側で name の頭文字を判別し、
パーティション番号と共に挿入するという方法は安易な考え過ぎますでしょうか?

より精錬された一般的な方法があればご教授下さい。
942NAME IS NULL:2012/10/02(火) 15:56:42.19 ID:???
>>941
どうしても頭文字を基準にパーティショニングする必要がある?
ただ(それなりに)均等に分散すれば良いなら、KEYパーティショニングがすっきりすると思うけど。

ttp://dev.mysql.com/doc/refman/5.1/ja/partitioning-key.html
943NAME IS NULL:2012/10/02(火) 20:16:39.40 ID:???
rootで特定のデータベースに接続して、今現在どういうユーザーがそのデータベースに接続しているかって知る方法ありますか?
944941:2012/10/02(火) 20:22:21.86 ID:/3YxDOCL
>>942
パーティション関数に ASCII() を使えないということだけが問題だったので、
KEYパーティショニングで代用できそうです。ありがとうございました!
945NAME IS NULL:2012/10/02(火) 20:29:10.27 ID:???
>>943
SHOW PROCESSLIST;
946NAME IS NULL:2012/10/02(火) 20:33:43.37 ID:???
>>945
即レスtonですm(__)m
947NAME IS NULL:2012/10/07(日) 00:00:58.57 ID:???
mysql 5.5.15

mysqldumpでバックアップする時に外部制約の関係上、テーブル単位でバックアップ
しています。

それでテーブル以外のもの、ストアドプロシージャなどは

mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt hogehoge --default-character-set=cp932 -u xxxx -p > G:\Data\MySQL\fff.sql

としているんですけど、viewの定義とかはここには出てきていません。
viewの定義をバックアップする方法、教えてください。
948NAME IS NULL:2012/10/07(日) 22:48:59.87 ID:???
>>947
--no-create-info外せば取れるよ。
949NAME IS NULL:2012/10/07(日) 23:53:29.88 ID:???
>>948
ありがとうございます
テーブル定義と一緒にビューの定義も取れました。
950NAME IS NULL:2012/10/10(水) 14:22:18.59 ID:dQ01q0rX
LIKEで使える記号って % 以外に何があったっけか
951NAME IS NULL:2012/10/10(水) 15:07:22.57 ID:???
アンダースコア"_"とエスケープのための"\"
952NAME IS NULL:2012/10/12(金) 01:19:35.74 ID:???
>>951
ありがとう
953NAME IS NULL:2012/10/13(土) 01:13:59.81 ID:???
ODBC Connector 5.1.11だとプロシージャにOUTの引数を設定するとエラーになるけど、これはバグなのかな…
5.2.2にあげたら起きなくなったんだけど。
954NAME IS NULL:2012/10/13(土) 19:36:00.68 ID:VrFqSmlP
csvを標準入力からloadしたいんだけど、可能?
ファイルから入れる方法はありましたが、直接入れられる方が素敵です。
できなかったらcsvをinsert文に加工して入れようと思ってます。

mysql5.1
955NAME IS NULL:2012/10/14(日) 17:50:15.48 ID:SkZKtE+u
mysql-binってレプリケーションを利用していなかったら削除していいんですか?
それともMySQLがクラッシュした時にここからリカバリしてるんでしょうか?
956NAME IS NULL:2012/10/14(日) 21:07:11.70 ID:ZQIxLy7/
自然結合っていうのが具体的によく分からない。
RSの自然結合って例えばどういうことなのですか・
957NAME IS NULL:2012/10/14(日) 21:55:21.92 ID:i3Of/uN+
質問です
取引IDとかユーザIDとかを重複しない乱数で設定したく、乱数の一覧をまず用意しようと思います
で、5桁の16進数で乱数を作るとして乱数テーブルを3万行くらい作りたいんですがどうしたら良いでしょうか?
id, is_used
10001, 0
10002, 0

という形ですが、思いつくのはPHPで3万ループでinsertなんて方法だけです
もっと効率のいいやり方ありますか?どうしたら良いでしょうか
958NAME IS NULL:2012/10/14(日) 22:15:24.22 ID:???
>>957
insert select.
create table selectもあったっけ。
959957:2012/10/14(日) 22:41:15.41 ID:???
>>958
ご意見ありがとうございます、しかし知識不足のためかよくわかりません
それはデータをinsertするときやテーブルを作るときに既にあるテーブルからselectした値を
まとめて挿入する方法ですよね?
自分がしたいのは、
1)テーブルを作る
2)それに3万行のデータ(5桁の16進数で10001から3万)を入れる
という効率的な方法です
insert selectやcreate table selectするのに必要なselect元のテーブルが存在してない状況です
(自分の最初の説明がわかりづらかったならすみません)

自分のアイディアじゃPHPで10001〜40000を16進数に変更、それをinsertしか思いつかないので
もっと良い方法ないかなぁと。よろしくお願いします
960NAME IS NULL:2012/10/15(月) 00:18:26.67 ID:???
>>954
不可能。
でもINSERTに加工しなおさなくても、LOAD DATA [LOCAL] INFILEで入れた方が速いよ。


>>955
要らなければ消しても良い。
前のフルバックアップから、データ消失直前までのデータをリカバリする、なんて時に必要。
ただし、このリカバリは手動で実施。
あとは更新系のDMLが全部記録されるから、監査目的とか。

my.cnfにexpire_logs_days = 14とかやると、14日以上前のは勝手に消える様になるよ。


>>956
t1 NATURAL JOIN t2は
t1 LEFT JOIN t2 ON (t1.c1 = t2.c1 AND t2.c1 IS NOT NULL) AND (t1.c2 = t2.c2 AND t2.c2 IS NOT NULL) AND ..
と同義だったはず。
c1,c2..は、t1とt2で持っている同じ名前のカラム全てが列挙されるかたち。


>>959
乱数はどこかに行ったの?
10001〜40000が既に登録されてるテーブルを作って、
UPDATE t1 SET c1 = HEX(c1);
が楽なんじゃない?
961NAME IS NULL:2012/10/15(月) 00:23:18.57 ID:???
>>956
あ、ごめん、NATURAL JOINは結合に使用したカラムは一度しか現れないのがLEFT JOINと違う。
t1(c1,c2,c3) と t2(c1,c3,c4) なら、
SELECT * FROM t1 NATURAL JOIN t2;
は、
SELECT t1.c1,t1.c2,t1.c3,t2.c4 FROM t1 LEFT JOIN t2 ON (t1.c1 = t2.c1 AND t2.c1 IS NOT NULL) AND (t1.c3 = t2.c3 AND t2.c3 IS NOT NULL);
と同じになると思う。
962NAME IS NULL:2012/10/15(月) 15:45:20.59 ID:ZaN3mqjF
先ほどからmysqlを学び始めました
ストレージエンジンという設定があることがわかったのですが、
InnoDBっていうのとMyISAMというのがあります。
トランザクション機能をサポートしているとかしてないとかの違いがあるのですが、
このトランザクション機能というのがいまいちよくわかりません。
わかるように教えてください。
963NAME IS NULL:2012/10/15(月) 15:50:19.34 ID:???
トランザクションは簡単に言えば複数のSQL操作で
途中キャンセルした場合に最初の操作時まで巻き戻せる機能。
964NAME IS NULL:2012/10/15(月) 15:53:35.63 ID:ZaN3mqjF
>>963
なるほどありがとうございます。
それってコンソールから操作した場合の話ですよね?
PHPからコマンド実行した場合はどうなるんですか?その場合でもstart transactionとかcommitとか打たないとだめなんですか?
965NAME IS NULL:2012/10/15(月) 16:39:33.00 ID:???
IPSて話題の森口見てこのスレの基地外おっさん思い出したよ
もういなくなったみたいだね
ああいう感じの人だったんだろうなぁ
966NAME IS NULL:2012/10/15(月) 20:08:43.48 ID:ZaN3mqjF
ユーザ作成するときに、identified by 'test'
って書くこの名前は何を意味していつ使うんですか?
967NAME IS NULL:2012/10/15(月) 21:10:00.01 ID:???
>>964
php (mysqli,pdo_mysqlなど)からも同様。
ただし、使うライブラリによっては autocommit がデフォルトになってることもあると思う。

>>966
msyql に cli などでつないで、
help grant をみると幸せになれると思う。
968NAME IS NULL:2012/10/15(月) 21:44:52.05 ID:ZaN3mqjF
>>967
なるほど
ありがとうございました!

今までずっとsqlite使ってたんですが、charとかtext型使ってたんで、
mysqlみたいにいちいち文字数やバイト数を指定するのに違和感を感じるんですが、
普通はちゃんと指定して作ってるんでしょうか?

それともmediumtextとかlongblobとか使ってるんでしょうか?
969NAME IS NULL:2012/10/15(月) 21:49:17.29 ID:ZaN3mqjF
何度も質問で申し訳ないんですが、

identified by '文字列'


ここの文字列の部分はパスワードってことでいいですか?


でもたまにidentified by password '文字列'

の構文もあったんですが何が違うんでしょうか?

後者の方はユーザ作るときだけとかでしょうか?
970957:2012/10/15(月) 22:43:18.44 ID:???
>>960
どうもありがとうございます、おかげで解決方法にたどり着きました
971954:2012/10/15(月) 22:59:52.78 ID:???
>> 960
ありがとうございます。cronでshellを動かすので遅くていいのですが、できないならしょうがないですね。

>> 959
ごめんなさい、複数行の生成ができるのはpostgresでした。
# select generate_series(1,3);
generate_series
-----------------
1
2
3
972NAME IS NULL:2012/10/16(火) 05:37:52.51 ID:???
>>969
identified by 'foo'
の場合は、password('foo') (パスワード暗号化関数を実行)した結果が登録される。

identified by password 'foo'
の場合は、foo がそのまま登録される。

mysql はユーザー認証の際に、password('foo') した結果と、
mysql.user の password カラムで内容が一致するか確認するので、
前者は password: foo でログインできるが、後者はできない。

identified by password はどっか別の DB から mysql.user をみてコピーする際や、
手元で selelect password('foo') とかして履歴にパスワードの生文字列を
残したくない場合に使うぐらいなのかな?

つまり foo をパスワードとしたユーザーを登録したい場合は、
identified by 'foo'
または
identified by password '*F3A2A51A9B0F2BE2468926B4132313728C250DBF'
となる。
ちなみに、password 関数は MySQL 4.1 あたりで変更されてるので注意
973NAME IS NULL:2012/10/16(火) 07:40:45.08 ID:yFJZYlxr
>>972
そんな仕組みがあったとは・・
勉強になりました
ありがとうございました!
974NAME IS NULL:2012/10/17(水) 16:53:18.86 ID:ZQKaKcpQ
MySQL5.5でutf8mb4を使いたいのですが、自作したPHPでpostして保存すると、
コマンドからもPHPMYADMINからも文字化けしてしまいます。
show variables like 'character_set%';をしても文字コードはあってると思うのですが。(以下がその結果です)
character_set_client | utf8mb4
character_set_connection | utf8mb4
character_set_database | utf8mb4
character_set_filesystem | binary
character_set_results | utf8mb4
character_set_server | utf8mb4
character_set_system | utf8
PHPでデータを読み込む場合は文字化けせず表示されています。
どうすれば解決するでしょうか?よろしくお願い致します。
975NAME IS NULL:2012/10/17(水) 17:00:03.95 ID:tlC3fdR4
mysql5.5を使っています
show column from table を実行した時に成功する時と失敗する時があります
最初は対象テーブルに行(データ)がない時はエラーになるのかと思ったのですが、
データがあっても失敗するものもあります
どういう条件で失敗するのでしょうか?
976974:2012/10/17(水) 18:27:47.23 ID:???
再インストールで直りましたすみません。
977NAME IS NULL:2012/10/17(水) 19:25:23.65 ID:???
>>975
失敗したことがないからわからないのだが、
どういうエラーが出るのか教えて欲しい。
# show columns from table_name の typo だよね?

あと、
desc[describe] table_name;

select * from information_schema.columns where table_schema=db_name and table_name=table_name;
だとどうなるか。
可能性としてはテーブルの情報がおかしいからテーブル作りなおしたほうがいいんじゃないかなと思う
978975:2012/10/17(水) 20:26:18.28 ID:tlC3fdR4
>>977
ありがとうございます、typoしてましたすみません

desc order するとshow columnsと同じエラーが出ます
#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 'order' at line 1

select * from information_schema.columns where table_schema=dekitala and table_name=order;
だと以下のエラーです
#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 'order LIMIT 0, 30' at line 1

対象のorderテーブルは以下のクエリで作りました。おかしいでしょうか
create table `order` (
id varchar(30) primary key not null,
sellerType varchar(20) not null,
sellerId int(11) not null,
buyerType varchar(20) not null,
buyerId int(11) not null,
is_used tinyint(1) not null,
seller_addressId int(11),
buyer_addressId int(11),
)
979NAME IS NULL:2012/10/17(水) 21:12:26.12 ID:???
>>978

desc `order`;
980975:2012/10/17(水) 21:22:11.51 ID:???
>>979
ありがとうございます
しかし、エラーです
>#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 'desk `order`' at line 1

なんでだろう。。
981NAME IS NULL:2012/10/17(水) 21:26:41.89 ID:???
>>980
× 'desk `order`'
○ desc `order`;
982975:2012/10/17(水) 21:28:29.85 ID:???
あっ!うまく行きました!
alter table `order` rename to `orderx`;
してテーブル名を変えたところ、
desc `orderx`; が正常にテーブル構造を返しました!

どういうことでしょうか?
と、思って調べたら、テーブルに利用禁止な予約語だったみたいです
お恥ずかしい、お騒がせしました。ありがとうございました
983975:2012/10/17(水) 21:37:48.16 ID:???
すみません、やはりもう少しお願いします
deskの失敗するテーブル`color`を`colorx`に名前変更し、さらに`color`に名前変更したら
今度はdesk成功しました
どういうことなんでしょうか? 流れは以下のようになります

desc `color`; →失敗
>#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 'desk `color`' at line 1
//テーブル名変更
alter table `color` rename to `colorx`;
//desk
DESC `colorx` →成功
//テーブル名元に戻す
alter table `colorx` rename to `color`;
//color
DESC `color` →成功

984975:2012/10/17(水) 21:40:17.10 ID:???
>deskの失敗するテーブル
descでした、すみません
985NAME IS NULL
>>974
接続時に文字コード指定が要る
http://www.artful.jp/blog/archives/2006/07/xamppmysqlphpmy.html

set namesとかでぐぐれ

「PHPでデータを読み込む場合」はなにで接続してるんだ