1 :
だよもん!!! :
2007/09/23(日) 10:57:29 ID:RN+MewUh
3 :
NAME IS NULL :2007/09/24(月) 21:17:06 ID:pceZ+XvF
連続のUPDATEの際、INSERTのように1文で書くことはできますでしょうか? 以下のように書いてみましたができませんでした。 UPDATE hoge SET title='HOGE1' WHERE seq=1, hoge SET title='hoge2' WHERE seq=2;
更新データを蓄えるための作業用のテーブルを作ってよければ、こんな感じで。 update test1 set col2 = (select test2.col2 from test2 where test1.col1 = test2.col1) where col1 in (select col1 from test2); 普通はこんなことしないと思うけど…
5 :
NAME IS NULL :2007/09/25(火) 03:54:31 ID:QTKb0E3V
>>4さん レスありがとうございます。 普通は一回一回UPDATEするということでしょうか? 連続で4回ほどUPDATEすることが確実なのでINSERTのように連続でINSERTすることで負荷を軽減したいと思ったのですが・・・
UPDATEはB-TREE索引をたどって該当行をつかむ→書き換える、 って流れだから、もし1つのSQLで複数まとめて書く文法があったとしても 内部動作的はこれを1回ずつ繰り返すしかない。 だから効率的にはならないんだよ。 INSERTは表の末尾に一度に書き込めばいいから効率的にできるけどね。 というわけでUPDATE4回投げましょう。 同じUPDATE文でパラメータが違うだけなら PreparedStatement(JDBCの場合)をつかってSQLの解析コストを減らしましょう。 あとは、4回というのが確定ならそのための専用のストアドプロシージャを 書けばクライアント⇔サーバ間の通信量とかは減らせるね。 (ストアドの中では結局UPDATEを4回やるわけだけど)
7 :
NAME IS NULL :2007/09/25(火) 13:13:39 ID:I2co02Wi
MySQL4.1でsortの基準をExcelと同じようにする方法はありますでしょうか? 以下のような場合でselect時にsortすると --------------- insert into test(str) values('5'),('a'),('ア'),('イ'),('あ'),('い'); MySQLでは あ->い->ア->イ->5->a Excelでは 5->a->ア->あ->イ->い --------------- になります。MySQLでExcelのようなsort方法は可能でしょうか?
おまえら、まだ前スレが残っていますよ。
ほっとけば落ちるから問題なし
10 :
NAME IS NULL :2007/09/28(金) 04:44:53 ID:e5bj6BJY
あげ
11 :
NAME IS NULL :2007/09/30(日) 22:18:21 ID:kM0xx8Ko
こんにちわ表をCRETE TABLeでつくってるのですがレコードの名前と型の名前のかきかたと 型の数字だけ表示するやり方がわかりません ちなみに名前はCO CO COUNTRY_NAMEで型がREGION_IDです よろしくおねがいします ちなみに表の名前はcountriesで 表をだすときは SELECT * FROM COUNTRIES: です教えてください
12 :
NAME IS NULL :2007/10/01(月) 01:08:52 ID:k3mU4g8h
質問させて下さい。 以下のようなテーブルがあります。(他の情報は省略してます。) tableAにidを4つまで登録することができます。1つのみ登録することもあります。 tableBにidの名称を持っています。 tableA | id1 | id2 | id3 | id4 | +-----+-----+-----+-----+ | 001 | 002 | 003 | 005 | | 002 | | | | tableB | id | id_name | +-----+---------+ | 001 | name1 | | 002 | name2 | | 003 | name3 | | 004 | name4 | | 005 | name5 | | 006 | name6 | この時、↓のような結果を求めるsqlを教えてください。 | id1 | id_name1 | id2 | id_name2 | id3 | id_name3 | id4 | id_name4 | +-----+----------+-----+----------+-----+----------+-----+----------+ | 001 | name1 | 002 | name2 | 003 | name3 | 005 | name5 | | 002 | name2 | | | | | | | よろしくお願いします。
select A.id1, B1.id_name, A.id2, B2.id_name, A.id3, B3.id_name, A.id4, B4.id_name from tableA A, tableB B1, tableB B2, tableB B3, tableB B4 where A.id1 = B1.id and A.id2 = B2.id and A.id3 = B3.id and A.id4 = B4.id ; わりとFAQ?
TableAの設計が間違ってると思うのは漏れだけ?
>>14 おばあちゃんが言っていた
なんでも正規化すればいいわけじゃない ってな
以下のようなテーブルがあります。(他の情報は省略してます。)
馬鹿には見えないテーブルか
19 :
NAME IS NULL :2007/10/03(水) 14:50:47 ID:L9QuLInZ
ORDER BYで近い数値順に並べ替えとかできませんかね? 2500に近い順 var 1945 4278 5362 4896 3542 1457 1234 ↓ var 1945 1457 3542 1234 4278 4896 5362
>18 鮫島に関する投稿は消されるんだよ素人
select hoge from fuga order by abs(hoge - 2000)
掲示板に3分以内に投稿されたレスの数を取得するSQL文を書こうと思っています。
http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html を見たのですが、比較部分をどうすれば良いのかが分かりません。
SELECT COUNT(*) FROM `res_t` WHERE dateTime_c >= SUBTIME(NOW(), '00:03:00');
みたいに書いたら一応エラーにはならないのですが、正しく比較できているか (日時が数値変換されて変に比較されていないか) が不安でしょうがありません。
上のSQL文で正しいかどうか、間違っていればどこを修正すれば良いのかを、ご教示お願いします。
23 :
NAME IS NULL :2007/10/04(木) 17:32:35 ID:Iv269TDK
質問します 会員管理システムで、ログイン後ユーザ情報編集画面に移るようにしたいんですが、 ログイン用のIDとPassは名前や電話番号などのユーザ情報テーブルの 中に入れてもいいんでしょうか? それとも、ログイン確認用の専用のテーブルを持たせるべきでしょうか みなさんはどのようにしていますか? また、各情報の編集のために複数の編集ページを行き来するたびに、 セッションでID/Passを随時確認した方がいいんでしょうか? だいたいこんな感じでやっているというのを教えてください。 よろしくお願いします -------------- webプログラム板で質問したんですが、板違いといわれてこちらで再質問させてもらいました
俺にはweb板が正しくここが板違いにみえるが。。。
>>23 MySQLなんて大げさなやつじゃなくて
PHPのAPIのSQLite使ったセッション管理使えばいいんじゃね?
PHPスレかSQLiteスレに行くといいと思うよ。
PHPスレで拒否られてるんだよ、
>>23 は。
PHPスレでDBの作りの質問をし、MySQLスレでWEBセッション管理の質問
も追加してくれば、どちらでも違和感感じる罠。
PHPとMySQL固有の話じゃ無いんだから、もっと一般的な話題のスレで
聞くべき。
で、要求されるセキュリティのレベルが分からない以上、お好きなように
としか言いようが無い。
>>26 一度や二度のアタックであきらめるような恋なら最初からするな。
はあ?
規模にもよるけど悩むぐらいなら作れって あ、ねぇきいてきいていますっごいいっぱいうんこでてるよ すっごいいっぱい うんこが でてるんだよ 俺の体内しか知らなかったうんこたちが 噴流となって体外へと このタイムスタンプが俺とうんこたちとの生きた証、メモリー トイレからカキコ
30 :
NAME IS NULL :2007/10/05(金) 11:27:29 ID:+u0dyj/F
すみませんが質問させてください。 MySQL5.0 LIKE演算において[0-9]や[A-C]などの構文ってサポートされていないのでしょうか? 自分で調べたらAccessではできるみたいなのですが・・・。 できないのであれば、同じことを実現する方法ってありますか? 具体的には・・・ <<data>> CF47 AD27 EZ12 から先頭のアルファベットがA-C、二番目のアルファベットがC-Gを SELECTしたいのですが、俺がアホなのか何回やっても構文エラーが 帰ってきます・・・。
like 'AC%' or like 'AD%' or like 'AE%' or .... or like 'AG%' or like 'BC%' or ... like 'CC%' or ...
32 :
30 :2007/10/05(金) 11:43:36 ID:+u0dyj/F
>31 ありがとうございます。 まじっすか!? 力技しかないのか〜。
where data between 'A' and 'C' and substr(data, 2, 1) between 'C' and 'G'
34 :
30 :2007/10/05(金) 14:10:13 ID:+u0dyj/F
おぅおぅ!感動っす♪ ありがとうございました。
35 :
NAME IS NULL :2007/10/05(金) 21:27:23 ID:ywDCVcNs
38 :
NAME IS NULL :2007/10/06(土) 09:02:35 ID:ALRD9ApN
"GROUP BY column"となっているときcolumnがNULLの時は纏めたくないのですが、 どのようにしたら良いでしょうか?
39 :
38 :2007/10/06(土) 09:04:18 ID:???
すみません、Ver 3.23です。
WHERE column is not null GROUP BY column
41 :
38 :2007/10/06(土) 12:06:44 ID:???
>>40 ありがとうございます。
ですが、それだとcolumnがNULLのものは、纏める纏めない関係無しに
全て表示されなくなってしまうのですが。。
mysqldumpでDBのフルバックアップを二回取ったんですが、 一回目取った分と二回目に取った分の差分を埋めることってできませんかね?
これでどう select ... from ... where column is not null group by column union all select ... from ... where column is null;
44 :
38 :2007/10/06(土) 12:36:43 ID:???
>>43 ありがとうございます。
うーん、それしかないですかね。。二つクエリ発行するのは負荷の都合から避けたいのですが。
じゃあ NULLはまとめない⇒NULLにダミー値を差し込む という方針で select col2, col3 from test; +------+------+ | col2 | col3 | +------+------+ | 1 | 1 | | 1 | 2 | | 2 | 1 | | 2 | 2 | | NULL | 1 | | NULL | 2 | +------+------+ select max(col2) into @r from test; select case when col2 is null then @r := @r + 1 else col2 end dummy1, count(*) from test group by dummy1 ; +--------+----------+ | dummy1 | count(*) | +--------+----------+ | 1 | 2 | | 2 | 2 | | 4 | 1 | | 6 | 1 | +--------+----------+ @rが2ずつ増えるのが謎…
ワロス 3から始まらないのも謎...
48 :
NAME IS NULL :2007/10/07(日) 09:03:47 ID:QwQK+lic
A,B,Cというカラムがありまして、 A,Bの項目が重複しているレコードを全て取得したいのですが、どのようなSQLを発行すれば宜しいでしょうか? A,B,C "男","東京","新宿" "男","東京","池袋" "男","東京","渋谷" "女","神奈川","横浜" "女","東京","新宿" ↓↓↓↓↓↓↓↓↓↓↓↓(■"男","東京"が重複しているレコードを取得したいです) "男","東京","新宿" "男","東京","池袋" "男","東京","渋谷" A項目B項目とも内容が不定なので、WHERE文が作れなくて挫折してしましました。 宜しくお願いします。
group by dummy1 の中でも @r := @r + 1 が評価されてしまっている select max(col2) into @r from test; set @s := 0; select case when col2 is null then @r := @r + 1 else col2 end dummy1, @s := @s + 1, count(*) from test group by dummy1 ;
>>48 SELECT a, b, c FROM test WHERE a In (SELECT a FROM test GROUP BY a, b HAVING Count(*) > 1) ORDER BY a, b;
>>50 ありがとうございました。
出来ました!!
色々四苦八苦していたので助かりました。
すみません、テーブルを作っていたら以下のようなエラーが出ました 本の通りしたつもりなんですが、どういう問題なのでしょう? mysql> create table 'saloon_kihon'( -> 'sId' int(10) NOT NULL auto_increment, -> 'loginId' varchar(32) -> ); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''salo on_kihon'( 'sId' int(10) NOT NULL auto_increment, 'loginId' varchar(32) )' at line 1
>>52 single quoteではなくてback slashだろw
>>53 本当にすみません どこの部分でしょう?
ドシロウトなので、自分なりに慎重にやってるつもりなんですが、、
もう少し詳しくお願いします。
「'」と「`」は違う文字
DBにデータをinsertしまくってるんだけど、 /var/run/mysqld/mysqld-bin.000001 /var/run/mysqld/mysqld-bin.000002 …以降,1GB超えると次の番号へ というバイナリが異常なペースで肥大化しているんだが、このファイルは何? ログだとは思うんだけど、サイズ指定とか場所変更する方法はないかな /varのパーティションサイズがさしてでかくないから困ってる /etc/mysql/my.cnfにそれらしき設定項目も無い だれかヘルプ
log-binっていうそれらしき設定項目があるはずなんだが
>>57 確かにあった、これだったのか。
log-bin
とだけしかなかったら何かわからずスルーしていたんだけど、
log-bin=/hoge/log
とかすれば場所変更できるみたいだね!
dクス
>>60 ありがとう。
あとは有効期限(expire_logs_days じゃ無理かな?)を指定できればいいんだけど、
検索すべきキーワードもわかったから、あとはなんとか自分で調べるよ。
hogeフィールドのデータが 「yama,kawa,tani」のデータに対して、 yama か kawa か tani であれば一致するようにしたい場合、 WHERE hoge REGEXP (yama|kawa|tani) でいけるかと思いますが、 他にもっとスマートな関数や演算子とかないでしょうか。 説明へたくそでスマソ。伝わるかな(汗
hoge in ('yama','kawa','tani') これ?
MySQL Command Line Client で何か select 文を発行すると mysql> select count(*) from hogehoge; +----------+ | count(*) | +----------+ | 999999 | +----------+ のように - や | や + で整形して表示されますが、これらを自由に設定するには どうしたらいいですか? ORACLE でいう SET COLSEP=hemohemo という感じです。
66 :
64 :2007/10/08(月) 12:30:42 ID:???
>>65 ガ━━(゚Д゚;)━━━ン!!!!!
ありがとうございましたorz
現在InnoDBのサイズが60G超えてるんだけど mysqldを起動するだけで激しいI/Oが発生する 止めれば発生しない ディスク使用量に変化は無く、ただCPU3〜4%を食いながらメモリ量が上下しているだけ 8時間たった今もかわらずHDDが絶えずカリカリ mysqldは何してるの?
68 :
67 :2007/10/08(月) 16:43:34 ID:???
↑の質問はスルーでお願い。 そもそもプログラムミスでコミットの粒度が大きすぎたのが原因かも。 直してもなるようだったら、また質問させてもらうよ
InnoDBは大量にINSERTしたデータをいったんInsert Bufferというところに ためて、あとから非同期にテーブルに差し込む。 この処理のことをInsert BufferをMergeするって言う。 だからトランザクションをいっぱい流すと、 その後mysqld再起動してなんも触ってないのにカリカリいうことはある。 show engine innodb statusでINSERT BUFFER AND ADAPTIVE HASH INDEX のセクションを眺めてなんだか忙しそうなら当たり。 innodb_fast_shutdown = 0にするとmysqldは停止時にInsert Buffer Mergeを 完了させる。でもマニュアルには「これらの操作には数分間、または極端な 場合には数時間かかる事があります。」と書いてある。
パスワード無しでテーブルの有無を確認するだけのユーザーを作りたいのですが、 どのような権限を与えればいいのでしょうか?
>>55 ありがとうございました
フィールド名って「'」でくくらなくてもOKなんですね
なんで自分の本はくくってるんだろう、、 ともかくありがとう
>>71 いやフィールド名で使うのは「'」ではなく「`」。
>>72 おお、出来ました
というか、パソコン買って8年目にして初めて「`」の存在に気づきましたw
ありがとうございました!
数字を含むカラムがあって その中からある範囲の数字を含むレコードが 存在するかしないかだけを調べるにはどうすればよいですか
76 :
NAME IS NULL :2007/10/09(火) 09:19:10 ID:NjjCqEdh
SELCT COUNT(*) TOTAL FROM SAMPLE WHERE COLUMN > 0 AND COLUMN < 100;
77 :
NAME IS NULL :2007/10/09(火) 17:35:33 ID:/I5hC7wb
合計で数百万行で1.5GB相当のデータを47分割してテーブルに格納しています。 検索するときに、全てを結合させて検索していますが、 結合させずにひとつのテーブルに全てのデータを格納しているときと、 処理速度は変わらないのでしょうか? ためしてみようと思ったのですが、1.5GBほどのデータ量のため、とても時間がかかってしまいます。
>全てを結合ってどういうこと? つまりSEXってこと。
80 :
NAME IS NULL :2007/10/09(火) 19:47:45 ID:v9b6pzkg
なんでスケールを小さくして試してみようとは思わないのかしら?
1テーブルに数百万行の状態で検索した場合の速度が知りたいからじゃね?
82 :
59 :2007/10/09(火) 21:55:34 ID:???
>>74 RANGE か BETWEEN てなかったっけ?
CREATE TABLE `users` ( `username` char(30) NOT NULL default '', `userpasswd` char(20) NOT NULL default '', ); INSERT INTO `users` (`username`, `userpasswd`) VALUES ('wildcard', '%'); 上記のようなテーブル・データを作成して 下記のようにSELECTしてみましたが、username wildcard は セレクトされませんでした。 どこがだめでしょうか? SELECT * FROM `users` WHERE `userpasswd` = 'abc';
フィールドの値をベースに正規表現で比較するのって可能でしょうか? SELECT field FROM `table` WHERE 'keyword' REGEXP field; で一応うまく検索かけれるんだけど、これって正式にサポートされてるんでしょうか? また、 WHERE 'keyword' REGEXP ^field$; みたいに記述したい場合はどうすればいいんでしょうか。 ちなみにこれでは文法エラーがでます。
>>84 そりゃ username = 'wildcard' のレコードの userpasswd カラムの値は
'abc' じゃないからだろ
>>85 1番目 REGEXPの演算子の問題だから、フィールド値を左右どっちに使っても問題ない。
2番目 WHERE 'keyword' REGEXP CONCAT("^",field,"$") でいけるかな。
1 にしても 2 にしても遅そうだけど。
データベースに保存されているデータを 丸々そのまま別のところで使用したい場合、 どうすればいいのかな? 容量は3GB近くなんだが・・・
DB止めれるならtar玉で圧縮したら?
>>89 鯖にもよるんですね
さくらのプロ借りてますが、/db/ってとこに入れればいいのかな・・・?
91 :
84 :2007/10/10(水) 13:36:35 ID:???
どんな条件でもヒットするような フィールド値って存在しないんでしょうか? %にすれば何でもヒットしてくれるかな、というあふぉな考えをしてました。
92 :
84 :2007/10/10(水) 13:39:47 ID:???
そういえば、 mysqlデータベースのuserテーブルって、Hostフィールドが%で機能してますよね。 あれは、MySQLのユーザ処理部分がそういう風に作られてるだけで 一般的な使用方法は無理なのでしょうか。
93 :
84 :2007/10/10(水) 13:40:50 ID:???
>>90 さくらならphpmyadminでエクスポートすればよいのでは。
>>93 インポートかな・・・?
流石に3GBもあるのを一度にインポートするのは大変な気も・・・
たとえ分割してても
>>91 存在しない 意味がないから
>>92 このカラムを読み込んだプログラムが
% の場合は任意のホストとして扱う、という処理なんだろう きっと、、、
>>90 さん、レンタルサーバーを借りているなら、仕様書なりありませんか?
また、サポートなどで聞くことはできませんか?
Linux(など)の場合、サービスディレクトリはサーバーの設計を行った人にしかわからない
かと思います。
また、DBが共有サービスであれば、DBを止めることもできないかと思われます。
サーバーへログイン可能であれば、
http://www.nilab.info/zurazure2/000659.html こういったものを参考にできませんでしょうか?
>>91 確かにそういう特殊な値はほしいときがあるね
>>84 SELECT * FROM `users` WHERE 'abc' like `userpasswd`;
で絞り込んだ後、フロントエンドで処理するんじゃだめ?
99 :
NAME IS NULL :2007/10/10(水) 15:44:38 ID:g44V9bOq
>>98 もしくは素直にNULLを入れといて
SELECT * FROM `users` WHERE `userpasswd` = 'abc' or `userpasswd` is null;
する方が素直かな。
>>96 は?何か?
>>90 show variables like "datadir";
でDBのデータディレクトリを特定
FLUSH TABLES WITH READ LOCK;
でDBのカキコ禁止
データディレクトリを丸ごと tar zcvf
終わったらカキコ許可
UNLOCK TABLES;
でsftpとか lftp で tarしたDBファイルを引越し先にput
後はわかるだろう。
もしかしてさんざん既出かと思うのですが、ざっとググった限りでは解決しなかったので 質問させてください。 今サーバで動いているMySQLはrpmでいれた5.0.22なのですが、コンパイルオプションとして dont_use_default_fieldsを指定した動作になっているようです。開発環境のWindows版とで insert時の挙動が異なり、大変不便な思いをしています。 これを解決するにはソースからコンパイルするほかないんでしょうか? なお現在手に入る最新のrpmは以前のstandardではなくcommunity版となっており、 コンフリクトのためインストールできませんでした。
そのとおり
mysql> show global status; で出てくる送信バイト数Bytes_sentの値が、32bit(4GB)で桁あふれして ゼロに戻っちゃうんですが、仕様ですか? いまどき、4Gとかで桁あふれされても困るんですが。 何回桁あふれたかperlスクリプトか何かでチェックしてバイト数だすのとか面倒くさす どうにかなりません?
すまんかった、今すぐOpteron買ってくる!
アルェー(・3・)うち5.0.45なんだけドー と思ったら The Bytes_received and Bytes_sent status variables could hold only 32-bit values (not 64-bit values) on some platforms. some platformsっすか・・・
111 :
NAME IS NULL :2007/10/11(木) 00:46:49 ID:+sOrpx9+
すまんが、データベース内で、文字列の中から2つ以上並んだスペースを1つのスペースに置き換えることって出来ないかなあ? 「あ_い___うえ____お」→「あ_い_うえ_お」 こんな感じで。 一回、スペースで切り分けて、スペースを除去してからスペースを一つつけてつなぎ合わせるしかないのかな???
スペース3個をスペース2個に置換をできるかぎりやる 1個→1個 2個→2個 3個→2個 4個→3個→2個 5個→4個→3個→2個 となって、必ずスペース1個か2個になる。 スペース3個がなくなったら、スペース2個を1個に置換すればおk
113 :
NAME IS NULL :2007/10/11(木) 01:10:57 ID:dt5N6A3I
>>112 やっぱりデータベース内では限界なのかなあ???
いや、データベース内で置換できるだろ、replaceで
115 :
NAME IS NULL :2007/10/11(木) 01:47:43 ID:D7bY0G8T
datetimeのカラムにインデックス付けて、 年とか、年月とか、年月日で集計したいのですが like 'year-month%'で検索するとインデックスが使用されません インデックスが使われるようにするにはどうすればいいですか?
どなたか、こちらの件わかる人おりませんか??
http://pc11.2ch.net/test/read.cgi/db/1081818145/246-247 ちなみに今日は、本家から5.0.45.tar.gzとってきて、同様にmake(prefixのみ別dirで./configure)してみたんですが、
やっぱりmake testで一発目(alias)からFailedでて先に進めません。
昨日と同じく、testとばしてmake installして起動させてみると一応ちゃんと動いている模様。
./mysql-test/mysql-test-runはやっぱり通らないけど、./sql-bench/run-all-testだと(5.0.48、5.0.45とも)止まらずに最後まで行きます。
出力見た限りではどこかでエラーとかにはなってないと思う(前にWin版でsql-benchした時、エラーの時それらしい出力があった)
もともとrpmで入った/etc/my.cnfをrenameしたり、/usr/local/mysql仕様に書き換えたりしたけどtest通らず。
distri達はrpm作った時にどうやってtest通したんだ?
(specのなかにmake testがあるってことは、ちゃんと通ったはずなんですが・・)
文字列の中から2つ以上並んだスペースを1つのスペースに置き換えることって 1個→1個 2個→1個 3個→2個→1個 4個→3個→2個→1個 5個→4個→3個→2個→1個
問題解決しました。どうもすいません。
s/\s+/ /g
>>120 マルチバイトで正規表現ってちゃんと使えるようになったの?
まだ鬼車パッチ当てなきゃだめ?
なってないような気がする。
123 :
NAME IS NULL :2007/10/16(火) 17:22:51 ID:19Z+CTul
曖昧検索のやり方を教えてください。 検索用語「手伝う」 「おなかが減りました」 「手が痛いです」 「今日、母親の手伝いをしました」 「仕事を手伝う」 とあると、一番「手伝う」に近いものから出したいのです。 上記の場合だと 「仕事を手伝う」 「今日、母親の手伝いをしました」 「手が痛いです」 「おなかが減りました」 このように出したいのですが、そういった検索方法はありますでしょうか?
DBに曖昧検索機能など無い
つオントロジ
126 :
NAME IS NULL :2007/10/16(火) 23:35:24 ID:wl91U+ML
類義語辞書DB作ってFullTextSearch回すとか
127 :
NAME IS NULL :2007/10/16(火) 23:41:50 ID:JuRjnLqb
マッチ条件がだんだん短くなるような検索があればいいんだな、多分
128 :
NAME IS NULL :2007/10/17(水) 01:17:33 ID:hXE7fedj
「手伝う」でマッチする文章を高いスコアとし、 「手伝」「伝う」でマッチするのはそれより低いスコア、 「手」「伝」「う」でマッチするのはもっと低いスコアとして さらに出現頻度で合計して総合スコアをだせばいいのでは どれくらいのスコアにすればいいのかは統計をとって最適値を求めればいいのでは
「てつだう」はスコア低くていいのかな
かなりアクセスのあるデータベース(MySQL)を使用する際、 [構成A] CPU:Core2Duo メモリ:8GB HDD:SATA 台数:4台 で行くのが良いのかそれとも [構成B] CPU:Core2Quad メモリ:8GB HDD:SAS 15000回転 台数:2台 で行くのが良いのかどちらでしょう。 読み込み中心ならメモリでキャッシュ処理できるから 構成Aのほうが圧倒的に優位な気はしますが。 参考コメントきぼんぬ
データの総量が8GB未満ならB。 ディスクにアクセスしないのでCPU性能が出るから。 データの総容量が8GB以上ならB。 ディスクが速いから。 構成書き間違ってない?
MySQLクラスタって参照のみでもそんなに速度がでないって言うし、それもプロ中のプロが限界まで調整した結果なんだろうし・・・・ 相当単純なことしかさせない場合は別として、Bの方が安全かなあ?
会費制の会員システムをphp+mysqlで組もうと思うのですが、 料金部分のテーブル構成に非常に悩んでます。 どこか参考になるところないでしょうか。 ここの決定でほぼ決まるような気がします。
>>134 恐らくデータ型を悩んでいるんだと思いますが、
DECIMAL型で作成すれば、あとは特に問題は生じないと思います。
理由はお分かりだと思いますが、まるめ誤差を防ぐためです。
136 :
132 :2007/10/17(水) 19:36:19 ID:???
>>133 台数ってHDDの数じゃなくてサーバの台数?
勘違いしてた。前言撤回。
Aでレプリケーション組むのがいいと思う。
更新用が1台、参照用が3台。
MySQLは2コア→4コアの性能向上があまり良くないから。
ストレージエンジンはMyISAMかInnoDBで。
MySQL Clusterは忘れていいよ。あれは特定用途向けの単機能製品。
エンジンの機能実装がしょぼいのでちょっと凝ったSQL投げると性能劣化する。
137 :
133 :2007/10/17(水) 20:41:11 ID:???
>>136 すまんが俺は131じゃないんだ。
参照のみっていっても、必ずしもレプリケーションで対応できるわけでもないんじゃないかなっていう意味で
>>133 を捕らえて欲しい。
138 :
NAME IS NULL :2007/10/18(木) 18:12:39 ID:k4W9Nk/e
タギングを実装しようと考えているのですがDB構成がどうもしっくりきません。 皆さんならどんな風に実装しますか? 僕が考えたものだと汎用性が皆無です。。。 ■案1 CREATE TABLE t_bookmark ( seq INT, name VARCHAR(128), tag1 VARCHAR(32), tag2 VARCHAR(32), tag3 VARCHAR(32) … ■案2 CREATE TABLE t_bookmark ( seq INT, name VARCHAR(128), … CREATE TABLE t_bookmark_tagging ( bookmark_seq INT, -- t_bookmark.seq tag VARCHAR(32) … 案1だと3つまでと最大数が決まっているが管理が簡単 案2だと汎用性は1以上だが膨大なデータ量になるかも できればタグ同士をフォルダーのように関連付けたりもしたいのですが皆さんならどんなテーブルにしますか?
少なくとも案2はねえな。
案2にタグテーブルを追加して、 t_bookmark_taggingテーブルのtagをタグテーブルのプライマリキーに置き換える。
>できればタグ同士をフォルダーのように関連付けたりもしたい って具体的にどういうことがしたいん?
142 :
NAME IS NULL :2007/10/19(金) 03:37:41 ID:H+ebEc3A
>>140 ありがとうございます!
汎用性高そうですね
勉強になります!
>>141 簡単にいうとgoogleみたいなことです
>>142 「googleみたいなこと」って全然意味が分からないのですが。
全文検索?
gmailのラベルのことを言ってるのかな
YouTube のタグみたいなのじゃなくて?
146 :
NAME IS NULL :2007/10/19(金) 13:08:52 ID:vJ6ps9vK
>>143 キーワード「サル」の類義語として「ゴリラ」、「チンパンジー」などを階層的に保持したいのです。
サルで検索したらゴリラにカテゴライズされるものも表示したいのです。
自分なりに考えてみたのですが、ムズかしい!
そういうのはスマートにやろうとするより、ベタにやったほうがかえってうまくいったりする
>>146 そういうのは
>>140 のタグテーブルにツリー構造を作るのがよかんべ。
ただ、ちゃんと考えないとパフォーマンス悪くなりそうだけど。
>>142 まずしっかり正規化してみる。おのずと答えが出るものだ。
google の 関連検索 見たいな事をTAGでやりたいのではないかと。 というか質問しておいて言葉足りな杉。
>>150 そういうことか。てっきりYouTubeのタグみたいなのかと思ったぜ。
152 :
NAME IS NULL :2007/10/19(金) 18:32:36 ID:a+9wl6Y6
DBで一部の文字列が検索できなくなりました。 文字コードはUTF-8です。 「和風居酒屋」という文字列に対し、LIKE '%居酒屋%'でヒットしません。 LIKE '%酒屋%' または LIKE '%屋%' などではヒットします。 LIKE '%居%' ではヒットしません。 「居酒屋」に対しては、 LIKE '%居酒屋%' でも LIKE '%居%' でもヒットします。 「和風 居酒屋」と、半角スペースを空けてみても LIKE '%居酒屋%' でも LIKE '%居%' でもヒットします。 「風居」で何か特殊なことでも起きているのでしょうか?
153 :
NAME IS NULL :2007/10/19(金) 18:43:18 ID:a+9wl6Y6
追記です。 型はTEXTです。
揚げ足とりみたいなことを聞いてすまんが、前まではできてたって意味なの?
155 :
NAME IS NULL :2007/10/19(金) 18:54:39 ID:a+9wl6Y6
>>154 いえ、今回初めてやりました。
検索できなくなりました。 →検索できません。
に訂正します、すみません。
156 :
NAME IS NULL :2007/10/19(金) 19:06:45 ID:a+9wl6Y6
SHOW VARIABLES で文字コードをチェックしたところ、「ujis」になっていました。 手順的にこんな感じです。 SET NAMES utf8 SELECT * FROM tbl WHERE keyword LIKE '%居%' 「居」の文字コードはUTF-8です。
「風居」とう文字列に対しての検索はしたの?
158 :
NAME IS NULL :2007/10/19(金) 21:14:17 ID:fKi8KFKE
>>157 ID変わります。
「風居」に関してヒットしました。
160 :
NAME IS NULL :2007/10/19(金) 21:46:53 ID:fKi8KFKE
肝心なバージョン忘れていました さくらレンタルサーバーの4.0.2xです。
あと大事なこと書いていませんでした。 現在、彼女募集中です。
>>162 INSERTどころかSELECTも無理だよ。
>>162 できれば居酒屋で働いてる様な娘がいいです
165 :
NAME IS NULL :2007/10/19(金) 23:38:33 ID:fKi8KFKE
>>161 今日好きな子に彼氏ができたとこだ
だからその辺りは突っ込まないでくれ・・・
166 :
NAME IS NULL :2007/10/19(金) 23:43:57 ID:fKi8KFKE
って大阪支部は大阪かwww把握wwww 3人いるみたいだから俺も参加していい? 何か参加資格とかあるのかな?
167 :
NAME IS NULL :2007/10/19(金) 23:45:46 ID:fKi8KFKE
誤爆orz
VIPなんぞ覗いてるから 彼女ができないんだよ
169 :
NAME IS NULL :2007/10/19(金) 23:55:54 ID:fKi8KFKE
>>168 元カノなんだけどね・・・
ずるずる引きずってるのよ・・・
だからこんなレベルなんだ・・・
もう drop して 新しいテーブルを create しろよ
171 :
NAME IS NULL :2007/10/20(土) 00:01:32 ID:fUFTSHBK
新しいテーブルが作成できないみたい 心のパーミッションエラーだって・・・
そもそも4.0はutf8サポートしてないんだけどそのへんどうなの
案の定WebProg板から移動してましたね
>>152
174 :
NAME IS NULL :2007/10/20(土) 05:13:56 ID:2AwTGoKZ
すいません初心者でよく分からないのですが ログインページであるIDでログイン後、そのIDの列にセッションIDを登録したいと考えています。 テーブルにはIDがすでに登録されていてSessionidにはNULLが入っている状態です。 教授宜しくお願い致します。
すいません意味がわかりません・・・
教授は土日休みです
update USERTABLE set Sessionid='hogehoge' where id='hemohemo';
178 :
NAME IS NULL :2007/10/20(土) 07:16:24 ID:fUFTSHBK
>>178 これか。
9.5. Unicode のサポート
MySQL バージョン 4.1 以降、Unicode データを保存するために次の新しいキャラクタセットが用意されています: ucs2 (UCS-2 Unicode キャラクタセット)および utf8 (Unicode キャラクタセットの UTF-8 エンコード)。
180 :
NAME IS NULL :2007/10/20(土) 09:44:58 ID:mSjzHsRr
すみません質問します。 今、テーブル作ってるんですが、フィールドの数が90個くらいになりそうです。 これは異常でしょうか。初心者なので、判断に迷っています。
>>180 設計間違ってるで九分九厘間違いないです。
(それ判断できない人が、ガチで90必要な大規模案件やってるわけないのでね)
>>180 正規化やってその数なら問題ない
1000のカラム抱えたテーブル扱ってるけど普通に動くし
180です 回答ありがとうございます。 テーブルは、ライブの情報を扱うものです。なので、 開催日、開始時間、料金、イベント情報etcの基本情報と 出演者名、出演者のURL、演奏楽器 の出演者情報etcの2種類に分かれます 出演者はイベントごとに1〜10人に分かれて不安定なので正規化・分離するなら この部分かなぁと思うんですが、、 この程度なら同じテーブルに入れてもいいのかなぁという気もして、判断しかねてます
時刻の取得について質問です。 time_stというところにtimestampが入っていまして select time_st from member where memname='test';と実行すると time-st 2007-10-20 16:10:30 と取得できるのですがこれを20071020161030と繋げて取得するにはどのようにすればよいでしょうか?
>>186 ありがとうございました。無事できました〜。
188 :
NAME IS NULL :2007/10/21(日) 00:34:22 ID:VLr/CFtZ
あるテーブルに削除フラグ(1か0がはいります)をalterで追加しようと思っているのですが、 charにしようかintにしようか迷ってます。 通常は、このような削除フラグのようなものは何の型にするのが普通でしょうか?
まぁtinyintなんだけどな
MySQL 4.1.20 Windows desc テーブル名でテーブルの構成情報が見られますけど、これをテキスト情報に落とすことって 出来ませんかね?
>> table.txt
mysql < desc.sql > xxxx.txt で出来るんじゃないの でもmysqldump使うのが一般的だと思う
リダイレクトで見ることが出来ました。お二方、thxです。 Mysqldumpは書いた後、思いつきました(^^;。
195 :
NAME IS NULL :2007/10/21(日) 22:06:09 ID:ORdmYlqR
初心者質問ですいません。 検索等実行時の戻り値に所要時間がありますが、 この値をPerlスクリプトから取得したいです。 でもMySQLのどの値にアクセスしていいのかわからず・・・ よかったらおしえてくださいm(_ _)m
196 :
>>189 :2007/10/21(日) 23:46:13 ID:???
MySQLのソース client/mysql.cc を読むと分かるけど 処理時間を計っているのはmysqldでもlibmysqlclientでもなく mysqlコマンド本体。 だからPerlスクリプトから処理時間を知りたければ Time::HiResあたりを使って自分で計るのがいいと思う。 use DBI; use Time::HiRes; $user = 'xxxx'; $pass = 'xxxx'; $db = DBI->connect('DBI:mysql:xxxx:xxxx', $user, $pass); $sth = $db->prepare("select c1 from t1"); $t = Time::HiRes::time; $sth->execute; for ($i = 0; $i < $sth->rows; $i++) { @r = $sth->fetchrow_array; print "$r[0]\n"; } $t = Time::HiRes::time - $t; printf "%.4f sec\n", $t; $sth->finish; $db->disconnect;
mysql5のレプリケーションは、 マスターのDBに対して、スレーブは、すべて既存のDBが消去されて、 マスターのDBが複製されるのでしょうか? マスターのDBが、スレーブに追加されるような形で複製されて欲しいのですが・・・。
MySQLのレプリケーションはSQLが流れるだけだから マスタにないDB・テーブルがスレーブにあるのは大丈夫。 ただしスレーブにSQLを流す時点で不整合があるとそこでレプリケーションが停止する。
200 :
195 :2007/10/22(月) 21:00:30 ID:???
>>197 ありがとうございます。mysql.ccはまだ読めていないのですが
Time::HiResで計測することができました。
サンプルコードまでいただきたすかりました!
201 :
198 :2007/10/22(月) 23:00:11 ID:???
>>199 ありがとうございます。
現在レプリケーションの設定ですが、いろいろつまずいています。
MyISAMの小さなデータベースで練習をしているのですが、
この場合も「バイナリログ」を使った更新になるのでしょうか?
MyISAM用の単純な方式(クエリのテキスト文をスレーブに投げる等)なものがあるのでしょうか?
あと、レプリケーションのタイミングは、
update、delete等、データベースが変わる瞬間にレプリケーションをするのでしょうか?
タイマーのようなもので、一定間隔で変わるのでしょうか?
>>201 >MyISAM用の単純な方式(クエリのテキスト文をスレーブに投げる等)なものがあるのでしょうか?
No
>update、delete等、データベースが変わる瞬間にレプリケーションをするのでしょうか?
YES
トランザクション開始とcomittもレプリケーションされる。
バイナリログを見ればわかる。
自分で実験されたし。
203 :
NAME IS NULL :2007/10/23(火) 09:37:12 ID:jG23x/MR
left joinとright joinの違いって結構大きいのでしょうか? 元データが1万件ぐらいあるとき、left joinだと処理が遅くなり、 right joinだと遅さを感じませんでした。
>>203 index含め同じ条件で結合しての結果でしょうか?
206 :
203 :2007/10/24(水) 01:59:09 ID:???
>>204-205 そうです。indexを含めてleft joinをするとかなり重たいです。
いいからexplainしろよ
半角カタカナ、全角半角英字、などみなさんはどのように対処されていますか? 入力時に全部統一させる、清音化した列を新たに設ける、その都度関数を用いて変換比較する 結構悩ましい問題だと思うのですが・・・
うちでは 入力されたデータの中の 半角カタカナは勝手に全角カタカナに変換 全角英数字は勝手に半角英数字に変換 するプログラムを経由してから SQL薄幸してます
211 :
NAME IS NULL :2007/10/25(木) 18:56:56 ID:/t1iB/b6
MySQL 4.1.20 を、Linux でつかっています。 コマンドラインの mysql コマンドで SQL をたたくとき、 set autocommit=0; を毎回実行すれば Auto Commit はオフにできますが、毎回打つのが面倒です。 my.cnf に書いたりできないのでしょうか?
できる
しょうがない。
排他制御について質問させてください。 以下のようなtable Aがあったとします。 ---------------------------------- id | data ---------------------------------- 1 | aaa 2 | bbb 3 | ccc この状態で、データをinsertする場合、 以下のようにidのmax値を取得して、 select max(id) from A; max値に+1をして、insertという流れになるとします。 複数のプログラムがこのテーブルにデータをinsertする可能性がある場合、 テーブル毎ロックする必要があるでしょうか? #auto incrementはコーディング規約で使わない方針となっています(T_T
AUTO INCREMENT も使えないこんな世の中じゃ
>>215 id の値がユニークであればいいなら
create table A ( id integer auto_increment primary key, data char(3));
とでもして
insert into A (data) values ('aaa');
と id を指定せずに挿入するのはどうか
>>215 さんとは別人ですが、便乗して教えてください。
auto_incrementにしてあるテーブルがあるのですが、
コレ他のサーバーに移行するとauto_incrementの値はどこからスタートするのでしょうか?
auto_incrementの列に欠番があるので、1,3,4,5,7...のようになっています。
別のサーバーに移行したときに、auto_incrementがある列の最大値+1から自動的にカウントしてくれると助かるのですが。
そのままinsertすれば問題ない
220 :
211 :2007/10/26(金) 14:37:10 ID:???
やはり仕方がないのですね。
>>213 では、サーバ側の設定ですが、どちらかというとクライアント側で、
oracle の sqlplus の login.sql みたいに、毎回起動時に set autocommit=0 とかできないかなと思っていたのですが、
そういう方法はないということであきらめます。
(あとは、毎回起動時に良く使うコマンドを、source コマンドで実行するぐらいか)
>>218 過去にそのテーブルが経験した最大値プラス1から始まる。
値は以下のコマンドで確認できる。
show table status like "hogeTable"
222 :
NAME IS NULL :2007/10/27(土) 14:57:36 ID:g8S8hRuK
聞きたいんですけど、みんなDBの管理ってmysqladminでやってるんですか? というか、これってwin環境ですか使えないんですよね? Linux環境で同じようなこと出来るソフトってないんでしょうか?
Linuxでも動くでしょMySQLAdmin
そうなんですか? よく調べてみます ありがとう
>>224 Windows版にくっついてるGUIのやつかなあ?
>>223 と想像してるものとはちがうのかもしらん。
どっちにしても大していいツールでもないので、ほかのを使うか自分でSQLを打つかすることになるだろう。
質問させて下さい。 WindowsXP SP2 にてMySQL 5.0.43をメモリ2G搭載して使っています。 1:my.cnf の設定を変更し再起動をかけたのですが一部設定通りに反映されていない部分がある。 2:設定値についての疑問 1については 下記以下一部抜粋 のように設定してあります。 skip-locking key_buffer=1024M table_cache=1024 max_allowed_packet=4M sort_buffer_size=2M read_buffer_size=4M SHOW VARIABLES; を打つと、table_cache 763 と表示され、設定した1024ではありません。 また、SET GLOBAL table_cache=数値; を実行するときちんと設定値になります。 設定ファイル通り読み込ませたいのです。 2については設定値の〜Mや〜Kはわかるのですが、単位のついていないもの、例えばtable_cache等はバイトと考えればよいのでしょうか? だとすればグローバルキャッシュなのにもかかわらずあまりに使用メモリ量が少ないんじゃないかと思っています。 最後に、現在メモリを多く使用するよう設定してMySQLの挙動テストをしているのですが、どれだけメモリを大きく設定しても key_buffer以外の設定だとメモリ利用料が5Mもあがりません。 SHOW VARIABLES;では殆どの値がきちんと設定値になっていますが、本当にメモリを使用しているのか少々不安です。 また、設定値自体の項目についてはいろいろなサイトで見かけますが、設定についてもう一歩踏み込んだ、 挙動を想像・把握できるような解説がなされているサイト等はありませんでしょうか? MySQLドキュメント当を見ながらやってきたのですが行き詰ってしまいました。 よろしくお願いします。
1.
table_cache=700
と書くとどうなる?
OSレベルの制限値を見てmysqldが勝手に値を絞っているのかもしれない。
2.
table_cacheはハンドラというテーブルを管理する内部構造の「数」を示す。
サーバへの同時接続数が100あって、それらが平均的に
テーブル3つにアクセスするSQLを実行するなら、table_cacheは300以上にする。
sort_buffer、read_bufferは
それが必要となるようなSQLを実行しないと確保されない。
> 設定についてもう一歩踏み込んだ、
> 挙動を想像・把握できるような解説がなされているサイト
英語を苦にしないならこのへん。
http://forge.mysql.com/wiki/MySQL_Internals 書籍ならこのへん。バージョン3.xや4.xの本を買わないように注意!
・現場で使える MySQL
・MySQL 辞典
残念ながら、最終的にはソース嫁としか言えない。
228 :
226 :2007/10/27(土) 20:57:38 ID:???
>>227 レス有難うございます。
table_cache=700 => 起動 => 設定値700
table_cache=512 => 起動 => 設定値512
table_cache=1024 => 起動 => 設定値763
という結果になりました。
おっしゃるとおりなのかもしれません。Linuxを覚えたほうがいいのかもですね・・・
その他の解説についても大変勉強になります。有難うございます。
少々英語アレルギーですが goo辞書に頼ってがんばって見ます!
本も明日早速見てきます。
UTF8のテーブルを使って文書を(主に)LIKE検索するプログラムを作っています。 ひらがなとカタカナを吸収してもらえるので重宝している反面、 一方のみの結果だけでじゅうぶん、ということも多いです。 例えば人名で「アリス」と入力したとき、「〜ありすぎて」までヒットしてしまうから・・ これをSQL文など外部から制御する方法はあるでしょうか? MySQLは4.1です。
MySQL5で id = PK name = UNIQUE というカラムのある果物テーブルがあるとして REPLACE INTO 果物 SET name = りんご を一回やると id 1 name りんご というレコードができるのですが、 REPLACE INTO 果物 SET name = りんご もう一度やると id 2 name りんご とういうレコードができます。 これを、 id 1 name りんご にするにはどうしたらいいですか?
REPLACE は INSERT とほぼ同じように動作しますが、唯一異なる点として UNIQUE インデックスまたは PRIMARY KEY に関して新しいレコードと同じ値が テーブル内の以前のレコードに含まれていると、以前のレコードが削除されてから 新しいレコードが挿入されます。
そもそも何を期待してるのかが不明
教えてください。 テーブルにPK1、PK2、PK3という3つのPKと4つ目のフィールドFLD4があり、 PK1、PK3、FLD4の3つで構成されたインデックスIDX1があります。 select PK1, Max(FLD4) From hoge Where PK3='hogehoge' Group By PK1 というSQLをexplainで調査すると Using where; Using index; Using temporary; Using filesort が現れます。 このテーブルには2000万件のレコードがあるのですが、 Using temporary; Using filesortが現れるのはレコード数のせいでしょうか?
>>233 PK3 と PK1 で複合インデックス作ってみたら。
>>229 分かち書きした検索用カラムを作って likeすれば。
または、セナれば。
236 :
>>215 :2007/10/30(火) 02:21:14 ID:???
ありがとうございます。
237 :
NAME IS NULL :2007/10/30(火) 07:52:01 ID:sLI+LWeo
データ型について質問です。 数字を入れる箇所をintやfloatなどのデータ型にしているのですが、 これだとデフォルト値が必ず0になります。 0にしたくないのですが、数字用のデータ型を使っている場合は 仕方ないのでしょうか?varcharなどの文字用にするべきでしょうか?
デフォルトはNULLになるけど? mysql> create table test (c1 int primary key, c2 int); Query OK, 0 rows affected (0.04 sec) mysql> insert into test(c1) values (1); Query OK, 1 row affected (0.01 sec) mysql> select * from test; +----+------+ | c1 | c2 | +----+------+ | 1 | NULL | +----+------+ 1 row in set (0.00 sec)
>>238 本当ですね・・・。
いつもphpMyAdminで作成していたので、出来ないと思ってました。
アドバイスありがとうございました。
240 :
237 :2007/10/30(火) 09:45:19 ID:???
すみません、もう一つ自己レスです。 phpMyAdminはPHPなわけですが、その他のPHPのプログラムでも mysql> insert into test(c1,c2) values (1,''); では駄目なんですね。空であっても''があると、 そのフィールドには0が入ってしまうみたいです。
0解釈はDB次第だが、少なくとも '' はnullじゃないからね。
242 :
NAME IS NULL :2007/10/30(火) 18:56:41 ID:Pyowqw9l
243 :
229 :2007/10/30(火) 20:08:04 ID:???
>>235 遅レスすみません。
分かち書きは考えてみたのですが、そうすると複合語にマッチしづらくなりませんか?
ユーザー入力も同じ仕組みで分かち書きすればいいのかもしれないんですが
文書中、わりと崩した日本語も多いことから難しそうです。
Sennaや標準のFULLTEXTは使える環境になくて・・・
SET文などでスイッチできそうな気もするんですがどうも情報見つかりません。
>>229 フルテキストは分かち書きして保存する。
入力文字ももちろん分かち書きする。
で、入力文字を分かち書きした区切り分クエリする。
そのとき前後の区切りも検索の対象にするのがポイント。
だけど決してパフォーマンスは出ないのでデータ数によっては注意しる。
>>229 245 だけれども、質問をよく読むと テーブルの Collation を utf8_general_ci にすれば良いだけの話か。
utf8_unicode_ci になってない?
247 :
229 :2007/10/31(水) 13:15:29 ID:???
>>245-246 ありがとうございます。
テーブルのcollationはutf8_unicode_ciにしています。
COLLATEはまったく知らなかったので、昨夜
>>245 を見て確認してみました。
テーブル作成時にutf8_unicode_ciを指定したことをあまり意識していなくて
>>229 に書かなかったのがよくなかったですm(_ _)m
utf8_unicode_ciのテーブルに対するSELECT文にCOLLATEを入れることで、
ひらがな、カタカナが分けて検索されるのを確認できました。
SELECT * FROM table_name
WHERE column_name COLLATE utf8_general_ci
LIKE '%foo%' ORDER BY ・・・(続く)
検索フォームでオプションとして切り替えたりすれば便利だなと
喜んでいたんですが、その後の挙動がちょっとおかしいみたいで・・・
次の検索でCOLLATE〜を指定しない検索をした場合でも
utf8_unicode_ciの検索に戻らないみたいだったんです。
テーブルのステータスを確認しても、ちゃんとutf8_unicode_ciなんですが・・
多分、上記の挙動はなにか別の理由というか勘違いっぽい気もしてるので
今夜さらに確認してからお返事をと思っていたんですが
>>246 でちょうど指摘をいただいたので取り急ぎ書き込みました。
たいへん参考になりますm(_ _)m
248 :
229 :2007/10/31(水) 20:55:14 ID:???
先ほど確認できました。
>>247 のSQL文で問題なくスイッチできました。
動作がうまくいかなかった部分については、やはり別の理由からで
検索を試した何パターンかの自作スクリプトのうちのひとつに原因があったものでした。
そのときは突っ込まずにすぐ寝てしまったので・・すみません。
いただいた回答、たいへん参考になりました。ありがとうございましたm(_ _)m
limit句についてご質問があります。 あるテーブルにn件のデータがあるとして、 limit 3,n のようなことをしたいのですが、どのようにすればよろしいでしょうか? limitでなくても構わないのですが、、よろしくお願い致します。
>>249 先頭3行を読み飛ばして続くn行を表示って意味かな。
だとしたら正しくはlimit n,3(LIMIT n OFFSET 3)で
3行とばして最後までだとlimit -1,3かと。
251 :
>>249 :2007/11/01(木) 01:50:57 ID:???
>>250 mysqlのlimitって-1指定できないんじゃないかな?
postegar sqlだと、limit all offset 3
とか指定できると思ったけど。。
253 :
250 :2007/11/01(木) 04:45:12 ID:???
ご、ごめん、今になって確認したら俺全然でたらめ書いてるorz limit 3,nが正しくて、-1指定もエラーになってしまった。 手元のマニュアル確認したらやはり-1指定と書かれているんだが バージョンの違いかな。 allもだめでした。ううーん申し訳ない。
255 :
>>252 :2007/11/02(金) 01:43:53 ID:???
>とにかくでかい数を入れろ リアルで笑ったw MySQLはこういうところが、おもちゃなんだよなぁ。。。
それが上限値だな でかけりゃいいというもんじゃない
上限値を指すような「SAIDAI」とか適当なエイリアスを 定義しとけば笑われずに済んだのにな
SELECT文で取れるデータ自体がmax_join_sizeで 制限されているので、 このパラメータの値を入れるのが お作法としてはいいと思う。 ちなみにデフォルト値は2^64
マイナーバージョンが違うMySQLを同時に動かすにはどうすればいいんでしょうか。 my.cnfのsocketを変えても認識されないです。。。
261 :
NAME IS NULL :2007/11/03(土) 01:12:05 ID:IOTlj/gO
質問です。 アクセスログのようなものを作る際にdatetime型のカラムと、日毎に group化するためのdate型のカラムを用意しようかと思いました。 しかしマニュアルを見るに、ver4.1以上の場合はdatetime型のカラムに対して date関数を使用すると日付部分のみを取り出せ、高速でgroup化もできるとのこと。 インデックスを張ったdate型カラムに対しての検索と、date関数を通した datetime型に対する検索は等速なのでしょうか?それとも後者が早いのでしょうか? そのあたりの仕様が記述されているページを教えて頂けると勉強になります。 よろしくお願いします。
>>261 最近の若いのは実験もせずに、すぐに答えを求めようとするんだよなぁ。
ゆとり教育のせいかもしれんで、国の責任もあるんやろな。
自分が直面している課題について、どのような実験をすれば答えを導き出せるのか
計画を立てて結果を資料にまとめる。ってことをしないと社会でいらない子になるよ?
>>261 は少なくとも実験してから、ココにくるべし。
「ゆとり教育」っていうネーミングも失敗だったよなぁ。 いかにもアホっぽいもん。 「ものづくり大学」ってのはよさそうだけど、「ゆとり大学」ってあったら なんかヤバそうだもんなぁw
>>259 ソケットとポート番号かえればいけると思うよ。
265 :
>>264 :2007/11/03(土) 06:28:28 ID:???
捕捉。 mysqlデーモンその1:ソケットは、/tmp/mysql1.sock ポート番号は3306 mysqlデーモンその2:ソケットは、/tmp/mysql.sock ポート番号は3307 おかわり?
266 :
>>265 :2007/11/03(土) 06:30:26 ID:???
おかわりしてどうするorz ×おかわり? ◯おわかり?
267 :
>>265 :2007/11/03(土) 06:32:12 ID:???
ごめん。 デーモンその2のソケットは、mysql2.sockの間違い。 なんか、もう限界みたいなので寝るw これもゆとり教育のせい。国が悪い。
ゆとり改行
>>267 UNIXドメインソケットの指定とポートの指定は別物だよ
そもそもUDSにポート番号なんてないだろ
だからこの場合、my.cnfを複数用意してクライアント側で
おっとこんな時間に来客のようだ・・・
xreaのレン鯖を借りているのですが、このエラーが出て困っています。 これって、私のプログラムが悪いのでしょうか。 xreaの管理者に連絡しても対応してもらえないので、 私が悪いのかと思っているのですが、対処法がわかりません。 宜しくお願いします。 mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Can't connect to local MySQL server through socket '/tmp/mysql.sock'
>>270 ユーザ名に@localつけてもだめか?
272 :
>>265 :2007/11/03(土) 23:07:58 ID:???
>>269 同じサーバに複数のmysqld立ち上げるんなら、ポート番号は別にする。
これ常識。
>>270 mysqlデーモン立ち上がってないだけじゃね?
274 :
NAME IS NULL :2007/11/04(日) 01:09:36 ID:AhMqLM4v
まさかとは思うんだが、 LEFT JOINの対応ってバージョン4.1から・・・? 4.0.27では使えなかったり?
さすがにそれはない。 他と勘違いしてない?
276 :
NAME IS NULL :2007/11/04(日) 08:07:06 ID:AhMqLM4v
じゃあ使い方が間違ってるのかな・・・
LEFT JOINが使えないなんて、AND演算子が使えない に匹敵する不便さだぞ。 ありえない。
かなり昔はできんかったよ
279 :
NAME IS NULL :2007/11/04(日) 14:01:34 ID:frlhQ05O
MySQL4.0.27で、 「fruits」フィールドに 「りんご,バナナ,キュウリ」 みたいな複数の値を持ったレコードを入れてます。 fruitsフィールドを「りんご」や「バナナ」というキーワードで SELECTした場合、そのレコードがヒットするように したいのですが、 この場合、fruitsフィールドの型ってvarcharでいいんでしょうか? enumとかでいけるかと思ってたんですが、 実際にちょっと調べてみたら、 enumとかsetは複数の値のいずれかに限定するものであって、 複数の値を格納する型ではないですよね? また上記をスマートに実現できる構文などがあったら教えてくださいませ、 汚くなっても良いならREGEXPとか使えばできるのは想像がつきますが。
select * from テーブル名 where fruits like '%バナナ%' or select * from テーブル名 where fruits like '%りんご%' か select * from テーブル名 where fruits in ('%バナナ%','%りんご%') でどうだろうか? おれ、msde使ってるんで、MYSQLのワイルドカード知らんので % じゃなくて * かも知れないです 違ってたらごめんなさい。
ごめん。型の話でしたか… スマソ
283 :
NAME IS NULL :2007/11/04(日) 19:13:08 ID:Vy5gGImB
MySQL Control Centerっての使ってる人いますか? かねやんMysqlAdminなどとくらべて使い勝手はどうでしょう? また、phpMyadminを利用されている方、利用上の注意点などはどんなことがありますか? phpMyadminってのは商用利用にも安心なツールなんでしょうか? 色んな意見を聞きたいです、よろしくお願いします
>>280 値の個数が固定なら、それぞれの値の有り無しをビットで表すとか
値1 = 0x1000
値2 = 0x0100
値3 = 0x0010
値4 = 0x0001
>>280 enumは複数の値のうちの1個だけど、setは複数の値のうちの複数個
IN()ってやると、INで指定したもののどれかが含まれてれば良しになりますけど 指定したやつ全部が含まれてれば良しとするようなものってありませんか?
それって、条件式は真になるの?
291 :
NAME IS NULL :2007/11/05(月) 12:11:38 ID:HiIC9Mcf
質問です 自動インクリメントする ID の初期値を10000にして、以降は 10001,10002,1003… としたいんですがどうしたらいいでしょう よろしくお願いします
お前ら、副問い合わせをサポートしたのは 4.1以降だぞ。
MySQLはPDFとかでインストールできるマニュアルってありますか?
296 :
NAME IS NULL :2007/11/06(火) 01:45:32 ID:1jsfWYs7
テーブルの複製ってどうしたらいいんですか? clone_tableってのが検索したら出てきたんですが、例文が見つからないです そもそも違うんでしょうか?
>>296 ダウンプしてテキストエディタで編集して流し込む
同じ構成のテーブルを create して insert into 複製TBL select * from 元TBL; とか
質問してるくせに態度でけえな
301 :
NAME IS NULL :2007/11/06(火) 02:34:28 ID:1jsfWYs7
>>301 つかどういうタイプの複製?
ガシガシ更新されるテーブルのリアルタイムの複製・・・レプリケーション
あるホストの現時点のテーブルを別のホストに複製・・・ダンプ&インポート
などなど
303 :
301 :2007/11/06(火) 03:10:44 ID:1jsfWYs7
>>302 ありがとうございます。ガシガシ更新されるタイプではないと思います。
フォームの記入確認のための仮登録のためのテーブルがほしくて、
本登録用のテーブルを複製したいと考えてます。テーブルも今はカラです。
それだけ考えたらデータないんだから手作業で作ればいいって話なんですが、
いずれバックアップの知識も必要と思ったので聞きました。
テーブル単位で複製とDB丸ごと複製の違いすらよくわかってないんで、
いろいろ聞きたいなと。。
>ガシガシ更新されるテーブルのリアルタイムの複製・・・レプリケーション
>あるホストの現時点のテーブルを別のホストに複製・・・ダンプ&インポート
どっちも大切そうですね
使い分けも含めて、どこかわかりやすく解説してるサイトないでしょうか
レプリケーションて聞いたのも初めてですが…
>>303 ま、とりあえずググレ。または自分のレベルにあった本を嫁。
306 :
301 :2007/11/06(火) 15:40:03 ID:???
>>304 おお、ありがとうございます
よくわからないのでやっぱり本買ったほうがいいですね
>>305 もサンキュ
ワイルドカードで複数のDBを管理するアカウント作成方法を教えてください 例えば、aaa-aaa と aaa-bbb と aaa-ccc のDBを操作出来るようにするにはどうやったらいいのでしょう? grant all on aaa%.* to ユーザー名@localhost identified by 'パスワード'; で作るとエラーが出て作れません。 %がワイルドカードですよね?
`aaa-%`.* とか
>>308 あ!
もしかして「``」が必要なんでしょうか?
自分は「''」でやっていたので駄目だったのかな。
そうでした ありがとうございました!
311 :
NAME IS NULL :2007/11/09(金) 12:04:19 ID:VVwJql6u
drop table test; 日付と、果物名と、金額の以下のようなtableですが、 --------------------------------- create table test( date date, item varchar(255), money int ) charset=utf8; insert into test(date,item,money) values('2007-01-01', '林檎', 100); insert into test(date,item,money) values('2007-01-02', '林檎', 99); insert into test(date,item,money) values('2007-01-01', '蜜柑', 100); insert into test(date,item,money) values('2007-01-02', '蜜柑', 99); --------------------------------- 一番最新の日付の価格を果物ごとに知りたい場合のselectはどのようにしたら良いのでしょうか? 単純に group by item とすると 1/1 の金額が出てしまうので、order by で並び替えた後に group by できるといいのですがやはり構文エラーとなります。 どのような select文 だとできるのでしょうか? 一応、単純に考えると以下のような形は思い浮かびますがこれが最良なのでしょうか。 SELECT * FROM (SELECT date, item, money FROM test ORDER BY date desc) a GROUP BY a.item;
select max(date),item from test group by item
313 :
312 :2007/11/09(金) 12:57:47 ID:???
ごめん 果物ごとの価格なのね select test.date,test.item,test.money from test, (select max(date) as date,item from test group by item) a where test.date = a.date and test.item = a.item;
複数バージョンのmysqlをlinuxにインストールして同時に使用したいのですが、 方法などを解説しているサイトなんかがあったら教えてください。 バージョンは4.1xと5.0xを入れたいです。よろしくお願いします。
315 :
NAME IS NULL :2007/11/09(金) 14:56:53 ID:VVwJql6u
316 :
314 :2007/11/09(金) 15:01:42 ID:???
テンプレのFAQを足がかりにいろいろ試してみて自己解決しました。 お騒がせしました。
MySQL5.1ってWin98には対応して無い? 前に4.0使ったときは98向けの管理ソフトも同梱してたはずなんだけど・・・
Win9x時代って、サービスって動かせたっけ?
やっぱサービスでしか動かせない?
なんとか4.0探してきた… XOOPS入れようとしただけで何故こんなに苦労を・・
さくらインターネットが未だに化石のようなmysql4.02なんてバージョン使ってるから うまく動かないサブクリエがあってはまった。 死ねよ
4.1なら状況はだいぶ変わるのにねぇ。 そんなうちの仕事場は3.2。
俺のPCはWin98SE だから4.0しか使えない・・
サブクリエ
本来ならWin98SEなぞ最初から対応せずにステでもよかったぐらいでは PC98とかじゃない限りLinuxでも入れたほうが幸せになれそうだ そういえば漏れのクリエ埃まみれだぜ
PC98ならFreeBSDでええやん
そろそろ新しいの買えよ。
>>322 3.23 ならともかく、3.2 はないだろ。
329 :
322 :2007/11/11(日) 13:32:52 ID:???
>328 あ、3.23だ。誤字すまん
5000テーブルくらいあるMyISAM型DBでうまくキャッシュさせる方法はあるでしょうか? table_cacheはデスクリプタ数の制限で頭打ちになるようでテーブルをスキャンすると まったくヒットしなくなります。アドバイスよろしくお願いします。
スレ違いだったらすいませんが、、、、 OS XPPro MySQL 4.1.20 かねやんMySQLAdmin 1.43 サーバのキャラクタセット -> クライアントのキャラクタセット -> sjis となっていて日本語が正しく表示できないんですけど、 対処方法とか判る方おられませんか?
332 :
NAME IS NULL :2007/11/11(日) 20:15:57 ID:8MXImYta
>>331 サーバのキャラクターセットがsjisではないから
ユニコードの対応って4.1からだったのね。 それ以前のバージョンは本当に糞だな
質問させてください。datetime型やdate型のカラムを含むテーブルの更新は どうしたらいいんですか? create table nametable ( namae varchar(30), tourokubi date ); 上記のようにして作ったテーブルにデータを入れるとき、 insert nametable values("yamada", ?); ?の部分をどうしたらいいのかわかりません。 ためしに2000-10-10を入れたらエラーになり、20-10-10を入れたら 0000-00-00が登録されました。 アドバイスどなたかお願いします。 マニュアルも読んだんですが良くわかりませんでした。
336 :
NAME IS NULL :2007/11/13(火) 00:08:22 ID:3kQWoYfz
あ、すみません あげさせてもらいます
insert into nametable values ('yamada','2000-10-10'); insert into nametable values ('suzuki','2001-11-11'); insert into nametable values ('satou', '2002-12-12'); select * from nametable; +--------+------------+ | namae | tourokubi | +--------+------------+ | yamada | 2000-10-10 | | suzuki | 2001-11-11 | | satou | 2002-12-12 | +--------+------------+ 3 rows in set (0.00 sec) 問題ナス
>>337 ありがとう '2002-12-12'というふうに、クオーテーションでくくってませんでした
解決しました
341 :
NAME IS NULL :2007/11/14(水) 10:14:45 ID:fJXBbwnJ
今インストールするのに最適なバージョンって何ですか? そろそろ5も枯れてきているのでしょうか?
今なら5.0でしょ。場合によっては5.1でもいいかもよ。 5.0はかなり前から十分に枯れてるというか、 古いバージョンを使う理由は基本的にはないよ。
343 :
NAME IS NULL :2007/11/15(木) 02:06:02 ID:XFrdNKef
t1とt2のテーブルに共通するIDを削除したいと思います。 DELETE FROM t1 INNER JOIN t2 ON t1.id=t2.id WHERE t1.id='test' として、t1とt2を結合し、同じidのtestを削除しようとしたのですが、削除出来ません。 リファレンスを見ると、JOINは使えるとのことなので上記のようにしていますが、 どこがおかしいのでしょうか?ご指摘・アドバイスいただければと思います。
>>342 ありがとうございました
4.1文字化け問題の記憶があって
何か新しいものへの抵抗があるんですよね…
>>343 誤り
mysql> delete from t1 inner join t2 on t1.c1=2 where t1.c2=t2.c2;
ERROR 1064 (42000): You have an error in your SQL syntax; …
正解
mysql> delete t1, t2 from t1 inner join t2 on t1.c1=2 where t1.c2=t2.c2;
Query OK, 2 rows affected (0.00 sec)
変な構文
ごめん間違えた mysql> delete t1, t2 from t1 inner join t2 on t1.c2=t2.c2 where t1.c2=2; Query OK, 2 rows affected (0.00 sec)
>>344 文字化けはMySQLが枯れてるかどうかの問題じゃない、ってのは分かってる?
単に3.xの時と同じ運用だと問題が起こっていた(ノウハウが溜まっていなかった)、という話。
ノウハウについてはかなり前から充分溜まってる。
ちなみに4.1を使う理由は全くないので、4.1を検討するくらいなら5.0以降を使うべき。
未だに4.0以前の知識しかない人を見かけるけど、なぜなんでしょ。
MyNAのFAQにもずいぶん前からいろいろあるのに……。啓蒙不足?
それとも書籍が腐ってるせいかねぇ。PHPと一緒なやつとかは相変わらず酷いんでしょうか。
>>345-346 ありがとうございます!出来ました。
deleteの後ろに削除するテーブルを指定するんですね。
>>348 4.1初期のバグやら仕様ミスを知らない?
落ち着いたのは4.1.12以降だろ。
あれを経験していれば、安易に版数変えたく無いわな。
は? あれを経験しているからこそさっさとかえるべきだろ?
2007年に入ってから1回しかupdateしてない4.1系列よりは ほぼMonthlyでupdateされてる5.0系列の方がいいと思うよ。 5.0はEnterpriseでサブスクリプション契約になったから それだけ品質には気を使うようになってる。 B.1.1. Changes in MySQL 4.1.24 (Not yet released) B.1.2. Changes in MySQL 4.1.23 (12 June 2007) C.1.1. Release Notes for MySQL Enterprise 5.0.52 [MRU] (Not yet released) C.1.2. Release Notes for MySQL Enterprise 5.0.50 [MRU] (19 Oct 2007) C.1.3. Release Notes for MySQL Enterprise 5.0.48 [MRU] (27 August 2007) C.1.4. Release Notes for MySQL Enterprise 5.0.46 [MRU] (13 July 2007) C.1.6. Release Notes for MySQL Enterprise 5.0.44 [MRU] (21 June 2007) C.1.7. Release Notes for MySQL Enterprise 5.0.42 [MRU] (23 May 2007) C.1.8. Release Notes for MySQL Enterprise 5.0.40 [MRU] (17 April 2007) C.1.9. Release Notes for MySQL Enterprise 5.0.38 [MRU] (20 March 2007) C.1.11. Release Notes for MySQL Enterprise 5.0.36 [MRU] (20 February 2007) C.1.12. Release Notes for MySQL Enterprise 5.0.34 [MRU] (17 January 2007)
>>350 いや知ってるが文字コード云々言ってる連中の大半は3.xあたりの知識のままで
運用しようとしてるだけでしょ。
(つか当時のことを知っていれば「いまどのバージョンが安定してる?」なんて聞き方はしない)
まあエンコディング周りは鬼門だからなぁ。
サロゲートペア対応してないのが問題っていうならその通りだし、
将来対応したときに問題が起こりうるってのはそうだと思うけど。
>>353 裏返せばそれだけ安定していないって事だけどなw
>>355 その通り安定してないんだけど、それは4.1もいっしょだよ。
新機能でない限りほどんどのバグが4.1、5.0、5.1で共通。
5.0 Enterpriseならバグ報告すれば翌月直るけど、5.0 Community、
4.1は同じバグが長期間放置される。だから5.0 Enterpriseオススメ。
MySQL ABはEnterpriseのパッケージを契約顧客にしか配ってないけど、
結局GPLなんでミラーされてしまっている。
http://mirror.provenscaling.com/mysql/
で、結局開発する時はどの環境が無難なの? 自分は昔から4.0.26だけど。
stableは5.0なので、それの最新でいいでしょ。 場合によっては5.1でもいいんじゃね?
359 :
NAME IS NULL :2007/11/17(土) 08:48:17 ID:XVlaU+5c
以下のSQL文をphpから実行しようとするとエラーになって画面が白くなります テーブルの指定やカラム数、並びともに間違ってないのでどこがおかしいのかわかりません 誰かご意見ください お願いします $sql = "insert into testtable values( 0, $_SESSION['loginId'], $_SESSION['loginPass'], 1, $_SESSION['staffName'], $_SESSION['sType'], $_SESSION['name1'], $_SESSION['name2'] );
360 :
359 :2007/11/17(土) 09:02:46 ID:XVlaU+5c
あ、ごめんなさい ); となってますが、)"; の書き間違いです またDBへの接続はうまくいっています また、 $sql = "insert into testtable (id,loginId) values(0,"abc"); というSQL文は ちゃんと動作しました
>>359 各値がクォーテーションで囲まれていないからでは?
$sql をダンプしてみりゃ一発ではないか
文字列を長さ順でソートしようと考えています。 varchar に対して length(), char_length() を行うとして、 length()の場合は、文字列と一緒に格納されいているバイト数を返すだけだから高速 char_length()の場合は、マルチバイトを考慮して文字数を数えるので低速 という認識なのですがあっていますかね?
>>363 多分あってるけど実測した結果を見たことは無いな。
適当に数十万レコードくらいでっちあげて試験してみたら?
レポート楽しみに待ってます。
>>359 $sql = "insert into testtable values(
0,
{$_SESSION['loginId']},
{$_SESSION['loginPass']},
1,
{$_SESSION['staffName']},
{$_SESSION['sType']},
{$_SESSION['name1']},
{$_SESSION['name2']}
);
つか、MySQLじゃなくてPHPの文法エラーな
367 :
363 :2007/11/17(土) 23:58:29 ID:???
>>364 確かにやってみれば済むことですね。
今度やってみて結果書きますね。
MySQL4.0のサポートっていつまで? 今年いっぱい?
5.1からmyisamのデータアクセスにmmap使うオプションがあるので、 巨大なデータファイルを扱うなら5.1はかなりいいぞ。 はやくfalconでないかな。
371 :
NAME IS NULL :2007/11/19(月) 14:14:57 ID:pgXAP1I1
AUTO_INCREMENTでIDを自動挿入しているんですが、 あるカラムをdeleteしたらそこの番号が空白になりますよね? 一覧表示したときにIDも表示してると歯抜けになって格好悪いのですが、 IDを詰めることはできませんか? それとも気にするべきではありませんか?
気にするべきでない ID詰めるのはちまちまupdateすりゃできるけど 他のテーブルの外部キーになっていればそれも無理
削除されたものも含めて「一意」なんだ、と思うべき。 番号表示を気にしたいなら別のカラムでも作れ。
374 :
NAME IS NULL :2007/11/19(月) 21:46:59 ID:tlX6K+Wh
一度に大量(100や200)のクエリを実行したとして 速度的な影響って出ますか? 某所で「何度も実行するべきではない」っと聞いたので 気になっているのですが、調べる術がありません。。
そら少ないより多いほうが影響するでしょ。 それにクエリの内容によって影響も変わる。 例えばprimary keyによるSELECTを大量に発行してもたいしたことないし、 1回のクエリで途方もない時間がかかる可能性もあるし。 更新系のクエリかどうかによっても違うし。 つかやってみれば分かるでしょ。
376 :
374 :2007/11/20(火) 00:59:42 ID:???
>>375 ありがとうございます。とりあえずWHEREによるSELECTをしました。
元データ1万件に対してWHEREで対象となるキーを抽出してSELECT。
これをPHPを使い、50回・100回と繰り返し処理をさせました。
ローカル環境でやりましたが、特に体感速度は変わりません。
これ以上の条件でやった場合はどうなるかわかりませんが、
サーバダウンするほどでもないので、気にすること無いですね。
きっと query cacheとか buffer sizeとか、explainなんて気にしないでパフォーマンスチェックしてるんだろうな。
1プロセスで繰り返し実行しても分からんでしょ。 20個ぐらい多重かけないと。
>>377 query cacheとか buffer sizeとかは気にすべきなの?
InnoDBからMyISAMに変換するにはどうすればいいでしょうか? MyISAMからのInnoDBへはダメとは書いていましたが、 変換しなくても、mysqlダンプしてから、 InnoDBをMyISAMにして、リストアすればいいのでしょうか? この場合、InnoDBで使っていたゴミはどこかに残っているのでしょうか?
ダンプしてdatabase作り直してリストアだろうね。 ところでゴミって例えばどんな?
alter table foo type=myisam; じゃだめなの?
alter table t engine=MyISAM じゃだめなのかね?
384 :
380 :2007/11/20(火) 20:24:55 ID:???
ダンプして、テーブルを全部削除して、 テーブルのengineとdefault charsetを目的の値にしてから、 インポートしました。by phpmyadmin ゴミというのは、 /var/lib/mysqlにある、 ib_logfile0 ib_logfile1 ibdata です、これはInnoDBを使ってなければ不要なのでしょうか? alterコマンドというのがあるんですね、 勉強になります、ありがとうございました。
MySQLの4.1.15です。 例えば uriageテーブルが uriageYMD date, ordernum int(4), mise int(3), kyaku int(5), shouhinID int(5), kingaku int(8) kokyakuテーブルが mise int(3), kyaku int(5), kyakumei varchar(20), kakari int(4) salseテーブルが mise int(3), kakari int(4), kakarimei varchar(20) とあって、 uriageテーブルからmise,kyaku,uriageYMD, kokyakuテーブルから kyakuに一致するkyakumei,kakari を持ってくるまでは出来たのですが、それにsalseテーブル からkokyakuテーブルのkakariに一致するkakarimeiを 持ってくるにはどうすれば良いんでしょうか?
すさまじくダサいテーブル名/カラム名だな。 1. ordernum(英語)とmise(ローマ字)が混じってる 2. kokyakuテーブルのPRIMARY KEY(と思われるもの)がkyaku。普通はkokyaku側はid、uriage側はkokyaku_id。 3. salseじゃなくてsales ってのが。 ダメSIの臭いがプンプンするぜ。 SELECT u.mise, u.kyaku, u.uriageYMD, k.kyakumei, k.kakari, s.kakarimei FROM uriage u INNER JOIN kokyaku k ON k.kyaku = u.kyaku INNER JOIN salse s ON k.kakari = s.kakari;
まぁあくまでもここに例に出す為に即興で作った名前ですから… w 何はともあれ、m(__)m です。 w
394 :
391 :2007/11/21(水) 01:01:47 ID:???
>>393 即興でこれかよ!
そっちの方がやべーYO!
395 :
NAME IS NULL :2007/11/21(水) 02:05:40 ID:H0U/ijnh
1万件のテーブルを正規化して計3テーブルを LEFT JOINで結合しているのですが、物凄く重いです。 ローカル環境で動作確認していますが、PCがダウンします。 やはり、件数が多いからサーバダウンするのでしょうか? それとも、MySQLのチューニングが上手く行ってないのでしょうか? インデックスの調節やEXPLAINをして確認しましたが、 Using filesortとUsing temporary が常に出ます。 サーバはWindowsXPでMySQL4.0.20で確認しています。
AccessからMySQL(charsetはUTF-8)にODBC接続したんですけど 日本語が化けたり化けなかったりします
397 :
NAME IS NULL :2007/11/21(水) 04:32:44 ID:88wrK5LA
>397 >MySQL4.0.20 捨てろ
たかが1万件ごときでそんなに重くなるはずがない。 インデックスの付け方が悪い。show create tableさらせ。 あと397の言うとおり、4.0.20は捨てろ。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
【 あなたのタイピングどのくらい!? 】 2007/11/21 配信
制限時間内に表示される画像内の、数字やアルファベットを次々とタイプ入力していく。
あなたのタイプ成功率が刻々と表示されていく。また、その時々のランキングにも表示さ
れていく。都道府県別のランキングもあれば、それぞれ友達と好きなチームを作り競い
合うチーム別ランキングもあって楽しめれる!
また、タイプが成功したものはそのまま、「 国別対抗オンラインクリックゲーム 」の日本
チームのクリック数に貢献される。数々の激戦を戦い抜いてきた日本チームも、現在は
強敵ハンガリーチームに続いて第2位となっている。タイプの練習がそのまま日本チー
ムの優勝に貢献するかも!?あなたもぜひやってみては?
参加するには各種のツールを使う方法もあるが、まずはアクセスするだけでサイトから
簡単にできる「 小町 」をお試しください。なれてきたら各種ツールを試すのも楽しい。
タイプ入力サイトその1「 小町 」
http://f106.dyndns.org/komachi/cgi/acsupporter/supporter.cgi?m=ff 「 国別対抗オンラインクリックゲーム 」については、日本チームのオフィシャルサイトで。
http://clickjapan.jp/ ※上記サイトはすべて「 国別対抗オンラインクリックゲーム 」日本チームの有志の
方達の運営で、すべて無料です。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
4.0系から4.1系に変えたら、劇的に早くなるのでしょうか?
>>356 で、そのEnterpriseなVersionの正式にライセンス契約してない貧乏泥棒ユーザーが、
本家にBugReport送るのってありですか?
402 :
395 :2007/11/21(水) 12:05:39 ID:???
>>398 テーブル構成は住所録+沿線情報になりまして、
aテーブルには基本情報(user_id、pref、address)
bテーブルには会員の駅情報(user_id、ensen_id、station_id)
cテーブルには参照する駅情報(ensen、ensen_id、station、station_id)
こういう構成です。()内はフィールド名です。各1万件あります。
SELECT * FROM a LEFT JOIN b ON a.user_id=b.user_id
LEFT JOIN c ON b.station_id=c.station_id
みたいなSQLで結合しているのですが、これが非常に重いです。
インデックスは各idごとに付けています。
MySQLのバージョンは会社では4.0.20なので、合わせています。
だからすぐに捨てることは出来ないので、それが問題です。
>>402 そのSQLとexplainの結果をそのまま貼り付けよー
結合しているせいじゃない気がするよ
406 :
NAME IS NULL :2007/11/21(水) 15:49:36 ID:88wrK5LA
SELECT * FROM a LEFT JOIN (b LEFT JOIN c ON b.station_id=c.station_id) ON a.user_id=b.user_id
権限テーブルについて質問です。 したいこと --> 'hoge'と言う、root権限から、grant と mysqlデータベースについてのアクセス権のみ省いたUserを作成したい。 ちなみに、この’hoge’は、LAN内からののみアクセス可能とする(192.168.0.%) やったこと --> rootでloginして、 grant all on *.* to 'hoge'@'192.168.0.%' identifed by '******'; とやって、こんなUserができた。 select * from mysql.user where user = 'hoge' Host: 192.168.0.% User: hoge Password: ****** Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: Y Shutdown_priv: Y Process_priv: Y File_priv: Y Grant_priv: N References_priv: Y Index_priv: Y Alter_priv: Y Show_db_priv: Y Super_priv: Y Create_tmp_table_priv: Y Lock_tables_priv: Y Execute_priv: Y Repl_slave_priv: Y Repl_client_priv: Y Create_view_priv: Y Show_view_priv: Y Create_routine_priv: Y Alter_routine_priv: Y Create_user_priv: Y ssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0 max_updates: 0 max_connections: 0 max_user_connections: 0
408 :
つづき :2007/11/21(水) 16:01:51 ID:???
で、一旦quitしてから、’hoge’で再loginしてから、 show databases; や select * from mysql.user; するとmysqlデータベースの中身が参照できる(あたりまえ。) ここまではいいとして、ここから、再度rootでloginしなおして、 revoke all on mysql.* from 'hoge'@'192.168.0.%'; とやってみたら、こんなError ERROR 1141 (42000): There is no such grant defined for user 'hoge' on host '192.168.0.%' そりゃあhogeにはgrant option与えてないけど、なんで? Revokeの使い方間違ってる? そこで、 Insert into mysql.db Values('192.168.0.%','mysql','hoge','N','N'・・・'N'); でmysql.dbテーブルに直接インサートしてみた。 select * from mysql.db where user = 'hoge': Host: 192.168.0.% Db: mysql User: hoge Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Grant_priv: N References_priv: N Index_priv: N Alter_priv: N Create_tmp_table_priv: N Lock_tables_priv: N Create_view_priv: N Show_view_priv: N Create_routine_priv: N Alter_routine_priv: N Execute_priv: N となったので、flush privileges をかけて、rootはlogout。再びhogeでログイン。 そこで、show databases や show tables from mysql をしたら、中が読めてしまう。 MySQL Serverを再起動掛けて見てもやっぱり同じ。 (これでmysql.*が読めないようにすることが目的) これってやっぱり、最初のgrantの時に、一つ一つDbを明示して権限を与えないとダメですか。 出来れば、既存の権限から、特定のDbだけ除外したい。 実のことを言うと、BackUp用に、他のマシンから各Db、Tableの内容をdumpしたいんだけど、 例えば本番マシン内で、新たにDbが作成されたりした時に、いちいちlocalコンソールからloginして、 増えたDbの分だけgrantしたり、消去されたDbについてRevorkeしたりすんのが煩雑なのと、 DBをフルダンプした時に、mysqlデータベース内の権限テーブルまで吐いてしまうのを回避したい。
>>401 バグだって切り分けができてるなら
http://bugs.mysql.com/ へのレポートしてOK。
Enterpriseのソースはbitkeeperにも置いてあるから、
別に入手元は問われないよ。
対応はベストエフォートだけど、これはしょうがない。
契約顧客は専用のサポートサイトがあって、
そちらにレポートするときちんと担当者がアサインされて
障害の切り分けから直すところまでつきあってくれる。
411 :
409 :2007/11/21(水) 16:52:48 ID:???
BitKeeperはこちら。
http://mysql.bkbits.net/ ちなみに、しつこくバグレポートしてると、
そのうちMySQL Quality Contributorとして認定してくれます。
MySQL Quality Contributorになると
MySQL Enterpriseのライセンスがタダでもらえます。
Revokeの使い方間違ってる
>>407 grant usage on mysql.* to 'hoge'@'192.168.0.%' identifed by '******';
grant all on *.* to 'hoge'@'192.168.0.%';
mysqld の起動時、すべての権限がメモリに読み込まれます。 データベース権限、テーブル権限、およびカラム権限はすぐに反映されますが、 ユーザレベルの権限はユーザが次回接続したときに有効となります。 GRANT または REVOKE によって行われた権限テーブルへの変更については、サーバは即座に認識します。 INSERT、UPDATE などを使って手動で権限テーブルを変更した場合、 FLUSH PRIVILEGES ステートメントまたは mysqladmin flush-privileges を実行して サーバに権限テーブルを再読み込みさせる必要があります。 See 項4.4.3. 「権限の変更はいつ反映されるか」。
>>406 >>407 権限テーブルについて自分の理解してるところを書くよ。間違ってたらごめん
> grant all on *.* to 'hoge'@'192.168.0.%' identifed by '******';
ここで設定した権限(グローバルレベルの権限)は mysql.user に記述される。
ここまではいいとして、
> revoke all on mysql.* from 'hoge'@'192.168.0.%';
ここでは設定していないデータベースレベルの権限( mysql.db に記述される)を剥奪しようとしている。
だから
> ERROR 1141 (42000): There is no such grant defined for user 'hoge' ...
となる。これは grant all on *.* した時点で mysql.db を覗いてみればわかる。
肝心なのは MySQL が各ユーザの権限を算出するにあたって
mysql.user, mysql.db などの記述を短絡的にチェックしているということ。
もし mysql.user をチェックして、そのユーザの権限に関する記述があれば( Y なら)
mysql.db 以降はチェックされない。
> これってやっぱり、最初のgrantの時に、一つ一つDbを明示して権限を与えないとダメですか。
そうするのがいいと思うけど、mysql.db を直接いじって flush すればいけると思う。
その辺は詳しい人のレスを待ったほうがいいかと。
いろいろとレスサンクス。
>>414 上にも書いてあると思うけど、flush privilegesは何回もしてる。
mysqldの再起動もやった。
>>412 ,415
Revorkの使い方間違ってるのは理解した。
(ってか今までは、ほとんど delete from mysql.user where user='***' で一旦削除してから、あらたにgrantしてた。)
>>413 上の行のクエリで、mysql.userの*_privが全部'N'のhogeができあがった。
でも、そこから下の行のクエリを書けたら、*_privが全部(grant_priv以外)’Y’になった。
で、flush privileges(念のため)を掛けてから、hogeで再ログインして、
show databases と show tables from mysql でやっぱりmysql.の中身が読めてしまう。
ちなみに、この時(上の行の前、後、下の行の後のいつでも)
select * from mysql.db where user='hoge'; で Enpty set が返ってくる(つまりHitなし)
select * from mysql.db where db='mysql'でも Enpty set。
ちなみに、grant all on my_db1.* to 'piyo'@'192.168.%' identifed by '******'; で作ったUserでloginして
show databases; したら、ちゃんと infomation_schemaとmy_db1しか表示されないし、
show tables from mysql; だと、Access denied for user 'piyo'.... となる(期待した動作)
select * from mysql.db where user='piyo' で、db権限テーブルには’piyo’がちゃんと登録されてる。
う〜ん、デフォルトが’Y’で指定したのみ’N’ってのは、できないのかなあ〜。
418 :
395 :2007/11/21(水) 20:09:50 ID:???
>>405 とりあえず、EXPLAINは以下の通りです。
長いですけど、絶えずUsing index; Using temporary; Using filesortが出ます。
Array ( [0] => a [table] => a [1] => index [type] => index [2] => [possible_keys] => [3] => PRIMARY [key] => PRIMARY
[4] => 4 [key_len] => 4 [5] => [ref] => [6] => 20292 [rows] => 20292
[7] => Using index; Using temporary; Using filesort [Extra] => Using index; Using temporary; Using filesort )
Array ( [0] => b [table] => b [1] => ALL [type] => ALL [2] => user_id [possible_keys] => user_id
[3] => [key] => [4] => [key_len] => [5] => [ref] => [6] => 4 [rows] => 4 [7] => [Extra] => )
Array ( [0] => c [table] => c [1] => ref [type] => ref [2] => station_id [possible_keys] => station_id
[3] => station_id [key] => station_id [4] => 4 [key_len] => 4 [5] => b.station_id [ref] => b.station_id
[6] => 1 [rows] => 1 [7] => [Extra] => )
オレって実際には全カラムは必要ない時にも select * でクエリしちゃったりする。 一般的にこれってやっぱ無駄というか、パフォーマンスに影響するのかな。 簡単なテストでは大差なかった。 テーブルの型やドライバとかに影響しそうだけど、10個中9個取るときも必要な カラムを羅列すべきだと思う?
インデックスが作ってあって、そのインデックスの列だけSELECTする場合、 SELECT * ⇒ インデックスとテーブルにアクセスする SELECT [必要な列のみ] ⇒ インデックスのみアクセスする となるので性能にずいぶん影響が出るよ。 あとは通信量が違う
>>419 羅列するべき。 メリットなんてSQLで手抜ける ってぐらいじゃない。
デバッグ時は * で開発進める場合もあるけど、必ず仕上げ段階で
カラムを絞りますよ。
422 :
419 :2007/11/21(水) 22:26:02 ID:4Hr0oFqs
>>418 これは何かの嫌がらせか……
人間が読める形にしてよ。
select hoge1.fuga, hoge1.hage, hoge2.fuga, hoge2.hage from hoge as hoge1 left join hoge as hoge2 on hoge2.fuga = hoge1.fuga みたいなことってよくする?
left join意味なくね? fuga列同士の比較だから、片方だけnullってケースにならない
>>レスくれた方々
色々なヒントをありがとう。
たぶんできた。
grant usage on *.* to 'hoge'@'192,168.0.%' identified by '******';
これで、mysql.userに*_privが全NのUserができる。この時点で、まだmysql.dbにはなにも追加されてない。
Insert into mysql.db (`Host`,`Db`,`User`) Values('192.168.0.%','mysql','hoge');
これで、mysql.dbにUser:hoge,db:mysql,*_priv:Nのレコードが追加される。
Insert into mysql.db Values('192.168.0.%','mysql','hoge','Y','Y','Y'・・・'Y');
これで、mysql.dbにUser:hoge,db:%,*_priv:Yのレコードが追加される。(つまりUser:hogeのレコードが二件存在する)
すかさず、flush privilegesで権限テーブルをflushして、hogeで再ログインすると・・・、
ついに期待通りの動作確認!!。
show databases;でmysql以外のDbが一覧で返ってきて、show tables from mysqlだと、Access denied。
とにかくhogeからはmysql Dbが完全に遮断できた。
この時に、別のターミナルからログインして、新しくDbやTableを作成しても、すかさずhoge側から参照可能。
Manualの4章あたりを何度も読み返して、なんとなくだけど接続、参照時の権限のイメージみたいなが見えてきた。
>>415 さんの言ってるように、最初の接続時にmysql.userテーブルを読んで、そこでアクセス権があれば
それをセットする(グローバル設定)。なければそれぞれのDb権限を読みに行って、Dbごと(あるいはTable、columnsごとに)
権限を制御している模様。
で、Db名を明示してgrantしたUserのmysql.userを覗いてみると、なんと全てのprivが’N’になってんで、もしやと思ってやってみた。
実は今までこれ知らなかった。
ManualにはUser名にはワイルドカード使えないとは書いていたけど、その他については特に記述なし。
で、ここの少し上の方のレスで、Db名には’%’が使えそうだと思って、放り込んでみたら、できた。
ワイルドカードより、完全一致のほうが強いようだ。
(バージョンや環境によって変わるかも?でも他のやりかたがあるんだったら教えて。自分にはこれ以上思いあたらん)
ちなみに、grant all on *.* to・・・ だと、mysql.userの中身を全てYに変えてしまう。
grant all on `%.*` だとsyntax error。
grant all on `%`.`*` だと Query Ok にはなるけれど、mysql.dbにはなにも追加されない。(mysql.userも変更なし)
結局 Insert into ・・・・で、たくさん’Y’を打ち込まないといけない。(これがVersionによって数が異なる)
期待通りに動作したもの
確認済み・・・4.0.26-Win32、4.0.27-Win32、5.0.37-Win32、5.0.45-Win32、5.0.45(Cent4)、5.0.50(Cent4)
これから確認・・・5.0.50-Win32、5.0.22-rpm(Cent5)、5.0.27-rpm(FC6)
4.1系、5.1系は持ってないから知らない。(これだけやってどれも期待通りに行ったから、多分大丈夫だとは思うけど・・)
とりあえず寝よう。
寝るとこまでは読んだ
428 :
NAME IS NULL :2007/11/22(木) 07:33:12 ID:v2xY2Xgx
grant usage on *.* to 'hoge'@'192,168.0.%' identified by '******'; Insert into mysql.db (`Host`,`Db`,`User`) Values('192.168.0.%','mysql','hoge'); Insert into mysql.db Values('192.168.0.%','mysql','hoge','Y','Y','Y'・・・'Y'); 3行目まちがってないか
>>426 おつ。ただ自分も
>>428 が気になった。
Host, Db, User はたしかプライマリキーだったと思うので。
できれば「期待通りの動作」をしたバージョンでの
show grants for ... と desc mysql.db を見せてくれるとうれしい。
430 :
NAME IS NULL :2007/11/22(木) 08:28:58 ID:v2xY2Xgx
grant usage on *.* to 'hoge'@'192,168.0.%' identified by '******'; Insert into mysql.db (`Host`,`Db`,`User`) Values('192.168.0.%','mysql','hoge'); Insert into mysql.db Values('192.168.0.%','%','hoge','Y','Y','Y'・・・'Y'); の書き間違いだろうとは思ってるんだけど 一応聞いてみたんだ
431 :
NAME IS NULL :2007/11/22(木) 10:40:57 ID:UyA449rO
OR文で「hogehoge」と「テスト」で単語検索をかけたとき 検索した本文からより単語が多い順にORDER BYで並べ替えすることってできますか? 『今日hogehogeしました。』 『hogehoge テスト』 『今日はテストがありました。』 『今日はhogehogeのテストをしました。 を 『今日はhogehogeのテストをしました。 『hogehoge テスト』 『今日hogehogeしました。』 『今日はテストがありました。』 のように、単語がたくさん当てはまる順に並べたいです。
ちょっと前まで寝てた。
>>428 ,429,430
!!!。おっしゃるとおり、三行目は
Insert into mysql.db Values('192.168.%','%','hoge','Y','Y','Y',・・・'Y'); のまちがいでした。
>>426 のクエリなら、せっかく’N’にした`mysql`での権限を、’Y’にしてしまう。
で、show grants for 'hoge'@'192.168.0.%;'の結果
GRANT USAGE ON *.* TO 'hoge'@'192.168.0.%' IDENTIFIED BY PASSWORD '******'
GRANT ALL PRIVILEGES ON `%`.* TO 'hoge'@'192.168.0.%'
desc mysql.db; (多分ズレまくりだけどかにんして・・・)
Field | Type | Null | Key | Default | Extra
----------------------+---------------+------+-----+---------+------
Host | char(60) | NO | PRI | |
Db | char(64) | NO | PRI | |
User | char(16) | NO | PRI | |
Select_priv | enum('N','Y') | NO | | N |
Insert_priv | enum('N','Y') | NO | | N |
Update_priv | enum('N','Y') | NO | | N |
Delete_priv | enum('N','Y') | NO | | N |
Create_priv | enum('N','Y') | NO | | N |
Drop_priv | enum('N','Y') | NO | | N |
Grant_priv | enum('N','Y') | NO | | N |
References_priv | enum('N','Y') | NO | | N |
Index_priv | enum('N','Y') | NO | | N |
Alter_priv | enum('N','Y') | NO | | N |
Create_tmp_table_priv | enum('N','Y') | NO | | N |
Lock_tables_priv | enum('N','Y') | NO | | N |
Create_view_priv | enum('N','Y') | NO | | N |
Show_view_priv | enum('N','Y') | NO | | N |
Create_routine_priv | enum('N','Y') | NO | | N |
Alter_routine_priv | enum('N','Y') | NO | | N |
Execute_priv | enum('N','Y') | NO | | N |
Version 5.0.50-Win32 今試したけど、このVerも期待通りに動いた。
*_privの数が、4.0系で12個、5.0系で17個。多分4.1系、5.1系だとまた違うハズ・・。
『今日hogehogeしました。』 『hogehoge テスト』 『hogehogeをhogehogeするテスト』 『hogehogeをhogehogeしたいんです』 『今日はテストがありました。』 『テストをhogehogeするテスト』 『今日はhogehogeのテストをしました。』 のときの出力結果は?
434 :
NAME IS NULL :2007/11/22(木) 13:51:29 ID:UyA449rO
>>433 その単語が多い順です
『hogehogeをhogehogeするテスト』
『テストをhogehogeするテスト』
『今日hogehogeしました。』
『hogehoge テスト』
『hogehogeをhogehogeしたいんです』
『今日はテストがありました。』
『今日はhogehogeのテストをしました。』
みたいな感じを希望します
435 :
NAME IS NULL :2007/11/22(木) 16:20:19 ID:Npi9B+/0
MySQL5.0で以下のsqlでエラーがでてしまいます。 どこか間違っている書き方がありましたらご指摘ください。 $table = "mytable"; $sql = "update `{$table}` " . "set (`text1`, `text2`, `text3`) " . "values " . "(md5('{$d['pass'}'), '{$d['id']}', '{$d['name']}') " . "where id = 10;";
スレが違う
update table set text1=hoge1, text2=hoge2, text3=hoge3 where id=10; じゃないの?
>>437 さんのやりかたで正常に動作できました。
updeteではvaluesは使えないみたいですね、残念な思いです。
正規表現にしてマッチした回数でソートすれば出来るような気がするんだけど
MySQLで正規表現使えたっけ?
うん
>>434 おとなしくSennaとか組み込むべき。
446 :
NAME IS NULL :2007/11/23(金) 00:59:01 ID:OYGbXtrw
すみません、質問させてください not nullを設定してないカラムに値を指定せずinsert文を書いたんですが、登録されません。 insert into table (namae1, namae2) values(1,); *namae2が問題のカラム 上のような形です。 values(1,1); などとしたら正常に動くんですが、 値をいれずに登録するにはどうしたらいいですか? 自分でも調べたんですがどうもわからないのでよろしくお願いします
insert into table (name1) values (1)
448 :
NAME IS NULL :2007/11/23(金) 02:05:55 ID:OYGbXtrw
>>447 ありがとうございます
やっぱりそういう風に値の入ってるものだけに絞ってインサートするしかないんでしょうか?
そうだとすると各パラメータの値の有無ごとに振り分けが必要になって面倒な気がしますが…
>>448 Insert into table (`namae1`) Valuse('1')
Insert into table (`namae3`,`namae256`) Valuse('konyaga','YamaDa!!')
これが
>>446 とどうちがうか理解できなければ、Manualを熟読しませう。
450 :
449 :2007/11/23(金) 03:16:38 ID:???
451 :
449 :2007/11/23(金) 03:19:25 ID:???
さらにごめん。いっしょだた。う〜ん寝る
>>449 はまだ回答はやいわ。中二病ってやつか? 質問の読解すらできてないじゃない
該当のカラムが null を許容すべきかどうかが重要 許容すべきならプログラムなりSQLなりで工夫する
454 :
446 :2007/11/23(金) 06:16:11 ID:OYGbXtrw
あー、だめだ わからん、、
>>449-451 ありがとうございます しかし正直、混乱してきました
やはりカラム名-その値のセットで登録しなきゃいけないんでしょうか?
それだとフォームの必須項目以外の処理が面倒すぎるし、、 デフォルト値の
設定がおかしいのかなぁ どなたかお暇な方ご教授お願いします
webフォームの入力処理はめんどうなんだよ
insert into table values ('hoge1',null); でええやん
あるテーブルの生徒の成績の○と×のデータがあるのですが、 その正解率を計算するのに一回のSQL文で書くことって可能でしょうか? 今は、where文で○のcountと全体のcountを取得するSQL文を2回発行して、 phpで、その○の数÷全体の数で正解率を算出しています。 1回で書く方法がございましたら、ご教授下さい。宜しくお願いします。
>>458 select a.maru / (a.maru + b.peke) from
(select count(*) as maru from table where result='○') a,
(select count(*) as peke from table where result='×') b;
でどうだ
460 :
459 :2007/11/23(金) 11:13:11 ID:???
select a.maru / b.total from (select count(*) as maru from table where result='○') a, (select count(*) as total from table) b; の方がちょっと早いか
>>459 >>460 SQL文って入れ子に出来るんですね。
こんなやり方初めて知りました。
どうもありがとうございました。
MySQLの4.1.15だけど、テーブル作成時にcheck制約って付けること出来ないんでしたっけ?
>>465 即レス、thx。今日本屋で関連の本立ち読みしてアレ?って思ったんですよ。
467 :
NAME IS NULL :2007/11/24(土) 00:20:43 ID:xMeIt7o3
バージョンごとのデータ形式の互換性ってどの程度保たれてるんですか? たとえば同じmyisamでも、 昔はコレーションとかなかったですが今はあります その拡張部分はどこを変えることで行われているのでしょう? MYI,MYDは同じで、frmの属性を増やしていくっていう感じでしょうか
0 rows affected, 1 warning って出るsqlがあるんですが、この時実際の warning メッセージはどうすれば見れますか?
show warnings;
なんでこのスレSPAMの餌食になってんだ?
俺の質問にまともに答えずに、茶化したから。
なぜか、DB板の各スレが餌食になっているのだが。
>>479 俺が悪かった。もうやめてくれ。
481 :
472 :2007/11/25(日) 07:56:53 ID:???
俺ちゃんと答えたじゃないかああああ うわああああん
483 :
NAME IS NULL :2007/11/25(日) 21:43:28 ID:yRCAathj
文書内検索で、次のようなフォーム入力を受け付けるようにしたいと考えてます。 Foo or (Bar and Baz) Foo、もしくは、BarとBazを含む文書、と考えています。 LIKE検索するとして、こうした優先順をSQL文で表現できるでしょうか? 自分のスキルでは思いつかないので、まずFooとBar and Bazをそれぞれ検索して 検索プログラム側で結果をorで絞り込む、ということでとりあえず書いてるんですが これですと全体を2回以上検索することになるので・・・ 入力例は、例えば「ビデオデッキ」と「ビデオ・デッキ」を両方ヒットさせたいようなときに 「DVDプレーヤー or (ビデオ and デッキ)」のように受け付けたいと思っています
>>483 その条件式のまま、whereにlikeで書けばいいんでない?
>>485 ありがとうございます。
〜WHERE column_name LIKE '%DVDプレーヤー%' OR ('%ビデオ%' AND '%デッキ%') 〜
のように書いてみました。
不勉強なもので、このようなカッコを使った書き方ができるとは知りませんでした・・
尚、マニュアル参照してみますm(_ _)m
ビットテストとかは出来ますか?
.cn/ をNGワードにすればいいよ
MySQLの文字化け酷い・・・なにこれ
491 :
446 :2007/11/26(月) 21:08:46 ID:???
>>455-456 ありがとう お礼遅れて申し訳ない
どうにか解決しました サンキューです
つきなみだけど 「文字化け」っていう言葉は本来はbit落ちとかで使うものであって エンコード間違いのときに使う言葉じゃないんだよね
なんとか金払わずGPL回避して、libmysqlを使う方法はありませんか?
>>494 MySQLをやめて、俺SQLを作ればいいのでは?
496 :
NAME IS NULL :2007/11/27(火) 15:45:19 ID:HAXaaf9d
MySQL 5.0.42を使用しているのですが、 以下のようなテーブルを作成し、レコードを登録しておいた場合に、 Where条件として、PRIMARY KEYの3フィールド(field3, field4, field6)をAND条件で指定した時、 SELECTは問題なく行えるのですが、 UPDATEとDELETEが、レコードが存在するにも関わらず、 「Rows matched: 0」と出てしまい、SQLの結果が反映されないのですが、原因とか分かりますでしょうか? CREATE TABLE table1 ( field1 date, field2 varchar(3), field3 varchar(11) NOT NULL, field4 varchar(11) NOT NULL, field5 bigint UNSIGNED, field6 char(1) NOT NULL, CONSTRAINT pk_table1 PRIMARY KEY (field3, field4, field6)) TYPE=InnoDB;
>>494 同じプロトコルで同じ内容をしゃべる/きくようにすれば医院じゃ内科医?
>>494 C++ <-> Python <-> MySQLdb <-> MySQL
こんな wrapper を書いてみたり
>>496 | Warning | 1287 |
'TYPE=storage_engine' is deprecated; use 'ENGINE=storage_engine' instead |
こんなん出たけど
mysql> select * from tb1 where f3 = '12345678901'; +------------+------+-------------+-------------+----------------------+----+ | f1 | f2 | f3 | f4 | f5 | f6 | +------------+------+-------------+-------------+----------------------+----+ | 2007-11-27 | 234 | 12345678901 | 01234567890 | 12345678901234567890 | a | | 2007-11-27 | 234 | 12345678901 | 01234567890 | 12345678901234567890 | b | | 2007-11-27 | 234 | 12345678901 | 01234567890 | 12345678901234567890 | c | | 2007-11-27 | 234 | 12345678901 | 11234567890 | 12345678901234567890 | a | | 2007-11-27 | 234 | 12345678901 | 21234567890 | 12345678901234567890 | a | +------------+------+-------------+-------------+----------------------+----+ 5 rows in set (0.00 sec) mysql> update tb1 set f6 ='x' where f3 = '12345678901' and f4 = '01234567890' and f6 = 'a'; Query OK, 1 row affected (0.06 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> delete from tb1 where f3 = '12345678901' and f4 = '01234567890' and f6 = 'x'; Query OK, 1 row affected (0.05 sec)
501 :
483 :2007/11/27(火) 18:59:37 ID:???
すみません、先日質問させてもらった者です。WHERE節で
WHERE column_name LIKE '%DVDプレーヤー%' OR ('%ビデオ%' AND '%デッキ%')
のように式を書いて、エラーもなく動作したのですが、
その後、この記法についてマニュアルで見つけることができません・・・
ここにそれらしき記法を見つけたんですが(WHERE節の最適化の例のひとつとして)
ttp://dev.mysql.com/doc/refman/5.1/ja/where-optimizations.html また、手探りで式を変えながら試してみると、
上記の例の場合も、エラーは出ないものの、最初のDVDプレーヤーしか対象になっていないようなんです。
該当のマニュアルページを教えていただけるとありがたいのですが・・
文字コードがあってないんジャマイカ
予想はしていたが これはひどいw WHERE column_name LIKE '%DVDプレーヤー%' OR ((column_name LIKE '%ビデオ%') AND (column_name LIKE '%デッキ%'))
>>500 なんでだろう・・・・自分のだとこうなる。
mysql> desc table1;
+--------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| field1 | date | YES | | NULL | |
| field2 | varchar(3) | YES | | NULL | |
| field3 | varchar(11) | NO | PRI | | |
| field4 | varchar(11) | NO | PRI | | |
| field5 | bigint(20) unsigned | YES | | NULL | |
| field6 | char(1) | NO | PRI | | |
+--------+---------------------+------+-----+---------+-------+
6 rows in set (0.02 sec)
mysql> select * from table1 where field3 = '00000000002' and field4 = '0' and field6 = 'N';
+------------+--------+-------------+--------+--------+--------+
| field1 | field2 | field3 | field4 | field5 | field6 |
+------------+--------+-------------+--------+--------+--------+
| 2007-11-27 | aaa | 00000000002 | 0 | 100 | N |
+------------+--------+-------------+--------+--------+--------+
1 row in set (0.00 sec)
mysql> update table1 set field2 = 'bbb' where field3 = '00000000002' and field4 = '0' and field6 = 'N';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
mysql> delete from table1 where field3 = '00000000002' and field4 = '0' and field6 = 'N';
Query OK, 0 rows affected (0.00 sec)
506 :
483 :2007/11/27(火) 20:48:24 ID:???
>>502-504 ありがとうございます。
並列のLIKE検索式に対してカッコを使用するのですね。あうっ・・
今度は結果も確認できました。
案内いただいたページも参考にさせていただきますm(_ _)m
>>494 libmysqlでも何でも使ってDBにアクセスする「サーバ」を作れ。
それに接続するクライアントとしてお前のプログラムを作ればいい。
ソケット越しの連携は何をどうやってもGPLとは関係が無いからな。
そのサーバは公開義務があるけど、別にただのラッパだから
公開しても痛くも痒くもないだろ
>>505 mysql> desc tb1;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| f1 | date | YES | | NULL | |
| f2 | varchar(3) | YES | | NULL | |
| f3 | varchar(11) | NO | PRI | | |
| f4 | varchar(11) | NO | PRI | | |
| f5 | bigint(20) unsigned | YES | | NULL | |
| f6 | char(1) | NO | PRI | | |
+-------+---------------------+------+-----+---------+-------+
6 rows in set (0.55 sec)
パフォーマンスを向上させるために、 複数のINSERT文を一つのマルチプルINSERT文に書き換える予定です。 ただ、SQL文が非常に長くなってしまいますが、 MYSQL5.0で、一つのSQL文の長さの制限ってどれ位でしょうか? お願いします。
511 :
NAME IS NULL :2007/11/28(水) 22:33:22 ID:fitDzhSE
SQLの長さに制限なんてあるの?
とりあえずmax_allowed_packetで制限されてるみたいだよ。 max_allowed_packetのデフォルトは1MB。 $ ls -l long.sql -rw-rw-r-- 1 xxxxx xxxxx 16921095 11月 29 00:04 long.sql $ head long.sql insert into ltest values (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), (default), $ mysql test < long.sql ERROR 1153 (08S01) at line 1: Got a packet bigger than 'max_allowed_packet' bytes
1MBギリギリで実験。 $ ls -l long.sql -rw-rw-r-- 1 taira taira 1048546 11月 29 00:12 long.sql $ mysql test Server version: 5.0.46-enterprise MySQL Enterprise Server (Commercial) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show variables like '%allow%'; +--------------------+---------+ | Variable_name | Value | +--------------------+---------+ | max_allowed_packet | 1048576 | +--------------------+---------+ 1 row in set (0.00 sec) mysql> source long.sql Query OK, 95320 rows affected (1.53 sec) Records: 95320 Duplicates: 0 Warnings: 0 大丈夫。
>>512 >>513 わざわざ、検証までして下さってお忙しい中、どうもありがとうございました。
max_allowed_packetの設定値だったんですね。ちなみに、私が使っているxreaでは8MBに設定されていました。
とても参考になりました。
どうもどうも、ありがとうございました。
SELECT * FROM t INNER JOIN a ON t.aid = a.aid INNER JOIN b ON t.bid = b.bid 3つのテーブルを結合しているのですが、USINGを使って書き換え方が分かりません、、 よろしくお願いいたします
517 :
515です :2007/11/29(木) 22:18:52 ID:???
どうもすみません テーブル2つ(t,a)だったら SELECT * FROM t INNER JOIN a USING (aid) のように書けたのですが、3つになったとき SELECT * FROM t INNER JOIN a USING (aid) INNER JOIN b USING (bid) はエラーになります USING句を知ってシンプルに書けるなあと思い使ってみようと思いました
select t.* from t, a where t.aid=a.aid; select t.* from t, a, b where t.aid=a.aid and a.aid=b.aid; じゃダメなの?
テーブルaにbidという列があるとダメみたい。 mysql> desc t1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | col1 | int(11) | YES | | NULL | | | col2 | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> desc t2; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | col1 | int(11) | YES | | NULL | | | col3 | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> desc t3; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | col1 | int(11) | YES | | NULL | | | col2 | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> select t1.col1 from t1 inner join t2 using (col1) inner join t3 using (co l2); +------+ | col1 | +------+ | 1 | | 2 | +------+ 2 rows in set (0.00 sec) t2にcol2列が無い場合は、こんなかんじでちゃんと動く。 でもONで書くのが自然だと思うぞー
MySQLで、 INSERT INTO `hoge_t` (`test_c`) VALUES (' '); みたいなSQL文を実行した場合、 `test_c` に " " (半角スペース1つ) では無く、"" (文字列無し) が入ってしまいます。 これは何故でしょうか? また、解決策はあるのでしょうか? 教えて下さい。
where文を作成する時に、INとORだったら、どちらが速いでしょうか? WHERE FIELD IN ('a', 'b', 'c') WHERE FIELD A OR FIELD B OR FIELD C FIELDには、indexを貼っています。
>>522 ためしに、何回かクライアントで実行してみましたが、
実行するタイミングによって処理速度がちがって、
有意な差が見られないような気がしました。
explain取ってみてプランが同じなら同じってことでいいと思う。 こっちで試した限りは同じだった。
525 :
私のSQL :2007/12/01(土) 12:27:11 ID:HP5Wtz1B
初めまして。 MySQLでUpdateをしたときに思うように動作しないので質問させていただきます。 profileテーブルにsexという項目をvarchar(2)で定義しています。 UPDATE profile SET sex="きんさんぎんさん" where user_id = "00000002" というSQLを流すと”きん”という結果がupdateされます。 通常こういった場合はエラーにならないのでしょうか。 なにか設定の問題なのでしょうか。
mysql> create table ctest (c1 varchar(2)); Query OK, 0 rows affected (0.06 sec) mysql> insert into ctest values ('abc'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> show warnings; +---------+------+-----------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------+ | Warning | 1265 | Data truncated for column 'c1' at row 1 | +---------+------+-----------------------------------------+ 1 row in set (0.00 sec) mysql> set @@sql_mode = 'strict_all_tables'; Query OK, 0 rows affected (0.00 sec) mysql> insert into ctest values ('def'); ERROR 1406 (22001): Data too long for column 'c1' at row 1 mysql> select * from ctest; +------+ | c1 | +------+ | ab | +------+ 1 row in set (0.00 sec) mysql> update ctest set c1 = 'abc' where c1 = 'ab'; ERROR 1406 (22001): Data too long for column 'c1' at row 1
質問者の使用バージョンも判らんのに。
んなもん、書かない方が悪い
530 :
NAME IS NULL :2007/12/03(月) 23:59:40 ID:PJiuXVSt
answerカラムの値が「赤」「赤,青」と、2件のレコードがあるとします。 SELECT count(answer) AS cnt FROM faq WHERE answer LIKE '赤' GROUP BY answer とした時、cntは1にしかなりません。 1つのカラムに複数の値が入っているから、集計出来ていないのだと思いますが どういうSQLを書けばいいのでしょうか?
何がしたいのかはっきりせんけど ・LIKE '%赤%' ・GROUP BY を削除
>>531 %は抜けていました。すみません。
あと、GROUP BYはいらなかったんですね。
これを削除したら希望通り、件数が表示されました。
ありがとうございました。
533 :
NAME IS NULL :2007/12/04(火) 09:35:19 ID:J4jZq34H
MySQL Server 5.0 をインストールしたのですが環境設定の、 Install As Windows Servicd Service Name: Include Bin Directory in Windows PATH 3つのチェック項目が現れる部分で一番下の、 Include Bin Directory in Windows PATH 以外の2つの項目が選択できません。 その後のパスワード設定は画面すら飛ばされてしまいます。 OSはWindowsMEでの起動を試みています。 どなたかMEでも起動する方法を知りませんか? 何とかMEで起動させたいのですが。
MEとか久々に見たな。
537 :
533 :2007/12/05(水) 02:46:04 ID:???
あれから調べましたが、コマンドラインが起動してすぐに強制終了するので、 何かをするとか無理ですかね? やっぱりパスワード設定出来ないと駄目なのかなぁ…
> コマンドラインが起動してすぐに強制終了するので 本当に強制終了?なんらかのプログラム(mysql.exeとか)を起動後 コマンドプロンプトが一瞬だけ表示されてすぐ消えるとかじゃなくて? 文面からしてコマンドライン自体よくわかってないように見えるけど
素直に.4.1以前を使った方がいいと思う(本に添付されているやつとか
540 :
537 :2007/12/05(水) 12:34:10 ID:???
>>538 それです。一瞬表示されて消えてしまいます。
お察しの通りSQLの勉強始めたばかりなのでよく分かってません…
>>539 4.1以前ならMEでも動くんですか?
それならそちらを探し出して使います。
542 :
537 :2007/12/05(水) 13:40:38 ID:???
>>541 超助かります。ありがとうございました。
mysql サーバーを外付けhddなどに入れて macとwindowsで共有することは出来るでしょうか? 2台のネットワークにつながっていないパソコンにhddをつないで mysqlを持ち運ぼうとおもっています 一つのデータベースを2種類のサーバをつかって共有するという感じです 実行は別々の時間です windowsだけならば何でもできるけど macなんで良い方法ないですか?
545 :
NAME IS NULL :2007/12/08(土) 22:42:32 ID:AP+yiBIl
すみません、お聞きします 今、スケジューラみたいのものを作っていて、 month=12&day=9 のような形でサーバに送って、それぞれまともにmonthカラムとdayカラムに 突っ込んでいます。 これを、date型に成形して、mysqlの方でもその形で1カラムにまとめたとしたら、 運営上どのような利点があるんでしょうか? 厨質問かも知れないですが、回答お願いします 検索などの速度が向上するとかあるんでしょうか、、
日付型にしとくと、日付の演算が可能になるでしょ 月と日が別カラムだと、月をまたぐ計算が面倒
547 :
545 :2007/12/09(日) 00:30:25 ID:???
ありがとうございます そういう効果があるんですね 日付型の特長について、調べてみます!
MySQLのデータを、一般公開できるくらいのデザインで 簡単に整理して表示するWebスクリプトはありますか? phpMyAdminなどの管理用のユーティリティソフトは導入していますが、 ・検索や優先順位付きのソートだけでよい ・ユーティリティだけにデザインが難しい という問題があります。 スクリプトをいちから組むのはめんどくさくて…
webprog板池
sage
innoDBにてリレーションを組んだテーブルがあるんですが、 片一方のテーブルのデータを削除すると "foreign key constraint fails"が出ます。 ondelete cascadeをせずに、片一方のテーブルのデータを削除する方法はありますでしょうか。
何のための外部キーなのだ
>>552 set foreign_key_checks=0;
おすすめはしない。
夜だからかちょっと混乱してるかもです… ショッピングカートのデータベースです。 user,shopcartというテーブルがあり、それぞれ -user userid int(11) name varchar(64) -shopcart userid int(11) goodsid int(11) price int(11) accounted int(1) #0:未清算,1:清算済み となっています。(実際はもっと複雑で違った用途ですが…) このとき、 未清算(accounted=0)で、価格が10,000円以上(price>10000)の商品が 買い物かごに入っているユーザの名前を検索するのは どういったSQL文を書けばいいのでしょうか。
違った…これじゃすごい単純だ SELECT name from INNER JOIN shopcart ON user.userid = shopcart.userid WHERE shopcart.price>10000 & shopcart.accounted = 0 でいけたわ 必要なのは 「未清算(accounted=0)で、価格が10,000円以上(price>10000)の商品が 買い物かごに入っている」 かつ 「清算済み(accounted=1)で、価格が10,000円以上(price>10000)の商品が 買い物かごに入っている」 ユーザの名前を検索するSQL文でした お騒がせしてます
priceは除いても必要な構文は同じなので除外します。 日本語で言うと 「未清算の商品と清算済みの商品がそれぞれ1点以上カートに入っているユーザの名前」となります つまりまとめてみると 『shopcartに userid=x AND accounted=1 なレコードがあり、かつ shopcartに userid=x AND accounted=0 なレコードがある』 という条件を満たすuserid=xに対応するnameを求める ということです。 ん?おかしい? GROUP BYでもいける気もする
これでどうか select u.name from (select distinct userid from shopcart where accounted=0 and price>=10000) a, (select distinct userid from shopcart where accounted=1 and price>=10000) b, user u where a.userid=b.userid and a.userid=u.userid;
>>559 みゃー
サブクエリ(?)でしたか
未知の領域ですががんばって勉強します
ありがとうございました
having を使ってうまいこと書けないかと思ったが 眠いのでネルス
562 :
NAME IS NULL :2007/12/12(水) 21:07:36 ID:5IOTZHnS
mysqlの管理用にphpMyadminを触っています。
インストールの過程で要編集とあるconfig.inc.phpの項目が自分のpmaの
バージョンでは存在しません
自分のバージョンは2.11.3で、存在しない項目は以下のとおりです
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';
$cfg['PmaAbsoluteUri'] = '';
どうしたらいいでしょう?
http://www.shiftweb.net/material/phpmyadmin/phpmyadmin.html を参考に作業してます
ここで質問していいのか不安でしたがお尋ねしました お願いします
MySQLのばーじょn
Mysql administratorでUTF-8で保存した日本語が文字化けるんだけど、対応してない? MySQLは5です。
>>562 そのページは phpMyAdmin 2.5.6 向けに書かれているみたいだから
書かれている通りに作業を進めていってもうまくいかないと思うよ。
(認証メソッドもクッキー認証のままだろうし)
面倒くさいかもしれないけど、設定ファイルに書かれている項目を
一つひとつ理解しながら進めるのがいいと思う。
あるいは最新版にも使えそうな別の解説ページを探すとか。
>>565 そうみたいですね
2.5.6を落として入れてみたんですが、それも上手くいきませんでした。
実は壊れたマシンの中じゃ動いてたんだけど、こういうのって
上手く動作したらすぐにそのバージョンや手順をメモっておくべきなんでしょうね
失敗したなぁ;; ありがとうございました
あとそのときのバージョンのインストールパッケージ一式残しておくこと いつまでもダウンロードできるとは限らない
CPUの交換を行って、CPUの性能が上がったのに データアクセスが遅くなりました。 CPUを交換したら、Mysqlの再インストールが必要な場合があるんでしょうか?
>>568 おいおい、当たり前でしょ。システムの主要部分の構成を変えているのに、
そのままで運用する気かよ。
>>569 返答ありがとうございます。
やっぱりMysqlをインストールする時にそのマシンの
構成によって何かしらの変化があるって事なんですね?
再インストールすれば大丈夫でしょうか?
素人ですいません。。。
バイナリの再インストールなら変わらないんじゃないの?
MySQL5.0.30未満+InnoDBの環境だと、 CPUのコア数増やすと返って遅くなる場合があるよ
カーネルにも依存するわな。 今度のFreeBSDはマルチコアに対して期待できるパフォーマンスを発揮するが、 LINUXだと、コアが増えるとパフォーマンスが落ちるみたいな話があるし。
☆トム・クルーズについて語らう☆part3Tom Cruise [海外芸能人] Pythonのお勉強 Part22 [プログラム] 萌えろ!シエンナ・ギロリー [海外芸能人] 【フィギュア】禁断の小学生バニー!「涼宮ハルヒの憂鬱 キョンの妹 バニーVer.」発売 [萌えニュース+] 海外芸能人板が在日朝鮮人に支配されてる見た感想 [海外芸能人]
いえ、別に言いたいことはありません。ただ、・・・
ただ単に偉そうに言って見たかっただけだろ。
579 :
NAME IS NULL :2007/12/14(金) 20:27:54 ID:3RR5o2qv
あるデータベース内のテーブル名の一覧を取得するには、 SHOW TABLES FROM db_name; となり、更にテーブル名が「dtb」から始まるものを同様に取得するには、 SHOW TABLES FROM db_name LIKE 'dtb%'; になると思いますが、 逆にテーブル名が「dtb」から始まるもの以外の一覧を取得するには どのような SQL 表現となりますでしょうか? 間違っているとは分かっていながら、あえて書くと SHOW TABLES FROM db_name NOT LIKE 'dtb%'; のような感じのことをしたいのです。 どなたかご教示ください。
>>579 バージョンは?
俺んとこ、5.0.45だけど、
show tables like 'k%';
で使ってるデータベースの中からkが先頭の奴の表示が出来たけど。
5.0以降なら select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = 'db_name' and TABLE_NAME not like 'dtb%';
582 :
580 :2007/12/14(金) 21:35:14 ID:???
…以外のだったのね スマソ
583 :
NAME IS NULL :2007/12/14(金) 22:31:47 ID:dYcjukjg
2ちゃんねるって有料なの?
はい。有料です。
2ちゃんねる使用料
■閲覧
1スレッド 25円
■書きこみ
1レス 10
スレ立て 500円(大人の時間、ニュース速報は1000円)
混雑時は立てる事が出来ない場合がありますが、その時は課金されません
■書きこみ放題
・プラチナプラン 4800円 閲覧無料 スレ立て200円、通常3スレ/月、実況5スレ/週の無料サービス
・ゴールドプラン 3500円 閲覧無料 スレ立て半額 HOT!
払わないと、大変なことになるかもしれませんね・・・( ̄ー ̄)ニヤリ
2ちゃんねるは有料だった
ソース
http://www.geocities.jp/guide_2ch/
585 :
579 :2007/12/14(金) 23:20:12 ID:???
>>581 レスありがとうございます。
こちらの使っているものは MySQL 4.1.22-community-nt でした。
せっかく教えてもらえる機会をいただいたのに
バージョンを書くことをすっかり忘れてしまいました。
申し訳ありませんが、再度お知恵をお貸しください。
587 :
NAME IS NULL :2007/12/15(土) 05:46:55 ID:o7//W6yx
現在MySQL5.0.45@FreeBSD6.2(サクラの専用)を運用してるんですが、日本語にうまく対応してくれません。 具体的には、 SELECT * FROM hoge WHERE hogege='日本語'; という文を書いても何も返ってきません。 SELECT * FROM hoge WHERE id='1'; でやると返ってきます。SET NAMESやSET CHARACTER SETなども試してみましたし、default-character-setもUTF8で統一したんですが、駄目みたいです。 何が原因かわかりますか?初心者質問で申し訳ありません。
select文を打つ前にset charset utf8を投げてみれ。 コマンドプロンプトでsql文を投げてるなら、PHPのmysql_queryでも試してみ。 そのテーブル自体がutf8じゃなかったりすると、ALTER TABLEで文字コードを変換する必要がある。 未確認だけど、たぶんdefault-character-set統一後にTABLEを作成する必要があるかもです。
>>588 そういう押し付けがましいレスは止めろ。
5.0.45って書いているんだから、文字コードの問題じゃないだろ。
ラーメン屋の癖にイタリアン風の盛り付けをして、
フォークとスプーンで食べさせるのと一緒だろ。
分をわきまえろ。
イタリア系の人はラーメンもフォークで食おうとするけどね。
そういう押し付けがましいレスは止めろ。 ↑ 流行ってるんですか?
低脳の決まり文句です。
スパゲッティ食いに行って 箸出されるのも困るよね
チャーハン注文してスプーン出てきたら、食べやすくはあるが萎える。
596 :
NAME IS NULL :2007/12/15(土) 10:24:38 ID:o7//W6yx
すいません。チャーハンはいつもスプーンで食べます。 set charset utf8でも駄目でした。ちなみにPHPから投げてます(コマンドからは何故か日本語入力できないので) 一応idからとってきたときにはデータはutf8で表示されており、データベースもテーブルもutf8になっていました。 日本語の問題だと思うんですが、どこをいじれば良いかわからないです。
597 :
NAME IS NULL :2007/12/15(土) 10:41:02 ID:vWyiU39c
>>596 PHPのスクリプトはUTF-8で書かれてるの?
set names utf8; も試してみて。 あと関係ありそうなシステム変数を手当たり次第ダンプすれば 解決の糸口になるかも。 show variables like 'character_set%'; show variables like 'collation%';
チャーハンに付いてくるレンゲでは食べにくい。 普通の金属のスプーンなら食べやすいけど。 PHP使ってる時点でスキル低いから無理でしょ。 SJIS使えるアクセスでも使ったら?
PHPで投げるのがそんなに嫌か? 適材適所だと思うんだがなぁ
>>599 は人口無能じゃないの?
他のスレでもこういうの見かけたことあるよ
プログラム言語に何を使ってるかということと スキルの優劣はなんら関係ないと思うんだがね プログラム言語なんてのは、目的を達成するための 単なる道具に過ぎないわけだし
アクセス、、、笑
604 :
596 :2007/12/15(土) 17:42:01 ID:o7//W6yx
これでset names utf8投げても駄目なんです。 character_set_client => sjis character_set_connection => sjis character_set_database=> utf8 character_set_filesystem => binary caracter_set_results => sjis character_set_server => utf8 character_set_system => utf8 collation_connection => sjis_japanese_ci collation_database => utf8_general_ci
そこは set names sjis じゃね?
606 :
NAME IS NULL :2007/12/16(日) 02:08:05 ID:ZkJ63S3/
現在自宅では、WindowsXPに4.0.24を入れてテストしています。 いきなり5系にしたいのですが、phpMyAdminなどで データベースの内容をインポートするだけで、移行出来ますでしょうか? もしくは、作成しているPHPが動かなくなる可能性はあるのでしょうか?
データが20行あるとして、 ORDER BY field ASC LIMIT 3 とすると 1行目 2行目 3行目 ORDER BY field DESC LIMIT 3 とすると 20行目 19行目 18行目 と表示されます。ですが、 18行目 19行目 20行目 と表示させる方法が分かりません。どうすればいいのでしょうか。 初歩的な質問で済みません。
order by field asc limit 3 offset 17;
そういや”ラスト3”って指定なかったっけ?
>>609 無いよ。勝手な仕様を脳内で創出しないように。
こんど虚偽の投稿したら、偽証罪で通報するよ。
なんと香ばしい発言だこと w
>>608 ありがとうございます。
状況によって行数が増える(わからない)場合はどうすれば良いですか?
>>612 1. DESCで取得して、逆順に表示する
2. 最初にOCUNT()する
あ、COUNT()のtypoね。
>>613 MySQL側ではそのような機能はないんですね。
phpを利用しているので、1.で逆順に表示することにしました。
ありがとうございました。
降順に欲しいだけ取るサブクエリの結果を さらに昇順にソートすれば? 試してないので出来ないかもしれんけど
>>616 SELECT * FROM (SELECT * FROM table ORDER BY field DESC LIMIT 3) ORDER BY field ASC
できそうですね。4.0なのでテストできないですが…
618 :
NAME IS NULL :2007/12/17(月) 01:20:54 ID:+StW6xi3
INSERTとSELECTを1文で行いたいのですがどんな方法があるでしょうか? INSERT後にselect last_insert_id()を実行したいのですが1文で書ければと思っております・
そういうプロシージャを書くとか?
function hoge(hoge) { insert into hage(hoge)values('hoge'); select last_insert_id(); } hoge(); // ←一行
日本語ってほんともうだめ 文字コードとかめんどくさ
複雑なほうがエンジニアの需要も高くなるんで、それもまた良しかなと
field_a, field_b, field_c, field_dというテーブルがありまして、 field_aとfield_bとfield_cをキーにしたり、field_aとfield_cをキーにしてりして、 SELECTしたりUPDATEしたりするのですが、この場合、どういう風なINDEXをはるとよいでしょうか? 案1) field_a, field_b, field_cに対して一つのINDEX 案2) field_a, field_b, field_cと、field_a, field_cとの二つのINDEX 宜しくお願いします。
条件が (A,B,C) と (A,C) だけなら (A,C,B) の index を作って (A,C,B) と (A,C) の条件にする のがマンドクサなら案2で
メール考えなきゃUTF8で統一。 メールもRFC無視してUTF8で送ってしまえば良いのだよ。8ビット目落とされても文句は言えないが。
>>625 Content-Transfer-Encodingに8bitを指定してもダメなの?
ま、もうUTF8でいいと思うんだけど、携帯がなー
スレ違いでごめんなさい・・・ データグリッドで1レコード複数行表示が可能なおすすめのフリーソフトってありませんか?
mysqlでmy.iniとmy.cnf両方にdefault-character-set=sjisを追加しても、 create database後のstatus、ServerとDbの項目がlatin1のまま変わらない。 他のClientとConnの項目はsjisになってるんだけど、どうすればええのん?
テーブル作る時、数値型のカラムに「最大表示サイズ」のオプションがありますが、 これってどういう意味があるのでしょうか? 絶対値でも桁数、バイト数でも無いし・・・
>>629 zerofillした時に関係する気がするけど確認してない。
つかドキュメント読めよ。
すみません、言葉足らずでした(汗 リファレンスは読んだんですが「最大表示サイズ、最大は255」となっていて、 ためしにsmallint(3)で定義したカラムに、「1111」を入れることもできるし selectで読むことができたので、じゃあ何の意味があるんだろう?・・・と。 zerofillを指定しない時は指定する意義は無いということでしょうか?
MySQLのバージョン 5.0.45 MySQL の文字セット: UTF-8 です phpMyadminで以下のように実行すると CREATE TABLE `test_3`.`test` ( `test_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR( 255 ) NOT NULL , `name_kana` VARCHAR( 255 ) NOT NULL , INDEX ( `name` , `name_kana` ) ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci 「 #1071 - Specified key was too long; max key length is 1000 bytes 」 というエラーが出て作成できません ググってみると原因は何となく分かったのですが 以下のように書き直したところ、正常に実行できました CREATE TABLE `test_3`.`test` ( `test_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR( 255 ) NOT NULL , `name_kana` VARCHAR( 255 ) NOT NULL , INDEX `name` ( `name` ) , INDEX `name_kana` ( `name_kana` ) ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci 命令文としては同じ内容だと思うのですが、 実行出来る、出来ないの違いはなんなのでしょうか?
634 :
NAME IS NULL :2007/12/20(木) 19:18:51 ID:0XfdB7ZB
携帯メールアドレスを抽出する為に WHERE m_mail LIKE '%@.ezweb.ne.jp%' としたのですが、@が認識されないみたいです。 どうしたらいいのでしょうか?
>>633 上の例は name と name_kana の組み合わせのインデックスを作る
下の例は name, name_kana それぞれ単独のインデックスを作る
UTF-8 の char 系 index はフィールド長 * 3 だけ必要みたいで
>>634 @ の次の . が余分 とかいうオチじゃないよね?
最大 1000 バイトなので 333 文字以下にしないとエラーになる、、、みたい
データのほとんどが先頭 xxx/yyy 文字に収まるなら、INDEX(name(xxx),name_kana(yyyy))
とキーの長さを指定する手もある、、、みたい
何か変だ
>>633 上の例は name と name_kana の組み合わせのインデックスを作る
下の例は name, name_kana それぞれ単独のインデックスを作る
UTF-8 の char 系 index はフィールド長 * 3 だけ必要みたいで
最大 1000 バイトなので 333 文字以下にしないとエラーになる、、、みたい
データのほとんどが先頭 xxx/yyy 文字に収まるなら、INDEX(name(xxx),name_kana(yyyy))
とキーの長さを指定する手もある、、、みたい
>>634 @ の次の . が余分 とかいうオチじゃないよね?
INDEXとKEYの違いってなによ
>>637 INDEX と PRIMARY KEY の違いなら
PRIMARY KEY = UNIQUE + INDEX
EXPLAIN で、extraにでてくる where used; ってどういう意味? where節があります、とかその程度の意味でいいの?
mysqldumpでテーブル毎にdumpしてって、900万レコードくらいのテーブルだけdumpに失敗します。 mysqldumpで巨大なテーブルのdumpを取りたい場合どうすれば良いのでしょう?
>>641 その場合は、dumpじゃなくてjumpでやればいいよ。
643 :
641 :2007/12/21(金) 13:47:02 ID:???
>>642 アドバイスありがとうございます。
おかげさまで解決しました。
644 :
633 :2007/12/21(金) 13:57:00 ID:/Pkbu7e1
>>636 組み合わせのインデックスは知りませんでした
上と下は全然違う内容だったんですね
phpMyadminのCREATE TABLEでINDEXの指定の仕方が悪かったようです…
丁寧なお答え ありがとうございました
みんなEXPLAINって使わないのかね・・・ふむ
質問です。 検索結果に見つかった順にシーケンス番号のようなものつけたいと思っています。 SELECT ・・・ FROM table ORDER BY ・・・ としたとき、結果セットとして、 data_no, (そのほかのカラム) 1,(そのほかのカラムの検索結果) 2,(そのほかのカラムの検索結果) 3,(そのほかのカラムの検索結果) : みたいな感じにdata_noの項目を追加したいと思っています。 どのようなSQL文で実現できるでしょうか?
647 :
646 :2007/12/21(金) 22:29:04 ID:NlVp5uky
補足です。 実際にしたいことは、 INSERT INTO other_table SELECT ・・・・ のような感じなので、表示側での対処はできません。
648 :
NAME IS NULL :2007/12/22(土) 03:02:11 ID:7IWITQTe
JOINの考え方について質問です。 aテーブルに1000レコード有り、bテーブルに10万レコードあるとします。 これをINNER JOINで結合すると、 実質1000×100000=1億レコード となるのでしょうか?上記のような結合をすると、インデックスを付けても 凄く重いので、実際は物凄いレコード数になっているのかな?と思ってます。
結合条件が一つもなければ1億になる。 けど普通はリレーションがあるからそんなことにはならない。 たとえばaテーブルが注文テーブルで、bテーブルが注文明細テーブルなら、 bテーブル側の注文番号に正しくインデックスがついてれば 1000(注文件数)×100(注文1件あたりの明細件数)=100000レコード になるだけ。
分割insertすれば5000マンで済むよん
DB接続時にmy.cnfを設定するようなやりかたなかったでしたっけ? mysql://user:pass@localhost?my.cnf/test みたいな
>>646 other_table 側の data_no を AUTO_INCREMENT にしておくとか
653 :
648 :2007/12/22(土) 11:44:14 ID:7IWITQTe
>>649 それでもやっぱり、1000×100で10万なんですね・・。
質問したのは、住所録を作成する時、郵便局が発行している
郵便番号・住所データと結合する場合を想定していました。
あれは全部で10万レコード以上あるし。
会員住所+住所データを結合すると、もしかして
>>648 みたいな
考え方になると。だから極端に重くなるのでは?っと。
>>653 なんか勘違いしてないか?
郵便番号と住所を結合するなら会員住所1に対して住所データ1だろ?
656 :
NAME IS NULL :2007/12/23(日) 03:12:42 ID:OaV/mejR
UNIONでテーブル同士を結合したら、かなり表示が重いです。 SELECT * FROM member_a INNER JOIN address USING(address_id) UNION SELECT * FROM member_b INNER JOIN address USING(address_id) LIMIT 10 としています。INDEXもaddress_idに指定しています。 しかし、ローカルPC上で確認した時、表示に約10秒はかかります。 EXPLAINをしても特に問題ありません。 member_a,bにはそれぞれ1000レコードあり、addressには1万レコードあります。
>>656 addressテーブルはインデックスきいてるってことだから、
1万だろうが1000万だろうが速度差はそれほど出ないですよ。
SELECT * に時間かかってないかい? SELECTを整数の
1項目だけに絞ったら何秒になんの?
>>656 UNIONは暗黙的にソートするから
内部的にmember_a,bを全件取ってきてしまうな。
UNION ALLにするとどうなる?
UNIONが避けられないなら、my.cnfで
sort_buffer_sizeとtmp_table_sizeを増やしてみよう。
ところで社保庁のデータベースって何使ってんの? 高スペクでも照合に時間かかるだろうなー。
>>659 社会保険庁は、NTT系が受注開発しているから、
Oracleに決まっているだろ
>>656 EXPAINの結果を張らないヤツの「問題ありません」は信用できないからなー
MySQL ver4.1以降の文字コード自動変換について イマイチ理解できない部分があります。 MySQL文字化けで調べてみると、 文字コード変換が原因なので、この機能が働かない状態にする、 というのが解決方法として紹介されていますが、 文字コードが異なった場合の補正のための機能であって、 client側の文字コードがujis、 server側の文字コードがutf8の場合、 この自動変換をoffにしたら、 ujisのデータをutf8を入れるところに放り込むことになるわけですが 問題ないのでしょうか? (client/serverの文字コードが一致しているんであれば、 そもそも自動変換自体働かないわけで、offにする必要性もでてきませんよね?) 自動変換をoffにするんだよ、というところには多くのサイトで 言及されているのですが、結局client、serverとの 文字コードの関係性が良く理解できません。
開発と照合で5000マンだっけ?>社保庁 稼ぐなぁ
じゃおまいら5000マソもらってできるか?アンダーソン君
665 :
NAME IS NULL :2007/12/23(日) 12:24:22 ID:5+xrhDuZ
質問させてください。 MySQL+PHPでWebブラウザから画像データ(約9KB)をアップロードして その画像データをMySQLにBLOB型で登録しようとしています。 アップロードデータは以下のように処理しています。 $img = file_get_contents($_FILES["img"]["tmp_name"]); $img = addslashes($img); ↑$imgを登録したい。 しかしINSERT文で You have an error in your SQL syntax; となってしまいます。 また、疑問点として 1.BLOB型で上のような画像データを登録する際にSQL文のデータ部分は シングルクォートで囲う必要があるのか? 2.addslashesは必要か? ※ネットで調べると1.2ともに付いていたり、付いてなかったりします。 環境:CentOS5.1 MySQL5.0.22(文字コードはSJIS) 以上よろしくお願いします。
666 :
656 :2007/12/23(日) 13:20:41 ID:???
>>657 1項目だけに絞っても大して時間が変わりません。。
とりあえずUSING(address_id) の後ろに GROUP BY id
を付けたら、半分ぐらいの秒数にはなりました。
>>658 UNION ALLにすると、余計重たくなっているような気がします。
あと、sort_buffer_sizeは1Mでtmp_table_sizeは100Mにしています。
>>661 GROUP BY idをそれぞれのSELECTに付けたら
半分ぐらいの秒数になりましたが、
[Extra] => Using temporary; Using filesort が表示されるようになりました・・。
where used; ってどういう意味?
ググレカス
669 :
NAME IS NULL :2007/12/23(日) 16:49:51 ID:wHJQxIfX
質問です。 MySQL 4.1.20 と PHP 4.3.9 がインストールされている共用レンタルサーバで、 文字コードが EUC で記述されている PHP を稼動させています。 この PHP で EUC のデータベースを作成し、そこに同じく EUC で日本語データを格納しているのですが、 このデータを mysqldump にてダンプする際に起きる文字化けに悩まされています。 現在の MySQL の文字コード設定は以下のようになっています。 character_set_client = utf8 character_set_connection = utf8 character_set_database = ujis character_set_results = utf8 character_set_server = latin1 character_set_system = utf8 更に my.ini もしくは .my.cnf は使用できず、データベースも EUC から UTF8 などに 変更することができない状況下となっています。 この環境下で文字化けさせずに mysqldump でデータをダンプさせることは可能でしょうか? ちなみに mysqldump に--default-character-set=(色々な文字セット名や binary など)、 --skip-set-charset などのオプションを付加してみましたが失敗に終わりました。 どなたかご教示ください。よろしくお願いします。
どうして、MySQLでは ORDER BY で複数の要素を指定すると インデックスが効かなくなってしまうのでしょうか? プログラマの能力に限界があるということですか?
672 :
669 :2007/12/24(月) 01:46:27 ID:???
>>669 への自己レスです。
mysqldump に「--compatible=mysql40 --default-character-set=latin1」
オプションをつける事で解決できました。
10日以上悩んでググってやっと解決できました。
ちなみに
>>579 の質問も私ですが、
PHP を使って同様の処理を行うことで回避しました。
673 :
667 :2007/12/26(水) 00:02:45 ID:???
ググったけどわかんね
674 :
NAME IS NULL :2007/12/26(水) 02:07:10 ID:kEQ0Ty0u
my-sqlサーバいれて起動がなぜかできないんだけどログ見てもわからない 071226 01:56:26 mysqld started 071226 1:56:26 InnoDB: Database was not shut down normally! InnoDB: Starting crash recovery. InnoDB: Reading tablespace information from the .ibd files... InnoDB: Restoring possible half-written data pages from the doublewrite InnoDB: buffer... 071226 1:56:26 InnoDB: Starting log scan based on checkpoint at InnoDB: log sequence number 0 36808. InnoDB: Doing recovery: scanned up to log sequence number 0 43655 071226 1:56:26 InnoDB: Starting an apply batch of log records to the database. .. InnoDB: Progress in percents: 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 7 5 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 InnoDB: Apply batch completed 071226 1:56:26 InnoDB: Started; log sequence number 0 43655 071226 1:56:26 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist 071226 01:56:26 mysqld ended なんかロックされてるなにかがあるみたいだけど回避する方法とかあるなら教えてくださいませ orz
>>675 全文検索してもwhere usedは出てこないよ
using whereとは違うよね
using whereのことじゃない? ソースのsql/sql_select.ccを読んだが、 where usedは出てこない。
>>670 5.0より前はインデックスマージしないんじゃなかったっけ?
バージョンは?
679 :
NAME IS NULL :2007/12/26(水) 14:55:23 ID:dqOx6InY
date型とtime型を結合してdatetime型を得るにはどうすればいいでしょうか
mysql> create table dt (dt datetime, d date, t time); Query OK, 0 rows affected (0.01 sec) mysql> insert into dt values (null, now(), now()); Query OK, 1 row affected (0.00 sec) mysql> select * from dt; +------+------------+----------+ | dt | d | t | +------+------------+----------+ | NULL | 2007-12-26 | 15:00:25 | +------+------------+----------+ 1 row in set (0.00 sec) mysql> update dt set dt = d + interval t hour_second; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0 mysql> select * from dt; +---------------------+------------+----------+ | dt | d | t | +---------------------+------------+----------+ | 2007-12-26 15:00:25 | 2007-12-26 | 15:00:25 | +---------------------+------------+----------+ 1 row in set (0.00 sec)
前からインデックスについて疑問に感じていることがあるのですが、 1,2,3,4..........と続いているindexに2を追加すると、 1,2,2,3,4.........と3以下全て並べ替えになると理解しているのですが、 そのような仕組みになっているのでしょうか? もし、そうだとすると100万件のデータが入っているtableで、 データを追加する際に、最悪100回の並べ替え(位置をずらす処理)が発生して大変なことになると思っています。 将来膨大なデータ件数になることが予想されるtableにindexをつけるかどうかで迷っているので、 アドバイスを頂けないでしょうか?
>>682 インデックスがそういう構造だと
検索にはあまり向かないだろう
単なるノベタンではなくて、挿入・削除が容易な
例えばツリー構造のようになっているのだろう
安心してインデックス張るよろし
つか張らないと遅いでしょ
>>682 そのレベルだとまずbtreeについて勉強しろ。
685 :
NAME IS NULL :2007/12/27(木) 04:10:23 ID:v5TSL/Qu
>>675 ありがとうございます。mysql_install_dbでOKでしたorz
SQL文が書かれたテキストファイル(hoge.sql)をインポートしたいのですがどうすればいいでしょうか? 以下のようにやってみたんですが、エラーになります。 mysqlimport -p --local hoge hoge.sql *hogeがデータベース名です。 mysqlimport: Error: Table 'hoge.hoge' doesn't exist, when using table: hoge
mysqlimportはCSVファイルなどを流し込むツールであって、 SQLを流し込むツールではないぞ。 $ mysql hoge < hoge.sql
>>687 さん
即レス、ありがとうございます!
本当に助かりました
ありがとうございます
MySQL 5.1 で、MyISAM をメインに使っているのですが、 稼働状態でデータのバックアップをとるときは、 マニュアルに載っている mysqldump --all-databases が一番早いのでしょうか? もっと良いバックアップの方法があれば教えてください。
optとかでいいんじゃ
693 :
NAME IS NULL :2007/12/28(金) 14:49:41 ID:C3g8Iqj8
>>692 mysqldumpを使うというのは最適解なのですね。
--opt試してみます。ありがとう。
MyISAMで一番速いのは LOCK TABLES⇒FLUSH TABLES⇒ストレージやLVMのスナップショット機能 だと思う。
696 :
NAME IS NULL :2007/12/29(土) 14:46:39 ID:gk+6HmZs
最近はじめたんですが、dateを入れるカラムって、格納する値(2007/12/30)を いちいちsql文の中に用意してinsertなりするしかないんでしょうか? その他のカラムが更新されたときに、自動的に日付カラムが更新されるような 仕組みってないですか?
>>696 あるいはtimestamp型を利用するとかかな。
699 :
NAME IS NULL :2007/12/30(日) 02:48:15 ID:T2zYh9sT
select aaa.* from aaaINNER JOIN test_tb USING(aaa_id) select aaa.* from aaaINNER JOIN test_tb USING(aaa_id) GROUP BY aaa.aaa_id aaaテーブルとtest_tbにはそれぞれ3万レコード入っているとします。 上段の方を実行すると、0.1秒ぐらいで表示されるのですが、 下段を実行すると、サーバがダウンするぐらい表示に時間がかかります。 どうしてGROUPを入れるとこれだけ実行時間に差が出るのでしょうか?
変更された実行計画に対して適切な索引が無いから かなー
そういうときはEXPLAINして違いを見ようぜ
702 :
699 :2007/12/30(日) 15:15:42 ID:???
理由が分かりました。結合先のtest_tbのaaa_id中に 重複した値があったのが原因のようです。 今まで勘違いしていたのですが、一意のデータが多いほど 結合時の読み込みも早いんですね。前は逆だと思ってました・・。
704 :
NAME IS NULL :2007/12/31(月) 15:35:52 ID:5qw/Iwgf
Mysql 5.0.45 alter table hogehoge change 〜 でカラムをリネームしようとすると ERROR 1025 (HY000) Error on rename of '.\detabase\#sql-244_7' to ' .\database\hogehoge' (error: 150) というエラーメッセージが出るんですけど、ひょっとしてプライマリキーに なってたり外部制約に使われているカラムって名前の変更が出来ない?
706 :
NAME IS NULL :2008/01/04(金) 23:33:10 ID:FJkIdSjB
5.1がインストールできない 5.0.1?まではなんとか入れれたのだが・・・・ ちなみにMacOSX10.4使用 同じような症状の人いる?
メールサーバを管理しているのですが、 監視ログにmysqlのエラーで Too many connections とメールが来ました。 mysqlが外部から待ちかまえるデーモン数を少し増やして様子をみたいのですが、 どこで調整できるのでしょうか?
708 :
707 :2008/01/05(土) 03:02:23 ID:???
補足です。 バージョン5.0です。
A.2.6. Too many connections エラー MySQL に接続しようとして Too many connections エラーが発生する場合は、すでに mysqld サーバに接続している max_connections クライアントが存在しています。 デフォルト(100)より多い接続を行う場合は、max_connections 変数の値を 100 より大きくして、mysqld を再起動する必要があります。 実際は、mysqld では(max_connections+1)クライアントの接続が許可されています。最後の接続は、SUPER 特権のあるユーザ用に予約されています。 一般ユーザにこの特権を与えないことによって(一般ユーザにこの特権は必要ありません)、 この特権のある管理者はログインして、SHOW PROCESSLIST を使用して問題を見つけることができます。 See 項4.6.8.6. 「SHOW PROCESSLIST」。 MySQL 接続の最大数は、スレッドライブラリが特定のプラットフォームでどの程度まで有用であるかに依存します。 Linux または Solaris では、使用している RAM のサイズと、クライアントが何を実行しているかによって、500 ? 1000 の同時接続をサポートできます。
710 :
707 :2008/01/05(土) 03:29:23 ID:???
ありがとうございます。 早速変更して様子をみたいと思います。 思ったより、スパムの接続数が多いみたいです。
711 :
NAME IS NULL :2008/01/05(土) 16:03:40 ID:yZZDqu/Q
誰か助けて\(^o^)/ 1 - can't create/write to file 〜ってでてきてエクスポートできません 過去ログやMyNA、検索してでてきたやつやってみたけど駄目でした ちなみに使ってるのはnavicat8です(オプション設定ファイルの場所わからない\(^o^)/
712 :
NAME IS NULL :2008/01/05(土) 16:57:52 ID:5Gpulnqz
すいません。バカな漏れをすくってください。 以前、MySQLをインストールして、失敗し、やむなく消去して。 XAMPPをいれたんですけど。 MySQLにつなぐと。 access violation なんちゃら〜libmysql.dll〜なんちゃら と、何回もエラーがでて、そのうち操作不能になります。 コマンドでsc delete MySQLとかやってみたり、 管理ツールとかもしてみたんですが、 なおりません。 ともだちに聞いたら、クリーンインストールしかないんじゃない とのことなんですが。 ちょっと消しちゃまずいものもあったりするんで。 バックアップに不安感もあって、ふみきれません。 どうか、たすけてください。 あと、5日前くらいからはじめたばかりなので。 初心者すぎて、書いてることも、自分でもよくわかりきってないんで。 そのへん、ほんとうに、すみません。
窓からパソコン投げれば良いと思う
714 :
NAME IS NULL :2008/01/05(土) 17:04:38 ID:5Gpulnqz
親切な自分がいい方法を教えてあげよう。 お年玉で新しいPCを買え(w
716 :
NAME IS NULL :2008/01/05(土) 17:34:51 ID:5Gpulnqz
>>715 ききたくなかったwwww
そのもっとも正論を、ききたくなかったww
>>712 XAMPPをまずアンインストールする
次に、スタートメニューから検索を選んで
ファイルとフォルダすべて を選び、libmysql.dllを探す
見つかったlibmysql.dllは全て不要なので 全部ごみ箱に入れる
そのあと、XAMPPをもう一度インストールする
これで多分直るので、ちゃんと動いたのを確認したら
Cドライブをフォーマットして窓からPCを投げ捨てろ
718 :
NAME IS NULL :2008/01/05(土) 20:42:54 ID:Ible2iRH
mysqlでPostgreSQLの Explain analyzeと同じような結果を得ることはできないでしょうか? phpでSelect文の実行速度をmysqlから得たいのですが、 その方法がわかりません。
720 :
NAME IS NULL :2008/01/06(日) 00:57:20 ID:2gK1qWP1
>>717 さん。
本当に感謝します。
今、ガチで地面に頭つけて土下座しました。
これは、完全に本当です。ありがとうございます。
そして
>>718 さん。
すかさずのジョーク、笑わせていただきました。
ありがとうございます。
721 :
NAME IS NULL :2008/01/06(日) 06:47:17 ID:xNMZbDGr
あるテーブルが現在100万件ほどあるのですが、 時間によっては検索・更新が遅くなります。 インデックスも貼っているのですが、 これから1000万件、2000万件と増えると限界もあるのではと思っています。 同じテーブルを複数作って運用することも考えているのですが、 どう思いますか、設計としては汚いとは思うのですが、 この方式であれば、これから増えていってもとりあえず心配はないと思っています。 ex) T_SAMPLE_1, T_SAMPL_2, T_SAMPL_3.... (同じ構造のテーブルを適宜増やすやり方です)
そもそもの設計が間違ってるんじゃね? としかいいようがない。 EXPLAINしてみた? ちなみにインデックス張ってると更新は重くなるよ。
インデクスがB-Treeなことを考えると、論理的には100万件でも2000万件でもペナルティに大した違いは無いはず。
724 :
NAME IS NULL :2008/01/06(日) 14:12:34 ID:Mrg050LO
SELECT id FROM test WHERE id=1 or id=2 or id=3 として、IDが1か2か3のデータを出したいと思います。 上記のSQLなら3つのレコードがヒットします。 idを検索する数だけid=を付けるのは変だと思うのですが、 どういう書き方をしたらいいのでしょうか?
SQLの勉強しろよ。 IN を使えばいいでしょ。
複数のカラムでOrder Byするとインデックスが無視されてしまいますが どうやったって複数の項目でソートせざるを得ないときはどうしますか? 単純な数値のキー二つなら足したりかけたりして一つのカラムに まとめたりすることも出来ますが、日時と数字だったりすると 相当面倒くさいです。ソートだけに。
複数の項目のインデックスを張る
>>725 すみません。勉強不足でした。
INで出来ました。ありがとうございました。
>>721 百万件以上、数百万件くらいになると、どう正規化しても遅くなる。
あとメンテナンス性も落ちる。
後半に書いているように、データの水平パーティショニングが必要。
大規模なMySQL運用してるところならどこでもやってる。
(例: mixi、Yahoo! J、livedoor、live Journal)
>>729 参照主体ならレプリケーションでも十分対応できるんじゃね?
更新主体だとそうもいかんけど。
5.1使うとその辺楽できていいよね。
>>722 >>723 >>729 >>730 アドバイスどうもありがとうございました。
EXPLAINで最適化をしたのですが、どうしてもスピードが劣化してしまします。
このペースで1000万件良くと大変なことになりそうなので、策を考えていました。
>>729 さんに教えて頂いたパーティション初耳だったのですが、マニュアルを見たらすごく便利ですね。
私は同じテーブルを複製してPGで参照テーブルを決定することを考えていたのですが、
DB側で透過的に負荷分散してくれるこのやり方は最高です。
いま問題になっているのは、会員の購入履歴みたいなもので、会員IDと購入品目などが並んでいます。
会員IDにINDEXを指定していて、会員IDをキーに購入履歴を参照しています。(実際には条件がもう少し複雑です)
このような用途で、会員別にパーティションにしたいのですが、
その場合は、「15.2.3. HASH 分割」がベストということで宜しいでしょうか?
http://dev.mysql.com/doc/refman/5.1/ja/partitioning-hash.html
>>730 アドバイスありがとうございました。
>参照主体ならレプリケーションでも十分対応できるんじゃね?
残念ながら両方なんです。
参照もしながら更新もするテーブルでして、参照も更新も半々で、
それでいてデータ数も2年後には1000万件いく勢いなので・・・
>>731 思うんだけど、購入履歴は「過去○件まで」として
それ以上は削除したら良いんじゃないか?
で、購入履歴からこれまでの注文金額を割り出しているのなら
それを止めて、購入合計金額テーブル+購入履歴にするとか。
俺はそうしてるよ。じゃないと、履歴のログがたまりすぎる。
>>733 返事ありがとうございます。
そうですね、確かにそうしたいのですが、そのテーブルが過去の取引記録を修正する必要がある特殊なもので、
更にその取引履歴がないと他の処理の際に非常に困るケースがありまして、
そのテーブルを今の形以上に最適化?するのが難しいんです。
なので、将来的にそれが1億件とか溜まったらどうするの?って問題もあるのですが、
それに対応するのは、同じ構造のテーブルを複製して負荷分散するしかないのかなぁ、と思ったのが最初の考えだったんです。
>>734 例え1億件溜まったとしても、それに全件対象で
検索なんてまずしないでしょうし、回避方法いくらでもあるでしょう。
しかもその9割以上はもう更新されない固定データのはずです。
パーティションは5.1新機能で、5.1はまだβなので 使うなら人柱の覚悟が必要。 mixiとかは自前でパーティション相当の機能を実装してる。
最適化云々の前に、どう考えても設計にミスがあると思うんだが・・。 mixiほどの会員数でもないだろうし。せいぜい1万人前後だろ。
単位は人じゃないと思う
739 :
729 :2008/01/07(月) 11:54:16 ID:???
>>731 まいったな。
5.1新機能の『水平パーティショニング』じゃなくて、MySQLサーバ複数に
同じテーブル用意して、プログラムで参照先を変える、
手動(?)水平パーティショニングのつもりで書いた。
その場合、ユーザテーブルにデータクラスタidのカラムを増やすことになる。
736の言うように、5.1はまだRC1だからなぁ。
>>737 会員数じゃない。
MySQL Administratorをインスコしたんですが、 Create New Procedure/functionが選択できない状態です。 使うにはなんか条件あるんでしょうか
741 :
NAME IS NULL :2008/01/07(月) 20:08:35 ID:rP9QoVfq
ちなみにMysqlのヴァージョンは2.0.27です。
>>741 ∩___∩ |
| ノ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ J
彡、 |∪| |
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
3.xというのは時たま見かけるけど、2.xなんてのは初めて見た w
744 :
NAME IS NULL :2008/01/08(火) 11:57:35 ID:0aeiDUDX
MySQLをインストールしたのですが、 080108 11:52:04 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var 080108 11:52:04 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/mysql/var/ is case insensitive /usr/local/mysql/libexec/mysqld: Table 'mysql.plugin' doesn't exist 080108 11:52:04 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 080108 11:52:04 InnoDB: Started; log sequence number 0 46409 080108 11:52:04 [Note] Recovering after a crash using mysql-bin 080108 11:52:04 [Note] Starting crash recovery... 080108 11:52:04 [Note] Crash recovery finished. 080108 11:52:04 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist 080108 11:52:04 mysqld_safe mysqld from pid file /usr/local/mysql/var/nomade2.local.pid ended というメッセージがでてshutDownしてしまいます。 どなたか解決法ごぞんじないですか?
746 :
744 :2008/01/08(火) 13:22:24 ID:0aeiDUDX
/usr/local/mysqlのなかをみてみるとscriptフォルダが入ってない・・・ やっぱりインストール途中で終わっちゃったのかな?
747 :
744 :2008/01/08(火) 13:27:20 ID:0aeiDUDX
ごめん。勘違い。 ご指摘通りinstall_dbで大丈夫になりました。 お騒がせしました。
mysqlを3.23→4.1.x→5.045にアップデートしたのですが --skip-grant-tablesをオプションをつけないと 起動しても今までのがうまく動きません 多分ユーザーパスワード関連の問題だとは思うのですが・・・ ユーザーテーブルの拡張は4.1系にアップデートした時に変換しました --skip-grant-tablesを付けずに起動させて ちゃんと動くようにするにはどうすればいいのでしょう? 因みに1ユーザーだけパスの変更ができないのがあります あと、[mysqld]にold-password=1を指定してみてもだめでした
751 :
748 :2008/01/09(水) 06:58:53 ID:???
動かないの内容ですが・・・ 具体的に言うと接続できないです で、アレから色々やって--old-passwordオプションをつけて起動したら 接続できました しかし新しいパスワードで保存してあるユーザーは接続できませんでした こういうものなのでしょうか?
ログファイルにはでないのですが返されたエラーは Client does not support authentication protocol みたいな感じでした
質問です 1 -------- 2 -------- 3 -------- ・ ・ このようにインデックスのついたカラムをdelete文で削除すると インデックスの数字が空いたままカウントされていくのですが、 自動的に詰めてくれるようにはできないのでしょうか (例:インデックス3を削除した後にインデックス4のものが3につめてくる)
微妙に用語が怪しいので 現象を正しく理解しているかどうか不安だが 連番を保持しているカラムの値は レコードの挿入・削除により動的には変更されない そういう値は通常はDBに持たせずプログラムで生成する
トリガ仕込んでおけばできるかもしれないが、 あんまりやらないだろうなあ
大文字だけが含まれるIDを抽出したいのですが select id from database REGEXP [A-Z]* とかでも全て出てきますorz 大文字だけが含まれる、というクエリが間違っているのでしょうか? REGEXPを使うんですよね? でも正規表現がorzなので・・・。
>>753 クライアントコマンド/ライブラリのバージョンが古いんじゃないかと。
>>757 いや、それ文法エラー。
select id from tablename where columname regexp '[A-Z].*'
だと、どう?
>>754 ちゃんと詰めて考えれば、その仕様自体に無理ある。
DBでは欠番してる事も情報の1つなんだよ。
9時間前の日時をdatetime型に書き込もうと INSERT INTO tbname value(NOW()-090000) としてもデフォルトの0000-00-00 00:00:00となってしまいます。 SELECT NOW()-090000 だと正しく表示されるのですが、何がいけないのでしょうか?
>>761 SELECTの結果をINSERTすればいいじゃん
>>761 now()-090000 で正しく表示されているというのは気のせい。
subdate(now(), interval 9 DAY_HOUR) を使え。
オライリーのMySQL本でもauto_incrementの数はつめるなって 書いてあるな 興味があれば参照してみ
>>757 その正規表現はいろんな点で間違ってます。
正規表現スレで聞くべきだと思うけど、
1. 先頭から末尾まで大文字だけが含まれる
2. 大文字以外が含まれる、の否定
のどっちかにしないとダメじゃね?
[A-Z]+
^[A-Z]+$
[T_T]<ありがとうございました
a,b,cの3つのカラムがあるテーブルhogeで SELECT * FROM hoge WHERE a<条件 ORDER BY b,c; みたいな検索を高速化させる方法は MySQLにありますか? ありませんよね。
うん
うん?
MySQLで 正規表現してマッチした文字を入れたいのですがどうすればいいでしょうか? CREATE FUNCTION hoge ( f_str TEXT, ) RETURN VARCHAR BEGIN declare s_str INT DEFAULT NULL; // f_strに/#([0-9]{3})#/ が入っていたら // ([0-9]{3})の値を抜き出して SELECT `hoge` FROM hoge_temp_tbl WHERE num_id = ([0-9]{3}でマッチした値) END 簡単に書くと 長文が入った変数f_strをストアドに投げて#([0-9]{3})#にマッチするキーの値をDBから取りたいのです PHP側で置き換えするとその都度DBと通信しなくてはいけないので遅くなると思いこの方法が出来ないか、と考えてます、 MYSQLのバージョンは 5.1です
update table_n SET point=( select count(別のテーブル) from 〜〜〜) where 〜〜〜 pointにcountの数値を入れてupdateしたいのですが Subquery returns more than 1 rowとでてエラーがでます。 ()の前にANYなどをいれても別のエラー(おそらく文法エラー?)がでます pointはint型です やりたいことは あるテーブルのレコードの値を別のテーブルのcountで求めた値を入れたいのですが…
774 :
773 :2008/01/11(金) 21:34:39 ID:???
ごめんなさい、自己解決しました… ただのupdateの文法ミスでした。余分なものが多すぎだorz
テスト
列1、列2、列3・・・で列1+列2を一つのインデックスとして貼っているのですが、 列2のみに検索を掛ける場合に、列2だけのインデックスを作る必要がありますか? 宜しくお願いします。
>>777 アドバイスありがとうございます。
勉強になりました。
実は、phpadminでやると、↓のような警告メッセージがでてしまうので、気になっていました。
カラム `列2` に PRIMARY と INDEX のキーを両方とも設定するのはよしましょう。
検索条件別にインデックスを分けないといけないんですね。
どうもありがとうございました。
MyIsamでデータをインサートする時、どの程度の確実性が保証されてるんですか? 一番知りたいのはInnoDBのトランザクション使用時と比べてです
>>778 EXPLAIN した?
PRIMARY には INDEX いらんがな。
781 :
NAME IS NULL :2008/01/14(月) 19:19:15 ID:k6NvIgLE
質問お願いしたいんですが、 何でGROUP_CONCATではlimitが利用できないんでしょうか? limitを利用したのと同程度で済む代替手段はあるのでしょうか?
783 :
NAME IS NULL :2008/01/14(月) 22:07:57 ID:k6NvIgLE
>>782 レスありがとうございます。
Group_concatの構文って↓ですよね。
抽出して並べる値について、上位5件のものだけにしたい場合などにlimitが使えたら便利と思ったんですが、
普通にできるのでしょうか。
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col ...]]
[SEPARATOR str_val])
784 :
772 :2008/01/16(水) 18:10:14 ID:???
宜しくお願いします。
786 :
NAME IS NULL :2008/01/16(水) 23:31:06 ID:/Laf53wE
Sunになっちった
これで四大商用DBに仲間入りだな
SAMJ? JAMS?
790 :
782 :2008/01/17(木) 02:10:31 ID:???
>>783 あ、そういうことか。
group_concat() の機能じゃないけど、group_concat() の結果を substring_index() してみるのはどうかな。
substring_index(group_concat(....), ',', 5) みたいに。
Sun MySQL 三枚SQL
792 :
781 :2008/01/17(木) 02:55:23 ID:FXOK6V2i
>>790 レスありがとうございます。
MySQLについてあまり詳しくないのですが、
その方法だとソートする場合に,5番目以降の部分もソートしてしまって,
計算量が膨大になったりしないのでしょうか。
793 :
NAME IS NULL :2008/01/17(木) 05:31:39 ID:h9UdFYyA
レプリケーション構成の時、スレーブDB自体を再起動する際は一度stop slaveを かけた方が安全なんでしょうか?
ずっとACCESSを使っていましたが、無料で使用できるということで、 MYSQLを今週から使い始めました。 ですが、SQLというのがイマイチよく理解できないのですが、 ある列の並べ替えをしたいときは、どのようなSQLをかけば宜しいのでしょうか? SYAIN(社員用の管理テーブルです) ID NAME ADDRESS AGE SYOZYOKU STATUS TM_SCORE
>>794 その辺はSQL入門で最初に出くる基本事項ですので、
本やwebで一通り押さえてください。
ちなみにその場合は「ORDER BY」を使用します。
>>794 例えば、NAMEを昇順に並べ替えるなら、こうすれば出来るよ。やってみて。
DELETE FROM SYAIN; SELECT * FROM SYAIN ORDER BY NAME;
>>795 、
>>796 朝早くから、アドバイスありがとうございました。
教えられたSQLでやってみたのですが、何も表示されませんでした。
ちなみに、XPでWINDOWS版でやっています。バージョンはわかりません。
おすすめのHPとかありますか?
ひ、ひでーw
>>794 まれに見る超初心者。
スレで聞くより入門書買って読んだ方が早いよ。
>>796 > DELETE FROM SYAIN;
>>797 > 教えられたSQLでやってみたのですが、何も表示されませんでした。
ホントに全レコード消しちゃったのね・・・。南無。
format c: [エンター] をなんの疑いもなく実行してしまう奴
>>799 そうですね。近くに本屋がないので、どうしようかと思っていまして、
何かお勧めの本とかありますか?
で、すみません、あれから再起動したりして何度か試したのですが、
レコードが表示されなくなってしまったのですが、
これはどうしたら宜しいでしょうか?
前にウマくいっていたSQLも実行できないのですが・・
MySQL史上最大級のニュースがあったというのに、 このスレがこんなに平穏とは、それだけMySQLユーザーが増えたって事かね。
データベースはメンテナンスが大事だから
SQLを実行した後に
>>796 を実行しておいた方がいいよ。
>>802 何が変わるってわけでもないし。 ライセンス形態が変わるってなら大ニュースだが
805 :
799 :2008/01/17(木) 08:04:00 ID:???
これが釣りではなかったとしたら とんでもないゆとりだなw
>>802 開発者が増えて、ライセンスも緩和されるかもね。
でもって商用DBにしかない機能も実装されるだろうし、
いよいよDB2とOracleが追い詰められるのかも。
Sun、MySQLを買収へ
http://www.itmedia.co.jp/enterprise/articles/0801/17/news005.html Sun Microsystemsは、オープンソースのRDBMS「MySQL」を開発するMySQLを
総額約10億ドルで買収することを明らかにした。
Sun Microsystemsは1月16日、オープンソースのRDBMS「MySQL」を開発する
MySQLを総額約10億ドルで買収することを明らかにした。
買収は3月末をめどに完了させる予定。MySQLはIPOを待たずして買収されることとなった。
MySQLが自社サイトに開設しているブログに、同社のコミュニティ担当バイスプレジデント、
カイ・アーノ氏がその旨を伝えるエントリを投稿したのとほぼ同時期に、
Sunからも正式なプレスリリースが出されている。
カイ氏はエントリの中で、「オープンソースをよく理解しているSunがMySQLを買収したことは、
MySQLコミュニティーにとっても有益なものになる」と述べている。
一方、Sunのジョナサン・シュワルツCEOも自身のブログでこの件について言及、
MySQLの顧客に対して買収の完了を待つことなくサポートサービスの提供を開始する予定であると述べた。
MySQLについては、過去にOracleが買収を試みたことが知られている。
今回Sunが買収したことで、OracleやMicrosoft、
IBMなどとデータベース市場で争うための基盤をSunは手に入れたことになる。
Sunに買収されてこれからどうなっちゃうの?と思ったが 別に悪いことじゃなさそうだな
>>805 おいおい!!!!!ふじゃけんなよ。
人をはめておいて何説教してんだよ!!!
どうすんだよ。今日の2時までに資料作成しないといけないのに、
データ消えたって洒落じゃ済まされないよ。
おい、復活する仕方を教えろよ。何だよ、このスレ。まじ、死んでくれよ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
810 :
799 :2008/01/17(木) 08:32:36 ID:???
>>809 おいおい799と796は別人だよ。
親切にしてやったのに逆ギレとは。
バックアップしてなかったら復活なんて無理だよ…
812 :
NAME IS NULL :2008/01/17(木) 08:38:38 ID:ThKha1cM
SUNは技術者を買収したって解釈でOK?
barkrayDBみたいな事になっちゃうのかね
>>809 お困りのようなので、特別に教えます。
SQL文1本で復活することは可能です。
ただし、技術料として前金で10万円頂くことになります。
これでも相当安いです。同じスレの住民として特別ですよ。
それで、宜しければ上記のメールまで連絡して下さい。
rollbackさせようとしてたりして
さすがに自演の匂いがする
朝から凄い自演釣りですね
>>809 >何だよ、このスレ。
本来、日本最高級のMySQL技術者のみが集うスレですが、何か?
買収されたことで、mysqlが本丸の技術者の需要も増えそう
MySQL が Oracle や IBM を追い詰めるって妄想にもほどがあるw Sun の狙いは現行 MySQL で構築してあるシステムを Sun のハード & ソフトに置き換えること。 そこそこ規模の大きいとこは SPARC + Solaris + Oracle でリプレースすること。 つまり現 MySQL ユーザの取り込みだよ。Sun はそういう会社。それ以外に興味はない。 過去に Sun に買収されたところがどんな冷や飯を食ったか (あるいはお亡くなりになったか)、 Cobalt を例に挙げよう。 1. Cobalt 買収。これで Sun にも I/A + Linux の販売基盤ができたとメディアが騒ぐ ← 今の MySQL 2. Sun、サポート体制配備。客とのコネ作り。 3. Cobalt 塩漬け開始。ほぼ同時に Sun が I/A ハード販売開始。 4. 2 世代も古くなればさすがに客も Sun の I/A、SPARC サーバへ乗り換えはじめる。 5. Cobalt 終了のお知らせ。
MySQLのQueryBrowserで カラムに日本語を使っていると Executeを入力するする部分がバグるんですけど 解決法はあるのでしょうか?
CobaltはSunに買収された時点で終わったとオモタ MySQLはそうならないで欲しい 最悪時は第三者がGPL版ベースで再スタート?
OpenOfficeやNetBeansみたいに細々と続けてくれればそれで文句ないよ
>>821 全く同感
そういえばCobaltってあったなぁっていう・・・
>>822 文字コードは?
設定は?
バージョンは?
接続クライアントは?
でもMySQLが脂肪したらpostgresに逃げられるだけじゃないの? 取り込みなんてできないだろ
Cobaltが終わったからMySQLが終わるって? おまえらアホだろ
MySQL ユーザが PostgreSQL に流れてしまったらいやだ! MySQL を Oracle や DB2 に匹敵するくらい育てなければ!! これは単なるフリーク的な発想なだけであって、Sun がそんなこと考えるわけないじゃん。 買収額からは長期戦略の構えのようには見えん。人材と中規模〜大規模の優良客だけ さっさと取り込んで、自分らだけで何とかできる規模の安い客はどこへでもご自由にどうぞ? オプソあるでしょ? と、まぁ今までの Sun の対弱買収を考えるとこれが定石。 つか、MySQL を育てたいと Sun が本気で考えてるなら、買収じゃなくて大量の自社エース級 社員をコミュニティに派兵する形態をとってる。 一応 Sun もオープンなイメージで売ってる会社だからオプソの形態は無くさないだろう。 ただコミュニティ無視していきなり 「Sun 版無料 MySQL です。これが公式版です。」 と やらかす可能性は十分にある。てか過去に Linux 用の Java でやった。
ちなみに Cobalt の買収額 20 億ドル、MySQL は 10 億ドルな。
\ヽ, ,、 _ `''|/ノ \`ヽ、| \, V `L,,_ |ヽ、) ,、 .| ヽYノ / r''ヽ、.| / ,.. -──- .、 `ー-ヽ|ヮ .| , ‐'´ __ `ヽ、 `| | / , ‐'"´ ``''‐、 \ | | / / \ ヽ | ヽ, y' /` ‐ 、 ,.. -'ヘ ヽ. }ノ ヽ,' / /`,ゝ' ´ ヽ Y. . i ,' { { ヽ `、 l ,イ─- 、.._ ヽ ,, _,.. -─:} ! . | r‐i| ー=ェェ:ゝ ,.∠ィェェ=ー' |r 、. l | {ト」l|. : | " ``: |!トリ | . │ ヽ、| ;.」_ |'ソ ! . │ ヽ r──ッ /ノ | | lヽ  ̄ ̄ / イ │ . ! 丶ヾヽ ~ , ' ノ │ ! ト. ミ.ゝ ヽ.____./ / l / ヽ ヽ イ ,' / , ' ┼ヽ -|r‐、. レ | \. ノレ'/ d⌒) ./| _ノ __ノ
カオスってきました
なあに、昔に戻るだけさ。
CobaltとMySQLを同列に扱うとは、これまた珍妙な人がいるもんだね。 Sunの買収はそれほどの影響は無いだろうけど、 日本だと頭の固い旧世代のクライアント様向けに、 オープンソースDBと言うよりも世界的大企業であるSunのDBですと言える事が、 追い風になるのは確かだよ。 しかしこの板はIDが出ないのか、ちょっと不便だね。
珍妙以前におまい Sun ってどういう会社か知らんだろ。 まさにおまい自身が Cobalt 買収の時のユーザと同じ事言ってるくらい同列。
CobaltとMySQLを比較するのは間違ってるんじゃない? 今はオープンソースコミュニティから嫌われたらダメージ大きいから、 オープンソースコミュニティに不利なことはしないはず。
そりゃまったく同じものじゃない以上どこまで違うかは好き好き解釈すりゃいい。 ハードは作り手が塩漬けにすりゃ死滅確定だが、MySQL は既にオプソになってるから Sun がライセンスで縛らない限りはどうとでも生き残れる。 だが Sun にとってはコミュニティの動向なんてあまり眼中になく、これで MySQL に 箔が付いたなんて思うのは甘すぎるというだけの話。別に MySQL が死滅すると 騒いでるわけじゃないのよ。
コバルト買収はlinuxゲットするためじゃなかったっけ? ただ買収前のコバルトも個人・中小企業用のキューブは売れず、ラックサーバへ移行してたような
Sunはオプソの敵ってことでFA
SuSEがNovellに買収された事で停滞したのとは違い、 既にMySQLの影響力は大きすぎるので、 わざわざコミュニティの反感を買うような事をするほどSunは馬鹿では無いと期待するがね。
コミュニティと言っても MySQL 社自体の売り上げは 1 億ドルもない。 これに 10 億突っ込んだなら当面は利益確保に走らんと株主に殺される。 まぁしばらくはコミュニティの方まで手が廻らないから好きにやっててくれ というスタンスなんじゃないかね。
10 億ドルは高すぎない? こんなもの? GPLならそれベースにコミュニティ立ち上げて勝手に作ればいいんじゃないの?
ORACLEに買収されるよりは10億倍マシ
オラクル買収なら一瞬にしてなくなるだろな
846 :
NAME IS NULL :2008/01/17(木) 22:34:58 ID:dTjY9YOT
force indexを使うとエラーが出るのですが、何故なのでしょうか? mysql> select * from hoge force index(name); ERROR 1072 (42000): Key column 'name' doesn't exist in table テーブル定義は以下の通りです。 mysql> desc hoge; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | text | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> select * from hoge; +------+------+ | id | name | +------+------+ | 1 | aaa | | 2 | bbb | | 3 | ccc | +------+------+ 3 rows in set (0.00 sec) MySQLのバージョンは、5.0.2です。
>>845 Berkeley DBも今や跡形もないしな
>>846 name にインデックスが設定されていないから。
>>842 MySQLはプライスレス。
時代の流れを読めないおっさんは、Sunに喰われ吸収される方向だと思っているようだけど、
残念ながら現在のSunにそのような消化能力は無いよ。
850 :
>>846 :2008/01/18(金) 00:12:20 ID:IiVRb0GG
>>846 ありがとうございます!
インデックス=カラムと勘違いしておりました。
時代の流れw もうちょっと具体的な例でも出してくれんと話にならん。 StrageTek、ERP屋?、認証屋? この規模の Sun の買収は珍しいことじゃないんだけど、 良い方に転んだものってあったかなぁ。
ベンダーがサポートしやすくなるから オラクル高杉と思ってる企業がMySQL採用するケース増えるんじゃないかな
つーか、MySQL エンジン搭載 FileMaker カモン!
854 :
sage :2008/01/18(金) 01:36:58 ID:???
質問があります。 set autocommit=0 などとして設定した値は、どうやって参照できますでしょうか? ためしに適当に↓のようにやってみたのですがダメでした。。。 mysql> select autocommit(); ERROR 1305 (42000): FUNCTION mysql.autocommit does not exist
>>854 mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.02 sec)
show variables;
Cobaltの件は、nVidiaのVooDoo買収の様な いわばライバル消滅が目的の買収だろう? SunがMySQLを潰すメリットなんて無いだろう? 海外で人気の高いMySQLを取り込み自社製品の ブランド力アップというのが自然な考え。 そして恐らく商標はSun MySQL の様なものに変更に なるだろうから、以後メディアでMySQLが紹介される度に Sun の名前が露出することになる。 楽天球団に似た考え方だ。
858 :
>>854 :2008/01/18(金) 08:56:09 ID:???
>>855 ありがとうございます
>>856 show variablesじゃ表示されないみたいですね。
>>844-845 いやまったく。
Oracleが買収したなら「終わったな」と思ったけど、Sunならそんなに問題ないでしょ。
860 :
NAME IS NULL :2008/01/18(金) 11:10:33 ID:1KyA+UkP
教えて下さい 読み方で検索したのですがでてきませんでした max_user_connections マックス ユーザー なんてよむのでしょうか? サポートに電話して聞きたいのですが読めなくて;;
こねくしょん
>>861 マジレス本当にありがとうございます
助かりました><
>>860 中学校は出たか?
もし義務教育を終えていないのなら、そこからでも遅くはないぞ。
公立なら校長の許可さえあれば通わなくても卒業させてもらえる件
校長というより、学年主任の許可があれば卒業させてもらえる。
学力も付けずにいったい何を卒業するのだろお〜ぉ
867 :
NAME IS NULL :2008/01/18(金) 20:48:18 ID:FTZ9B3nG
すみません、レベル低い質問なんですが聞かせてください Nullをカラムに入れる意味ってなんなんでしょうか? 0とは違うなどと 解説してあるのはわかるんですが、ピンときません。 ""(カラ)にしないという意味だと、たとえばどういう状況で どんな効果があるんでしょう? if(カラムの値==0){〜〜;}というプログラムを書いていて、値がNullだった ばかりに誤動作したことがあり気になって質問しました。 この程度の問題自体は、if(カラムの値===0){ に変えれば済むことなんですが、 根本的にNullの使い道を知りたくて… 気が向いた方、回答いただければ幸いです よろしくお願いします
地球上の空気が0なら、宇宙の果てはnull
0という数字に意味があるとき。空文字列も同様。
テストの点数が0なら0点。nullなら受けてもいない。
871 :
NAME IS NULL :2008/01/18(金) 21:31:41 ID:SGztWTji
872 :
NAME IS NULL :2008/01/18(金) 23:45:07 ID:FTZ9B3nG
>>868-870 ありがとうございます 「0という値に意味があるとき」という条件は
わかりやすいように思いました
今までデータの型を強く意識したことなかったので(文字・数値くらいしか)
その辺の認識改めつついじって学習していこうと思います
あと、立て続けですみませんが質問です。 テーブルの構造変えようとしたら
CHANGE `openTime1` `openTime1` TIME NOT NULL , に対して
#1265 - Data truncated for column 'openTime1' at row 1
というエラーが出ました
openTime1カラムはタイム型で文字数制限などしていなく、すでに登録済みの
データとしてはNULL(複数)と07:00:00(一件)があるだけです
今までデフォルトでNULLが入ってたのを、Not nullのタイプに変更したかっただけですが、、
すみませんが、アドバイスよろしくお願いします
NULL の値があるレコードが既にあるから怒られる NULL をデフォルト値(00:00:00とか)に update してからやってみれば?
こうすれば出来るよ。やってみて。 DELETE FROM テーブル名; ALTER TABLE テーブル名 CHANGE `openTime1` `openTime1` TIME NOT NULL;
>>873-874 ほんっとにありがとうございます
>NULL の値があるレコードが既にあるから怒られる って知りませんでした
知らなきゃこの先もずっとハマるところでした
どうもありがとうございました
selectしたときNULLの場合0として扱うにはどうすればよいですか
>>874 > DELETE FROM テーブル名;
またおまえか。
>>876 select IFNULL(カラム名,0) from テーブル名;
とか
これからはmysqlの時代だなわっはっは
>>872 >>874 > DELETE FROM テーブル名;
初心者注意。
これをするとテーブルのレコードが全件削除される。
全件削除する場合は、
TRUNCATE TABLE テーブル名;
の方が性能的によい。
882 :
NAME IS NULL :2008/01/20(日) 15:33:33 ID:7YNpY45T
>>706 5.1以降はインストーラになってないから手動で入れないといけない
1・ファイルを解凍し、フォルダの名前をmysqlとする
2・myssqlフォルダを/usr/local/にコピー
3・cd /usr/local/mysql
4・./scripts/mysql_install_db
数字の少ない上位100個のデータを取得して、その中からランダムで何個か抽出するにはどうしたらいいですか? sql文の中に order by とか limit が重複してると駄目ですよね? $sql = "select * from UNKO_MASTA where ". "TOUROKUNITIJI < date_format('07-12-31', '%y/%m/%d') and CATEGORY_NO < '59'". "order by DOWNLOAD_SUU asc, NO desc ". "limit 100"; ここから更に何個かを抽出したいのです。 よろしくお願い致します。
ランダムにってところはプログラム側で処理すれば? 毎回100件のキー項目を取得して ランダムにいくつか選択してキーで再検索
885 :
NAME IS NULL :2008/01/20(日) 17:24:48 ID:T57a6ONH
>>883 おつかれさまです。
RAND()関数とサブクエリを使って取得できませんか?
<上位100個中、ランダムで10個取得する場合>
select *
from
(
select * from UNKO_MASTA where
TOUROKUNITIJI < date_format('07-12-31', '%y/%m/%d') and CATEGORY_NO < '59'
order by DOWNLOAD_SUU asc, NO desc
limit 100
) A
order by rand() limit 10
886 :
NAME IS NULL :2008/01/20(日) 21:16:13 ID:nGLRewEv
MySQLについて質問があります。 最初は、勉強用に使っていたDB名を次の様に変更したいのですが どういうコマンドを入力すれば良いでしょか? (テーブル名変更の時に仕様する ALTER TABLE のイメージ) 現在の名前 test 変更後 TrueTable 以上 宜しくお願い致します。
ダンプしてインポート
888 :
NAME IS NULL :2008/01/20(日) 21:58:32 ID:nGLRewEv
>>887 さん
という事はやはり、Table定義変更の様にAlter DataBase等で行う事は
出来ないという事でしょうか?
890 :
NAME IS NULL :2008/01/20(日) 22:15:32 ID:37hf1nGY
891 :
sage :2008/01/20(日) 23:34:55 ID:???
レプリケーションについて質問です。 Masterサーバがフリーズした場合、slaveサーバのエラーログに、 「i/oスレッド not running」みたいなエラーが出るのですが、 これって定期的にslaveサーバがmasterサーバと接続されているかどうかを チェックしているということでしょうか? そこらへんの仕組みが知りたいのですが、詳しい資料などあれば、 教えていただけないでしょうか?
>>892 891 じゃないけど面白そうな本だなあ
894 :
NAME IS NULL :2008/01/21(月) 01:08:22 ID:EQqPib2R
>>889 ,890
ありがとうございます。
解決しました。
MySQL潰しをOracleに頼まれたという解釈でおkなの?
20万件のデータをindex張るのと張らないのとでは、10倍以上の差があった。 異常だよ。
MySQLのGUIツールで、お勧めの物がありましたら教えてください。 NaviCatの試用版を使っていたのですが、期限が切れたので。 できましたら、テーブルを一度に複数開ける物がいいです。
OOoBase
900 :
898 :2008/01/21(月) 22:12:37 ID:???
ダウンロードしてみましたが、文字化けしたエラーが出て、データベースに接続できませんでした。
MySQLって死滅しちゃうの?
max_user_connectionって、皆さんどれ位に設定してますか? さくらの専用サーバー借りようと思うのですが、 設定値の目安が分からず迷っています。 どこの会社の専用サーバーでもいいのですが、 専用サーバー借りている人がいたら、設定値を教えていただけませんか? 宜しくお願いします。
903 :
898 :2008/01/21(月) 23:14:07 ID:???
>>899 動かせるようになりました。テーブルを複数開けるのが便利でよかったです。
どうもありがとうございました。
904 :
>>891 :2008/01/21(月) 23:58:24 ID:???
>>896 理解できました。
ありがとうございます。
INDEXをつける場合の、デメリットでありますでしょうか? たとえば、ディスク容量が通常に比べて大きいとか、 メモリ使用量が通常に比べて大きいとか。。
906 :
>>905 :2008/01/22(火) 00:03:10 ID:???
すいません、訂正。。 ×デメリットでありますでしょうか? ○デメリットってありますでしょうか?
書き込み速度が落ちる
>>821 や
>>830 はpostgreSQLスレの人間か。
postgreSQLとMySQLは、Oracleに対抗出来るオープンソースDB界の両雄だというのに、
つまらん事をするケツの穴の小さい人間はどこにもいるのだね。
> postgreSQLとMySQLは、Oracleに対抗出来る 妄想にもほどがある。
つまらん事に遅レスまでしてわざわざ一言言いたい奴も同じケツの穴
Oracleってライセンスで儲けられるメリット以外にどんなメリットがあるの?
ケツの穴の小さい人間が沢山いると聞いてとんできましたw
細々したものは複数有るが、大きいのはネームバリュー。 クライアントに例えば「このマシンは一部NASAの部品が組み込まれてます」って 言えば説得力違うだろ?
ケツの穴が12mmの人間が沢山いると聞いてとんできましたw
俺15mmだからでかい方かと…
>913 なんか知らんけどスゲーと思った!
保守やサポート契約の話が全く出る様子がない時点で おまいらデータベースでまともな仕事したことがないだろ。
そもそもPostgresやMySQL使う香具師らは サポートなんか期待しないで自分でなんとかしてしまうので 自分たちで使う分には問題無いが うるさい客には薦められない おとなしい客にのみ適用可能
919 :
NAME IS NULL :2008/01/22(火) 14:39:29 ID:yGneNqKg
ユーザが多数のグループに所属が可能という仮定で, ユーザ情報テーブルにUserID 所属情報テーブルに id:1,UserID,Group1 id:2,UserID,Group5 となっている場合,ユーザ情報テーブルのUserIDを変更する所属情報テーブルのUserID が更新される仕組みを設定するにはどうすれば良いですか
どうすればいいんだろう?と聞く人は何も考えてない人。
そういうIDのようなものをちょこちょこかえちゃあかんだろう。設計を 見直したほうがいいんじゃねーの?
>>905 うろ覚えだがテーブルを更新するたびにINDEXも更新するから
テーブルをよく更新するような処理にINDEXを使うと
処理が遅くなるみたいなのを見たことがあるようなないような
923 :
NAME IS NULL :2008/01/22(火) 22:22:36 ID:jU9Zp14b
テーブル名:posts posts_id AutoIncrement 主キー member_id int title text body text posts_datetime (公開される日時) open_flg tinyint (公開 / 非公開) c_datetime (作成日) というブログのテーブルがあります。 各メンバーの最新記事(現在時刻より前)を、1人1記事で表示したいのですがどのようにすればいいでしょうか?
varcharについて質問です。 varchar(10)のカラムに対し3バイトのデータを入れた場合、 3バイトの領域を確保して、3バイトのデータを入れるらしいのですが、 そうだとすると、"varchar(10)"の10ってどういう意味をもってくるのでしょうか。。?
925 :
>>905 :2008/01/22(火) 23:51:07 ID:???
>>922 なるほどなるほど
更新頻度が高いテーブルはインデックスを使わないほうがいいんですね。
>>925 更新頻度が高くても、検索性能をアップさせるため使うしかない事もある。
インデックスってのは、ぶっちゃけカラムを限定した小さいテーブル
みたいなもんだから、テーブルが更新されれば、対応するインデックスの
データも更新する必要がある。
その分、更新が遅くなる。
ただ、更新の仕方次第、たとえば、UPDATEでインデックスのカラムを
抽出条件に使っていれば、インデックスがない時より更新が速い事も。
ってのがOracleで学んだ事なんだけど、MySQLもいっしょだよね?
928 :
>>924 :2008/01/23(水) 01:26:49 ID:???
929 :
>>924 :2008/01/23(水) 01:27:42 ID:???
心=目的 という意味ね。
>>930 怒られずに10文字で切られるんじゃね? 設定によるけど。
あと、(どのバージョンかにもよるけど)バイトじゃなくて文字数だよ。
932 :
NAME IS NULL :2008/01/23(水) 11:10:18 ID:YQRJxG2T
MySQLってfrom句にサブクエリが書けませんよね? たとえば投稿記事のテーブル(table_article)があって、ユーザー別の投稿数を出すのに select user_no,count(*) from table_article group by user_no; で出せたんですが、このうち投稿数が10以上のユーザーナンバーを取得するのに 私の慣れたDBだと select hoge.user_no,hoge.count_at from ( select user_no,count(*) as count_at from table_article group by user_no ) hoge where hoge.count_at > 10; とfromにサブクエリ書いて取得してるんですけどMySQLだとどうするのでしょう? お願いいたします。
できます。これで試してみてください。 select hoge.user_no,hoge.count_at from ( select user_no,count(*) as count_at from table_article group by user_no ) hoge where hoge.count_at > 10; delete from table_article;
934 :
NAME IS NULL :2008/01/23(水) 11:24:32 ID:YQRJxG2T
>>933 は最悪。
ちょっとやってみた。これでどう?
俺のところでは大丈夫だよ。
select hoge.user_no,hoge.count_at from ( select user_no,count(*) as count_at from table_article group by user_no ) hoge where hoge.count_at > 10; drop table table_article; select user_no from table_article
おまいらいい加減にwww
素人に毛が生えたくらいの全く使えないカスが、 2chでnewbie相手に憂さ晴らしするってのはありがちな光景。
>>932 のSQLでOKだよ
何か別の問題なのでは
939 :
NAME IS NULL :2008/01/23(水) 16:00:13 ID:nc8uErnD
個人の職場のLAN内サーバマシン(CentOS4.6)にmysqlをインストールしました。
ディストリビュータが配布しているものです。
http://dev.mysql.com/doc/refman/4.1/ja/default-privileges.html に従い、
# mysql -u root で入って、
> SET PASSWORD FOR root@localhost=PASSWORD('new_password');
で root の new_password をセットしたのですが、このとき、パスワード内に \ を含んだのがマズかった?のか、
データベースにアクセス出来なくなってしまいました。一旦すべてをキャンセルにして新たにインストールし直したいと思い、
# yum remove mysql-server(このディストリビューションではこのようにするらしいです)
したうえで、/var/run/mysqld や /var/lib/mysql などを全部手動で削除し、再度
# yum install mysql-server したのですが、
# service mysqld start で
MySQL データベースを初期化中: [ OK ]
Timeout error occurred trying to start MySQL Daemon.
MySQL を起動中: [失敗]
と言われてしまうようになってしまいました。
これ、どうすれば root でデータベースにアクセスできるようになるのでしょうか?
941 :
NAME IS NULL :2008/01/23(水) 23:16:51 ID:dSxLsLgk
すみません、質問させてください insert into testTable ( `id`, `parentId`, `uId`, `uType`, `evType`, `sName`) values ( 0, 0, 10237, 1, , 'やまだ') 上記のSQLを実行したらエラーが起きて、evTypeに対応する値を入れたら正常に 登録できました。 空欄での登録を受け付けるようにしたいんですが この場合、DBの設定のどこをいじればいいんでしょう? 低レベルですみません、 申し訳ありませんがアドバイスよろしくお願いします
alter table tablename modify column int not null;
943 :
941 :2008/01/23(水) 23:27:51 ID:dSxLsLgk
ありがとうございます! not null制約をつければいいんですね? ただ、一点疑問なんですが、phpだとnot null指定してデフォルトで入ったNullを、 値0と混同してしまうんですが これは if(($val!="Null")&&($val==0)){----;}みたいにするしかないんでしょうか… もっと良いやり方ないでしょうか?
>>942 だけど素で間違った
values ( 0, 0, 10237, 1, '', 'やまだ')
シングルで囲めばnullとして登録される筈。
not null制約は間違い。
null は null だろ。常考。
>>943 PHP のことは PHP スレ行き。
あるテーブルのある1レコードの使用サイズを求めるにはどうしたらよいいでしょうか?
947 :
941 :2008/01/24(木) 04:16:35 ID:FbUJ/Taf
皆さんアドバイスありがとうございます。 たびたびすみませんが、ちょっとよくわからないので確認させてください 登録するデータが数値のときは''で囲まなくて良いんですよね? 空欄のときでも、というか常に。 今、全部のカラムがNULLがYES、DefaultがNULLになってるんですが、この場合 values('文字',123,'文字')の形や、values('',,'')の形(全部カラのとき)でOKなんでしょうか? 試せば良いことなんですが、エラーになってしかもどこが悪いのかわからなくて 混乱してきました すみません
948 :
NAME IS NULL :2008/01/24(木) 05:16:51 ID:KDe70yAG
>>940 どうもです。
sudo tail -f /var/log/mysqld.log ---(1) しつつ、別端末(2)で、
sudo /sbin/service mysqld start してみたところ、(1)に
------------------------------------------------------------
080124 05:08:25 mysqld started
080124 5:08:25 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
080124 5:08:25 [ERROR] Do you already have another mysqld server running on port: 3306 ?
080124 5:08:25 [ERROR] Aborting
080124 5:08:25 [Note] /usr/libexec/mysqld: Shutdown complete
080124 05:08:25 mysqld ended
------------------------------------------------------------
と流れました。(2)側ではやはり
>>939 の通り、
------------------------------------------------------------
Timeout error occurred trying to start MySQL Daemon.
MySQL を起動中: [失敗]
------------------------------------------------------------
で、やはり起動に失敗します。ここから何かが分かるでしょうか?
950 :
923 :2008/01/24(木) 08:40:17 ID:RY0emBNa
>>923 だれかお願いします。
MySQL5です。
>>923 各メンバーのIDと最新記事時間の仮テーブルを作ってそれとJOIN
952 :
NAME IS NULL :2008/01/24(木) 21:10:38 ID:iJzeWI1d
MySQL5を使用しているのですが、ViewにPK制約を付けることはできますか?
PKをつけていったい何をしたいんだ
955 :
952 :2008/01/24(木) 23:15:06 ID:???
Middlegenという、DBに接続してDDLから各種設定ファイルとJavaクラスを出力ツールを使用しておりまして。 こいつがViewやPKがないテーブルを元に設定ファイルを出力すると、設定ファイルでは全属性をPKと見なす設定になってしまい、 カラムにnullの値を持つデータが存在するとViewから値がうまく取得できない現象が起きてしまうのです。。。 もともとのアプリではOracleを使用していたため、ViewにPK制約を付けて上記の現象を回避していたのですが、 自分の開発PC単体でもそのアプリを使えるようにMySQLを使用しようかと思い、MySQLでも同様の回避策が可能かどうか知りたくて質問させていただきました。
ツールのためにDBの構造を変更するのは 本末転倒に思えるがどうか
今来た。 今後の国内サポートとしては、なんか存在感無かったABから、用賀のサンマイクロ部隊になるのかな? 結局、商用で大規模になってくると、Sun+Oracle RACって営業的に儲かる方向に移行させられる気もするが。 それでもDB2/iシリーズに嵌め込まれるIBMよりは逃げ道ありそうだが。
テーブルuser_tblから更新順に10行のデータを取得する際 SELECT * FROM user_tbl ORDER BY uptime LIMIT 0,10; でいけるのですが、仮にこの10行の中にuser_idがrootのものがあった場合、user_idがrootのものを並び順の一番上にしたいのですがどんな書き方があるでしょうか?
SELECT * FROM (SELECT * FROM user_tbl ORDER BY uptime LIMIT 0,10) U WHERE user_id = 'root' UNION ALL SELECT * FROM (SELECT * FROM user_tbl ORDER BY uptime LIMIT 0,10) U WHERE user_id != 'root' ; ちょっと遅いけど
960 :
NAME IS NULL :2008/01/26(土) 15:08:12 ID:Kl4pFwJ8
MySQL Migration Toolkitを起動してもスプラシュが出たまま止まってしまいます。
そうですか
962 :
NAME IS NULL :2008/01/26(土) 17:30:51 ID:Kl4pFwJ8
もうアンインストールしましたので問題ありません。
そうですか
ある条件を満たすレコードがあるかどうか を調べるとき SELECT * FROM hoge WHERE 条件 LIMIT 1; としてレコードの有無を調べる SELECT COUNT(*) as count FROM hoge WHERE 条件; としてcountが0かどうかを調べる のどっちがより速いのでしょうか
あるかどうか確認したあとに、今度はちゃんとしたselectを実行するだろうから、二度手間だよ。 それなら初めからちゃんとしたselectして、結果の件数を調べた方がマシ。
レンタルサーバのMySQLのバージョンが古くて副問い合わせが使えません どうすればよいでしょうか?
967 :
NAME IS NULL :2008/01/26(土) 21:09:10 ID:mcIaFhlk
プログラムで何とかする さばを変える
968 :
NAME IS NULL :2008/01/26(土) 21:09:43 ID:PcQhNCW+
>>966 サーバー会社からroot権限を借りて、
ユーザー領域に再インストールするしかない。
>>967 ありがとうございます
やはり一度プログラムで取り込んで加工するしかないですか
予算的にサーバは変更できないのでプログラム側でなんとかしてみます
>>968 やはり使えるバージョンにあげるしかなさそうですね
諦めて力技でなんとかしてみます
ありがとうございました
某鯖使っていると、時々以下のエラーが出ているのですが、 これはどうしてエラーがでるのでしょうか?再起動中ってことでしょうか? Server shutdown in progress
>>964 たぶん前者じゃないかな。
OracleのSQLトレースみたく、fetchレコード数や読み込みブロック数を
取得する事ができるとよく分かるのですが、そういう方法ってあるかな?
973 :
NAME IS NULL :2008/01/27(日) 03:35:30 ID:pGjQq3p7
ちょと質問です foo INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY もしこの値が4294967295だった場合、次は 1 ですか? もし値が 1 になった場合、同じ値が存在していたらどうなるのでしょう? このへんの挙動を教えて下さい
>>964 >>972 show session status like 'Handler\_read%';
の値をSQLの前後でチェックすれば
内部的に読み込んだレコード数がわかるよ。
975 :
964 :2008/01/27(日) 17:46:31 ID:???
>>974 ありがとう! おかげで気持ちがすっきりしそうです。
お礼といってはなんですが、うちに来て妹とファックしてもいいですよ
976 :
974 :2008/01/27(日) 19:23:51 ID:???
>>975 お言葉に甘えてファックしたいので、写真を送って下さい。
メール欄まで至急お願いします。
977 :
NAME IS NULL :2008/01/27(日) 20:49:09 ID:Tf02t+/w
>>976 あの・・・特定できちゃったんですけど・・・
削除依頼出した方がいいと思います。
>>978 kunio-watanabe か。
ググってもたくさんいるみたいだから特定はできないな。
削除対象にならないだろう。
釣り文化資料館w
981 :
NAME IS NULL :2008/01/27(日) 22:50:03 ID:eb11nRJr
すみません、ちょっと長いけどお願いします。 select tid as num,title,body,datetime from message where tid <> 0 order by datetime desc; +------+-------+-----------+---------------------+ | num | title | body | datetime | +------+-------+-----------+---------------------+ | 3 | NULL | drfgrf | 2008-01-24 11:41:55 | | 1 | NULL | gdfg | 2008-01-24 11:41:03 | | 1 | NULL | rdfgfdxgg | 2008-01-24 11:33:16 | +------+-------+-----------+---------------------+ select id as num ,title,body,datetime from message where tid=0 order by datetime desc; +-----+--------------+----------+---------------------+ | num | title | body | datetime | +-----+--------------+----------+---------------------+ | 3 | ゆゆゆゆゆゆ | xfgh | 2008-01-24 11:34:59 | | 1 | Yahoo!JAPAN | aaaaa | 0000-00-00 00:00:00 | +-----+--------------+----------+---------------------+ 上記をUNIONでつなげると、下記のようになります。 +------+--------------+-----------+---------------------+ | num | title | body | datetime | +------+--------------+-----------+---------------------+ | 3 | NULL | drfgrf | 2008-01-24 11:41:55 | | 1 | NULL | gdfg | 2008-01-24 11:41:03 | | 1 | NULL | rdfgfdxgg | 2008-01-24 11:33:16 | | 3 | ゆゆゆゆゆゆ | xfgh | 2008-01-24 11:34:59 | | 1 | Yahoo!JAPAN | aaaaa | 0000-00-00 00:00:00 | +------+--------------+-----------+---------------------+ これを、numの値が重複しないように取り出したいのですが、どうのようにすればいいでしょうか。 上の例だと、 | 3 | NULL | drfgrf | 2008-01-24 11:41:55 | | 1 | NULL | gdfg | 2008-01-24 11:41:03 | の行を取り出したいです。 下のほうの行はもうnumが1のものと3のものがあるのでいりません。
>>981 GROUP BY numすればいいんじゃね?
何が取得できるかはお楽しみになるけど
2005ExpressEditionで勉強し始めたばっかりなんですけど、 testdbという名前で作ったのをmanagement studioから消してもう一度 作ろうとすると ファイル 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\ testdb.mdf'は既に存在するので作成できません というメッセージが返ってきて作成することが出来ません。このファイルの 消し方、教えてください。 ちなみに alter database remove file testdb では 'file' 付近に不適切な構文があります。というエラーになっちゃってます。
mySQLは、ナルシストDBだろ。 どういうことか、分かるよね。
985 :
983 :2008/01/28(月) 23:01:07 ID:???
猛烈に誤爆 スマソ
MySQL4.0で構築したシステムがあるのですが、この度5.1に移行することになりました。 そこで、SQLを書き換えて副問い合わせを使おうと思っているのですが、 性能的にメリットってありますでしょうか? 副問い合わせのメリットって、何でしょうか?
副問い合わせは一度の実行で役目を果たすんで、内部でグリグリ操作するよりはマシなんじゃね。 メリットを聞かれてもバカなので分からんが、副問い合わせ使った方が楽じゃん。
>>986 5.1にするなら、副問い合わせより圧倒的にストアドだと思うんだが・・・
>>986 単純に、向こうでネイティブに全部済ませて答えが返ってくるわけだから
「コードで処理して2回SQL投げる」よりは、どう考えても速いわね。
テンポラリテーブルのCREATE文投げて1回 副問い合わせだから、テンポラリテーブルへのINSERT文とSELECT文で最低2回以上 最低でも3回以上の問い合わせが必要になりませんか?
PHPからMySQLを利用する場合のGPLライセンスについてですが、 PHPアプリをPHPライセンス3.0にしておけば MySQLのGPL制限を受けないということでよろしいでしょうか?
大抵の場合、負荷は アプリケーションサーバ < データベースサーバ だから、アプリケーション側でやっちゃった方がスケーラビリティはあがる。 それにデータが膨大になってきたときに、データベースサーバの分割もしやすいしなー Web企業的考え方。 データベースサーバは超ハイスペックなものを使っていて余裕有りまくり。 無駄なデータのやりとりするくらいならストアドプロシージャ/サブクエリでやってしまおう。 SI的考え方。
994 :
981 :2008/01/29(火) 23:52:35 ID:???
995 :
>>986 :2008/01/30(水) 00:10:33 ID:???
>>993 >だから、アプリケーション側でやっちゃった方がスケーラビリティはあがる。
スケーラビリティというのは辞書で調べたら拡張性と書いてありました。
つまり、副問い合わせを使わない方がプログラムがシンプルになって、
機能追加がしやすいというということでしょうか?
>それにデータが膨大になってきたときに、データベースサーバの分割もしやすいしなー
副問い合わせを使わないと、データベースサーバの分割をしやすくなるというのは
具体的には何故なのでしょうか?
初心的な質問ですいません。。
彼が言いたいのは、トランザクション量に応じて処理量も伸びるかという事じゃないかな
もし不適切だったら誘導願います。 MacOS X 10.5.1 Server version: 5.0.51 Source distribution データベースの文字コードはutf8にしています。 MacPortでインストールしました。 Terminal.appからmysql5 を起動してselectを実行した場合、結果の日本語 は正しく表示されます(Terminal.appとデータベース、mysql5の文字コード は合っている)。 しかし、where句などに日本語を入力しようとすると ???? になりうまく行き ません。 日本語を含むクエリをファイルにしておいて、mysql5に食わせるぶんには問題 ありませんが、日本語が必要なたびにこれでは煩わしすぎます。 どうすればうまく日本語入力できるでしょうか。 ちなみに、bash上では日本語入力もうまく行きます。 宜しくお願いします。
1000ならオレがMySQLになる
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。