MySQL 総合 Part17

このエントリーをはてなブックマークに追加
835NAME IS NULL
このへんかなあ?

Bug #31145 ALTER TABLE DROP COLUMN, ADD COLUMN crashes (linux) or freezes (win) the server
http://bugs.mysql.com/bug.php?id=31145
836830:2010/05/03(月) 01:12:11 ID:???
>>835
それですね!
バグが報告されているヴァージョンが5.1.43以前で
自分のヴァージョンが5.1.37ですから間違いなさそうです
症状もまったくもって同じです

最新ヴァージョンにはもうパッチが当ててあるようですね
治っているならいいです、次回、折を見て最新ヴァージョンに切り替えます

それにしても2007年9月に報告されたバグが
去年の暮れまで放置されてたなんて
MySQLの開発って意外と杜撰なんですね…

ありがとうございました!
837NAME IS NULL:2010/05/03(月) 12:38:02 ID:???
普通そういう使い方しないからなw
838NAME IS NULL:2010/05/03(月) 13:10:53 ID:???
ここまでバージョンあがってるのにいまだにこんなバグ出るほうがおかしくね?
開発管理は最初から今まで進歩しないてアマチュアレベルだとおもうけどな
839NAME IS NULL:2010/05/03(月) 13:53:19 ID:???
不具合修正にも優先順位がある。
メリットが少ない変更は後回しなだけ。

といいつつ正直、将来は心配。
840NAME IS NULL:2010/05/03(月) 23:31:20 ID:???
動かないならまだしも、クラッシュするってサービス止まっちゃうじゃないか。
最優先で修正されるべきなんじゃないの?
841NAME IS NULL:2010/05/03(月) 23:41:07 ID:???
今回の問題は
あろうことか、「開発者側の当事者」が
「いや、俺も5.0.52で試したけど再現性なかったよ」
って書いたもんで、約二年間も放置されていた、ってことでしょう

実際には、バグ報告者は5.1.20でバグを発見しているんで
5.0.52で再現性を試みる自体が開発者としておかしいんですが

ALTER TABLE程度でいちいちフリーズされるのはどうかと思います
(「さいさい変更を加えるのは最初の設計が悪い」とかは言いっこなしですよ)
まぁ、優先順位が高かったからこそ、二度目のバグ報告で
一ヶ月も経たないうちに対策されたんだと思います

とにかく、自分は今回の件でMySQLに対する信用は落ちました
842NAME IS NULL:2010/05/04(火) 00:14:28 ID:???
MySQLを擁護するつもりはまったくないけど
バグの10個や20個で騒いでたらシステム開発はできんよ

MySQL 5.1でこれまでに修正されたバグは3,500個以上
Oracleだって9.2.0.1〜9.2.0.8で修正されたバグは6,000個以上
Windows2000には出荷当時63,000個のバグがあると言われていた

ちょっとスパゲッティな気はするけどね>MySQL
843NAME IS NULL:2010/05/04(火) 00:38:13 ID:???
>>842
>MySQL 5.1でこれまでに修正されたバグは3,500個以上

あらららら、MySQL 5.1ってもう十分に枯れたシステムだと思ってたんですけど違ったんですね…
こうなるとPostgreSQLの修正されたバグの数が知りたくなりますね…

でも、今回の件は許せない
トヨタのリコール隠しくらい許せない
844NAME IS NULL:2010/05/04(火) 00:48:18 ID:???
思う存分数えてください
http://www.postgresql.org/docs/8.4/interactive/release.html

MySQL 5.1が確か2008年11月リリースだと思ったから
PostgreSQL 8.3.5あたりから数えるといいよ
845NAME IS NULL:2010/05/04(火) 13:43:06 ID:???
MySQLとポスグレはリリースタイミングが違うから期間ごとのバグ数比較してもしかたがないような気もする。
ポスグレは毎年新バージョンリリースしてるんで比較するなら8.4.1、8.4.2、8.4.3、8.4.4のバグ数と5.1.27以降のバグ数じゃね?
ちなみにポスグレの8.4.0はリリースバージョンだから基本バグなしってスタンス。

今ざっくり数えてみたらポスグレの8.4は841から844で修正170くらいだな。
846NAME IS NULL:2010/05/04(火) 14:33:31 ID:???
>>844
そんな殺生な…

と思ったら

>>845
誠に乙です

このスレでこう呟くのもアレですが
やっぱりPostgreSQL、いいなぁ…
847NAME IS NULL:2010/05/04(火) 15:11:01 ID:???
>>846
だったらPostgreにすりゃあいいでしょーが w

客先とかの都合で変えられないんだったら諦めなしゃーないし w
848NAME IS NULL:2010/05/04(火) 15:56:30 ID:???
>>847
元々最初に触ったデータベースはPostgreSQLでしたし、そのうち移ります…
世間様はまだMySQLを崇拝していらっしゃるんで、MySQLは完全に捨て切れないですが…
849NAME IS NULL:2010/05/04(火) 16:51:33 ID:???
>>816
どなたかヒントをお願いします。
850NAME IS NULL:2010/05/04(火) 18:33:17 ID:???
>>848
> 世間様はまだMySQLを
日本はPostgreが先行だったと思ったが。
851NAME IS NULL:2010/05/04(火) 19:12:59 ID:???
>>850
なので、日本は例外的にPostgreSQLが大きなシェアを持っている。
けど、やっぱりLAMPってことでMySQLがかな〜りもてはやされたからねい。
日経うんちゃら読んでわかったつもりになった担当者がMySQLを強制
というのは普通にあった。
852NAME IS NULL:2010/05/04(火) 20:36:34 ID:???
L inux
A pache
M isa
P ostgre

これで行くんだ。
853NAME IS NULL:2010/05/05(水) 00:32:35 ID:???
PostgreSQLは品質が良いからバグが少ないのか
ユーザが少ないからバグが抽出しきれていないのかが
ちょっと分からない
854NAME IS NULL:2010/05/05(水) 01:07:46 ID:???
ソース読み比べてみPostgresとMySQL
なんでMySQLが低品質か分かるよ
855NAME IS NULL:2010/05/05(水) 23:26:46 ID:???
正規化するための主キーの設定と検索速度?、今後のメンテナンス?で
悩んでいるため質問させて下さい。

重複しないカラムとして「ショップ名」があります。
(東京店、大阪店、....)

ショップ名を中心に各店舗の人数とか売上とか細かい詳細があるため
複数のテーブルに分けて正規化します。

自分ではショップ名が重複しないから主キーにすれば良いかと考えますが
こういう場合でもあえてIDみたいな数値型(INT型?)のカラムを作って
それを主キーにした方が良いのでしょうか?
(auto_incrementにすればさらに楽だから?)
856NAME IS NULL:2010/05/05(水) 23:47:40 ID:???
>>854
目糞鼻糞w
857855:2010/05/05(水) 23:55:32 ID:???
追記

MySQLで各テーブルを見る時に
ショップ名が入っていた方が分かり易いというのもあります。

ただ将来絶対にショップ名が変わらないという保証はないので
そういう意味でメンテナンス的に?数値にした方がいい??
858NAME IS NULL:2010/05/06(木) 00:17:03 ID:???
どれもやめたほうがいいと思うけどな。
859NAME IS NULL:2010/05/06(木) 00:54:45 ID:???
主キー列を更新するっていうのが筋悪なので
名前が変わることのある店名のようなものは主キーにしないのが定石。

名前を主キーにすると外部キーをつけたときにメンテナンスしづらくなるし、
RDBMSによってはそもそも主キー列が更新できないものもある(TimesTenとか)

なので店舗IDを主キーにするのがふつうで、これをauto_incrementにするかどうか。
auto_increment列は売り上げとか日々データが増えるテーブルに対して
つけるものだと考えているので、私なら店舗IDはauto_incrementにしない。
860NAME IS NULL:2010/05/06(木) 11:42:23 ID:???
>>856

読んでないだろお前
861NAME IS NULL:2010/05/06(木) 11:46:57 ID:???
>>856
ソース読むんだよ、坊や。
バイナリ拾って「あぁグチャグチャやんw」って言っちゃダメだよ、坊や。
862855:2010/05/06(木) 15:46:25 ID:???
>859
わかりやすい解説ありがとうございました。

>なので店舗IDを主キーにするのがふつうで、これをauto_incrementにするかどうか。
>auto_increment列は売り上げとか日々データが増えるテーブルに対して
>つけるものだと考えているので、私なら店舗IDはauto_incrementにしない。

入門書や初心者向けのサイトだと
idを主キーにしてauto_incrementにしているため
そういうものかと思っておりましたが
日々増えるデータに対して割り当てるですね。

たしかに店舗IDだとそうそう増えるものではないため
自分がわかりやすい数値にすればいいわけか。
ありがとうございました。
863NAME IS NULL:2010/05/06(木) 16:36:37 ID:???
mysqlについて質問です
よろしくお願いします

table_a
|orders_id|orders_date|
|  1  |20100101  |
|  2  |20100101  |
|  3  |20100101  |


table_b
|orders_id|shop_kind|
|  1  |  0  |
|  3  |  1  |


table_bのshop_kindが1以外のものと、table_bにorders_idは無いがtable_aにorders_idが存在するレコードを抽出したいのですが、クエリをどう記述すればいいかわかりません
以下のSQLのXXXXXXXに何か入れればできそうなのですが、どうすればいいですか?

select ta.orders_id from table_a ta left join table_b tb on (ta.orders_id = tb.orders_id) where (tb.shop_kind !='1' or XXXXXXX);

結果はorders_idが1と3のものが取れればいいです
864863:2010/05/06(木) 16:37:58 ID:???
すいません訂正です
>結果はorders_idが1と3のものが取れればいいです
結果はorders_idが1と2のものが取れればいいです
865NAME IS NULL:2010/05/07(金) 19:08:16 ID:???
MySQLで、INSERTしようとすると
「the table 'table_name' is full ERROR 1114」
と出て登録できなくなりました。
MySQLのバージョンが5.1で、ENGINEは、NDBCLUSTERです。
tmp_table_sizeとmax_heap_table_sizeをデフォルトの16Mから
200Mへ変更してみても同じエラーになります。
パッと見よく分からない質問かもしれませんが、
こんなことが原因の可能性があると思う方がいましたら
教えてください。お願いします。
866NAME IS NULL:2010/05/07(金) 20:19:19 ID:???
MySQL_Cluster や NDBCLUSTER をわからずに言うけど
保存用ディレクトリのあるパーティションが
いっぱいとかじゃないの?
メモリテーブルならどこのサイズなんだろうかな...
867NAME IS NULL:2010/05/08(土) 01:26:49 ID:???
tmp_table_sizeとmax_heap_table_sizeはMEMORYストレージエンジンの設定だから
NDBとは関係ないパラメータ、のはず

Sun Micro.のときはよく宣伝してたけど
正直MySQL Cluster使ってる人は超少ないと思う
868NAME IS NULL:2010/05/10(月) 11:53:44 ID:???
>>865
あー、うちでもそれ、tmpテーブル作れない、ってのがあったなぁ。
そんときはええと・・・・・、うーんと、たしかインデックスのサイズも含めたのがtmp_table_sizeだか
heap_sizeだかになって、その見積もりが甘かったのが原因、だったきがします。
869NAME IS NULL:2010/05/10(月) 18:14:05 ID:???
username、pointというカラムがあるテーブルがあるとして、
ランキングの順位をつけて出力するSQLはどのようにかいたら
うまくいくでしょうか。
3位が4名いても次は4位となるランキングとなってます。

現在のところは select username,point from table order by point asc;
でプログラム側で処理しておりますが、全てSQL側で処理ができれば
便利だと思い、質問させていただきました。

よろしくお願いいたします。
870NAME IS NULL:2010/05/10(月) 20:14:44 ID:???
>>869
MySQLで分析関数を模倣1(前編)
http://codezine.jp/article/detail/3107
871NAME IS NULL:2010/05/12(水) 06:54:41 ID:BasMxRqb
phpMyAdminの情報から

MySQL
* サーバ: localhost via TCP/IP
* サーバのバージョン: 5.1.37
* プロトコルバージョン: 10
* ユーザ: root@localhost
* MySQL の文字セット: UTF-8 Unicode (utf8)

Web サーバ
* Apache/2.2.12 (Win32) DAV/2 mod_ssl/2.2.12 OpenSSL/0.9.8k mod_autoindex_color PHP/5.3.0
* MySQL クライアントのバージョン: 5.1.37
* PHP 拡張: mysqli

phpMyAdmin自体はUTF-8になっています。

この状態でphpMyAdminからテーブル作成したところchar型やvarchar型の照合順序がlatin1_swedish_ciになります。
show create tableで見ると、テーブル自体のDEFAULT CHARSETはlatin1となっています。
このままinsert文を実行してchar型に日本語を挿入して、phpMyAdminからselectすると????といった感じに文字化けします。
自前で作ったPHPスクリプト(UTF-8で保存)からアクセスしてphpMyAdminでinsertしたものを取得すると同様に????となります。

次は自前で作ったPHPスクリプト(UTF-8で保存)からテーブルを作成して同様にinsert文で日本語を挿入した場合、
照合順序やテーブルのDEFAULT CHARASETは同様ですが、文字化けせず取得することができました。
phpMyAdminから挿入した項目を見てみると、????にはなってないものの文字化けした字になっています。
さらにPHPスクリプトをShift_JISに保存しなおして同じテーブルに対しinsert文でさらに追加したところ、
追加した部分は正常に見れるものの、UTF-8で保存したときの日本語は文字化けしています。

日本語を挿入する場合、自前のスクリプトから最初に挿入したときの文字コードで挿入し続ければ問題ないことが分かったのですが、
こういうものなのでしょうか?
文字コード関連は複雑で関連ドキュメントを見てもいまいちよく分かりません・・・
872NAME IS NULL:2010/05/12(水) 11:23:43 ID:e1mmKCKP
初歩的とは思いますが、質問です。

作成したビューってのは、元のテーブルが更新されたら、そのタイミングでビューも更新されるって思ってていいのでしょうか?

また、year(sysdate())みたいなのを条件に含めてた場合も、日付が変わったタイミングでビューのデータも更新されるって認識で良いのでしょうか?

873NAME IS NULL:2010/05/12(水) 11:42:48 ID:???
ビューは普通にSELECT文を発行した結果返ってくる結果を
1つのテーブルに見せかけるだけのもの
当然、データは最新のものになるよ
874NAME IS NULL:2010/05/12(水) 12:04:02 ID:???
>>873
ありがとうございます。
SELECTのエイリアスみたいなものですか。
875NAME IS NULL:2010/05/14(金) 15:58:04 ID:UNEfj5/X
質問です。

バージョンは5.1.41です。

ユーザ情報のみのエクスポートをする方法ってありますか?
出来れば「GRANT」の形で出てくると嬉しいんですけど。
876865:2010/05/14(金) 16:46:55 ID:???
>>866-868
回答ありがとう御座いました。
ちょっと原因の特定ができず、
前任者の作ったシステムで本番環境だったため、
4日ほどかけて全部SQL-serverに移行しました。
877NAME IS NULL:2010/05/18(火) 21:26:26 ID:???
質問させてください。

table_main
+---------+-----------+
| main_id | main_name |
+---------+-----------+
| 1 | NAME1 |
| 2 | NAME2 |
| 3 | NAME3 |
+---------+-----------+

table_sub
+---------+----------+
| main_id | have_num |
+---------+----------+
| 1 | 10 |
| 2 | 10 |
| 2 | 20 |
| 3 | 10 |
| 4 | 20 |
+---------+----------+

このようなテーブルがあったとします。
この中から、たとえば「have_numを 10 と 20 両方もつ main_id の main_nameを取得する」
という SQL 文はどのように書けばよいのでしょうか。

サブクエリなど勉強中でいまいち方法が思いつきません。
お詳しいかた教えていただけましたら幸いです。

バージョンは5です。
878NAME IS NULL:2010/05/18(火) 22:47:52 ID:???
試してはいない。

SELECT tm.main_name
FROM
 table_main tm,
 table_sub tsa,
 table_sub tsb
WHERE
   tsa.have_num = 10
 AND tsb.have_num = 20
 AND tsa.main_id = tsb.main_id
 AND tsa.main_id = tm.main_id
879NAME IS NULL:2010/05/19(水) 21:26:34 ID:???
>>878
ありがとうございます!

have_numをもつ条件をさらに増やすとなると、
同様に SELECT する同一テーブルがどんどん増えてしまうのですが、
効率をよくするよい方法はありませんよね…?
880NAME IS NULL:2010/05/19(水) 22:58:04 ID:???
もしかしたら、この辺でどうだろ?

SQL質疑応答スレ 9問目
http://pc11.2ch.net/test/read.cgi/db/1252492296/6
6 :NAME IS NULL :2009/09/09(水) 19:37:35 ID:???
よくある質問3

(問)
ID HOGE
01 A
01 B
01 C
02 A
03 B

HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか

(答1)
SELECT id
FROM TableName
WHERE hoge in ('A','B','C')
GROUP BY id
HAVING count(DISTINCT hoge) = 3
;

(答2)
select *
from TableName T1
where not exists (select *
         from (values 'A', 'B', 'C') T2 (HOGE)
         where not exists (select *
                  from TableName T3
                  where T1.ID = T3.ID
                  and T2.HOGE = T3.HOGE
                  )
         )
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意
881NAME IS NULL:2010/05/20(木) 12:54:25 ID:???
created_tmp_disk_tables が発生したクエリを特定することはできますか?
882NAME IS NULL:2010/05/20(木) 21:57:54 ID:???
>>880
ありがとうございます!
このような方法があるのですね。
大変勉強になりました。

さらに、これを発展させて、

table_main
+---------+-----------+
| main_id | main_name |
+---------+-----------+
| 1    | NAME1   |
| 2    | NAME2   |
| 3    | NAME3   |  
+---------+-----------+

table_sub
+---------+---------+
| main_id | item_id |
+---------+---------+
| 1    | 1    |
| 2    | 1    |
| 2    | 2    |
| 3    | 1    |
| 4    | 2    |
+---------+---------+

table_item
+---------+-----------+
| item_id | item_name |
+---------+ ----------+
| 1    | アイテム1 |
| 2    | アイテム2 |
+---------+-----------+

「アイテム1 と アイテム2 の両方もつ main_id の main_nameを取得する」
という風に複雑になると、どのようにやればいいのでしょうか。

まず item_name に対応した item_id を取得し、
それを両方もつものを >>880 の方法で調べる……
という風な方法は思いつきましたが、
1つの SQL 文で記述する方法がわかりませんでした。

お詳しい方教えていただけましたら助かります。
883NAME IS NULL:2010/05/22(土) 01:52:20 ID:???
インポートについての質問です。
最新MySql Windows番にて、csvをインポートしようとすると

ERROR 1292 (22007): Incorrect datetime value: '2010/05/20 00:00:00
2' for column 'Date' at row 1

と出るのですが、日付データの最後についてる 2 の意味が分かりません。
使用したSQL文は以下のとおりです。

LOAD DATA INFILE "FileName.csv"
INTO TABLE TableName
FIELDS TERMINATED BY "," ENCLOSED BY '"'
LINES TERMINATED BY "/r/n";

Dateはテーブルの最後のフィールドで、他のフィールドのエラーは解決しましたが
このエラーだけ解決できません。エディタでcsvを開いたら"でくくられてないのに
取り込んでみたら"でくくられていたりと、いろいろと躓きまくっています・・・

どうか助言をお願い致します。
884883:2010/05/22(土) 02:14:29 ID:???
自己レスです解決しました。
LINES TERMINATED BY "/r/n"; を
LINES TERMINATED BY "\r\n";

に書き換えたところうまくゆきました。
スレ汚し失礼しました。
885NAME IS NULL:2010/05/23(日) 00:32:03 ID:???
Mac(10.6)にphpMyAdminを入れたのですが、パスワードがわからず
ブラウザからログインができません。どのように設定すれば良いのでしょうか?
886NAME IS NULL:2010/05/23(日) 07:20:46 ID:???
パスワードを知ればよろし。

どうしても分からないなら、mysql.userテーブルの該当の ユーザ@マシンのパスワードを消してしまう。
(これはrootとかのパスワードが分からないと出来ないだろうけど)
887NAME IS NULL:2010/05/26(水) 17:34:29 ID:???
3306を使ったDB接続ってNAT越えられますか?
888NAME IS NULL:2010/05/26(水) 17:34:57 ID:???
もちろん
889NAME IS NULL:2010/05/26(水) 20:49:06 ID:???
3306だけ通せばいいのでわりと楽なほう
890NAME IS NULL:2010/05/26(水) 22:08:51 ID:???
なるほど ありがとうございます
たしかにOracleだと他のポートも必要でしたよね
891NAME IS NULL:2010/05/26(水) 23:44:13 ID:???
>>887
セキュリティーの心配は?
892NAME IS NULL:2010/05/26(水) 23:47:20 ID:???
>891
まぁ確かにセキュリティの問題はありますね
お客がやりたい 責任は取るって言われるとやるしかないんです

F/Wで元IPを固定したらまぁ簡単に問題は起こらないと思いますが・・・
893NAME IS NULL:2010/05/27(木) 11:50:14 ID:???
待ち受けポート番号変えておけばちょっとは安全かもよ
894NAME IS NULL:2010/05/27(木) 13:51:15 ID:???
コマンドプロンプトでSelect文を実行すると
件数が多くなると全体を見れ無くなるんですが
txtファイルに出力するしかないですか?
895NAME IS NULL:2010/05/27(木) 13:54:58 ID:???
コマンドプロンプトの行数を増やす
896NAME IS NULL:2010/05/27(木) 14:13:56 ID:???
Pager使う
897NAME IS NULL:2010/05/27(木) 22:13:38 ID:???
とりあえず、コマンドプロンプトのプロパティを開いて、レイアウトタブを選択して、
その中の画面バッファのサイズの高さを増やしてみよう。
898NAME IS NULL:2010/05/27(木) 23:23:22 ID:tW/OnXJS
Navicatとかを使ったら?
899NAME IS NULL:2010/05/28(金) 00:28:03 ID:???
LIMIT入力すれば?
900NAME IS NULL:2010/05/28(金) 08:20:39 ID:???
>>894
何がしたいのか?
901NAME IS NULL:2010/05/31(月) 10:19:41 ID:???
>>900
わかってないのはお前だけだ
902NAME IS NULL:2010/06/01(火) 18:50:31 ID:???
MYSQLがインストールできましぇん

OS:WINDOWS XP
MYSQL VER:5.1.45

executeクリックした後に最後のチェックで1045エラーでrootのパス設定出来ないんですけど
どうしたらいいでしょうか。
本当すいません。教えて下さい。
903NAME IS NULL:2010/06/01(火) 19:24:36 ID:???
904NAME IS NULL:2010/06/01(火) 19:32:48 ID:???
executeとrootは小文字だろ
905NAME IS NULL:2010/06/03(木) 16:46:26 ID:???
PHP+MySQLで開発しています。
MySQLへのアクセス方法は、PHPからPHPのmysql関数、あるいはPHPのPDOクラスを用いて行う予定です。
できたものは公開したいと思っているのですが、ライセンスをどうすればいいのかよくわかりません。
作るアプリケーションは商用にも使えるアプリケーションになります。
これで開発したアプリケーションのライセンスはGPLになるのでしょうか?
できれば制限が緩いBSDやMITあたりにしたいのですが、MySQLを使ってる時点でGPLになってしまいそうで困っています。
MySQL以外にもPostgreSQLとSQLiteにも対応する予定です。
BSDやMITにしたい場合、MySQLの対応ははずすしかないのでしょうか?
どのみちソースコードを公開するからGPLでいいじゃんというツッコミはなしでお願いします。
906NAME IS NULL:2010/06/03(木) 17:00:45 ID:???
関係ないです
907NAME IS NULL:2010/06/03(木) 18:17:38 ID:zEZNACiR
PHPとMySQLでレンタルバナーみたいなのを作成しています。

会員は2000人ほどですが、1日10万前後のINSERTがあります。
1つのテーブルでアクセスを追加していく形なのですが、
INDEXさえ指定していれば、今後もこのままで大丈夫でしょうか?
それとも会員毎にDBを分けた方が良いのでしょうか?

将来を見据えて負荷がかからないような構造をしたいと思っていますので
構造についてアドバイスお願いします。
908NAME IS NULL:2010/06/03(木) 19:18:49 ID:???
tableA
id | name
--------
1 | aaa
2 | bbb

tableB
id | tableAid | point
-----------------
1 | 1    | 5
2 | 1    | 8
3 | 2    | 10
3 | 2    | 9
というテーブルで、 tableB.point が9以下の tableA.name を取得したいのですが
select tableA.name from tableB
inner join tableA on tableB.tableAid = tableA.id
where tableB.point < 10
とすると、当然ですが tableA.name が重複してしまいます。
プログラム側で取り除けばいいのですが、なるべくSQLのみで解決したいです。
可能でしょうか?
909NAME IS NULL:2010/06/03(木) 19:23:54 ID:???
SELECT DISTINCT 〜
910NAME IS NULL:2010/06/04(金) 04:19:52 ID:???
>>907
一日に10万レコードも増加するんだったら、1テーブルでは無理がある
会員毎にテーブルを分けるなりした方がいいだろう
それに加えて、古いレコードを削除するロジックも必須と思うが
911NAME IS NULL:2010/06/04(金) 10:40:49 ID:???
というかアクセスログみたいに追加しかしない、複雑な検索を
しないものならDB以外の保管手段を考えたほうがいいのでは
912NAME IS NULL:2010/06/04(金) 13:05:16 ID:???
DB以外の手法を取るとして、例えばファイルにしちゃうと、
件数が多すぎるから、ファイルオープン後の処理でスクリプトのメモリオーバーでコケる可能性が高いよ
913NAME IS NULL:2010/06/04(金) 13:11:19 ID:???
それ以前に設計の見直しが出来ないか?
詳しい仕様を知らんが、
件数をカウントするだけなら件数を保持しておくフィールドをインクリメントしてUPDATEすりゃあいい
なんでもかんでもINSERTしてるから肥大化するんでねえの?
914NAME IS NULL:2010/06/04(金) 13:18:09 ID:???
>>912
追記の書き込みオンリーで開いてもそうなる?
915907:2010/06/04(金) 13:45:41 ID:68Ryowuk
>>910-914
みなさんありがとうございます。

テーブルの構成は単純に
id|user_id|banner_id|date
で、「どの会員のバナーがどの日時にアクセスされたか?」を記憶します。
管理画面で範囲検索がしたいので、UPDATEではなくINSERTが必要です。

最低2年以上は保管したいと思っているのですが、
テーブルを分けた方が良いんですかね・・。
JOINして会員データと繋げて管理画面で表示させたいので、
DBを使う方が良いんです。
916NAME IS NULL:2010/06/04(金) 14:18:16 ID:???
検索はあんた1人がチマチマやるんだったらどうでもいいんじゃないかな。
動作が遅いとどっかから苦情がくるなら別だけど、これ以上正規化もないだろうからね。
それ以外は単純にINSERTしかしなくて、今問題がないなら余り考えないでもいいようにも思うけど。
INSERTにかかる時間は誰も感じないで済んでるんだろし、一時的にでも今更止められないでしょ。
あとはOLDテーブルみたいなのに心太する仕組みだけ組んどけばいいんじゃないの。
917NAME IS NULL:2010/06/04(金) 14:23:16 ID:???
>>915
NoSQLは?
918NAME IS NULL:2010/06/04(金) 15:09:10 ID:???
>>914
なる可能性が高い
オープンしたファイルの中身を変数に落としていく際にね
919NAME IS NULL:2010/06/04(金) 15:33:13 ID:???
時間は割り切って捨てたら?

俺だったらこうする

user_id|banner_id|day | count

プライマリーキー:user_id、banner_id、day

ようするにday(Y-m-d)毎にcountしちゃえば〜って事


10万件/日の2年分のデータを突っ込んだら、
ユーザー毎にテーブルを分けようとも、JOINで固まる

それに、915のテーブルだと、ある会員のアクセス数の取得
SELECT count(*) FROM TBL WHERE user_id= ? AND date < ? AND date <= ?
も動かなくなるぞ
920NAME IS NULL:2010/06/04(金) 15:40:56 ID:???
MySQL Proxy の話ってここでいいんでしょうか?
ぐぐってもあまり情報がでまわっていないもので・・・
921NAME IS NULL:2010/06/04(金) 20:36:18 ID:???
>>919
古いデータを定期的にそうやって集計してから切り捨てる、ということならアリだが、
最初からそういうテーブルしか持たないんだったらめんどくさいうえにかえって
遅くなるばかりでメリットがない。
922NAME IS NULL:2010/06/04(金) 21:18:56 ID:???
遅くなることはない、10万件を2000件に圧縮できる
SELECTもチョイだ

毎日10万件溜まってくテーブルにJOINだとかcount(*)するほうがおかしい
923NAME IS NULL:2010/06/04(金) 22:30:51 ID:ip+eErJw
mysqlを使ったプログラミングをするには、cのapiとjavaのどっちがおすすめ?
924NAME IS NULL:2010/06/05(土) 00:13:35 ID:cbT55XsI
MyISAMについて質問です。

トランザクション機能が使えないMyISAMを採用する場合、
トランザクションを使わないことによる問題点というものに対して、
特別な対策(テーブルを正規化しないとか)をするものなのでしょうか?
もしくは、トランザクションを使わないことによって発生する問題点を許容した形でシステム開発をするものなのでしょうか?


トランザクションを使わないでシステムを開発することに対してのイメージがわかないので、
MyISAMを使ってどのようにテーブル設計、というか注意事項というかが必要なのか、
そこらへんをご教示いただければと思います。

925NAME IS NULL:2010/06/05(土) 02:43:11 ID:nyGql8Ff
「MM00」みたいな英数字を表示させるにはどういった型で設定すればいいですか?
ちなみにVARCHAR(10)でやっても出来ません><

エラー名は
ERROR 1054 (42S22): Unknown column 'MM00' in 'field list'
です
926NAME IS NULL:2010/06/05(土) 05:26:43 ID:???
>>922
insertで済んでいたものがselect→insert/updateになるだろ。
同じ会員のバナーが同時にアクセスされることもあるだろうからロック待ちも
発生するし、厳密にはserializableじゃなきゃならんから、そうしたら毎回
テーブルロックだ。
927NAME IS NULL:2010/06/05(土) 06:19:49 ID:???
1時間に平均4000件、1分で70件か。
実際はGTに集中するだろうから10倍見積もるとして・・。
テーブルロック仕様を考えたやつはこの業界で生きていけないぞw
928NAME IS NULL:2010/06/05(土) 07:36:20 ID:???
>>925
単にselectするカラム名を間違っているだけなんじゃないの?
929NAME IS NULL:2010/06/05(土) 11:37:00 ID:???
>>924
MyISAMの問題はトランザクションがないことよりもクラッシュセーフでないこと。
電源ぶちって切っただけでDBが壊れる。
それでもよいときだけ使う
930NAME IS NULL:2010/06/05(土) 18:04:19 ID:8RarHjRw
なんで、設定フィルの拡張子がmy.cnfとmy.confの2種類あるの?
931NAME IS NULL:2010/06/05(土) 22:36:23 ID:qBJImX+X
SELECT test_tb.id,(test_tb.number+test_tb2.number)AS total FROM test_tb LEFT JOIN test_tb2 USING(id) GROUP BY test_tb.id

というSQLがあって、結果が
id|total
1 |10
2|NULL

となります。id2はtest_tb2.numberが存在しないのでNULLになりますが、
存在しない場合は「0」にするにはどう書けば良いのでしょうか?
932NAME IS NULL:2010/06/05(土) 23:06:32 ID:6EEUsDw0
>>931

mysql固有関数を使うなら

IFNULL((test_tb.number+test_tb2.number),0) AS total
933NAME IS NULL:2010/06/05(土) 23:17:18 ID:???
いや、test_tb.numberには値があるかもしれないんだからこうだろ
IFNULL(test_tb.number,0) + IFNULL(test_tb2.number,0) AS total
934NAME IS NULL:2010/06/05(土) 23:18:40 ID:qBJImX+X
>>932-933
ありがとうございます。この方法で行きます。
935NAME IS NULL:2010/06/05(土) 23:23:30 ID:???
>>933

質問なんですけど null値が含まれた計算結果はnullになるのでは?
936>>924:2010/06/06(日) 02:49:52 ID:???
>>929
ありがとうございます。
937NAME IS NULL:2010/06/06(日) 10:25:47 ID:???
my.cnfはあまり設定項目が多い印象を受けなかったのですが、
セキュリティに関してはmy.cnfで設定しないのですか?
938NAME IS NULL:2010/06/06(日) 19:34:34 ID:eYBmtmqg
InnoDBで1テーブル/ファイルにしている場合、
既存テーブルにautoextendつけたり、MAX_SIZEつけたりできますか?

有識者の方、よろしくお願いします。
939NAME IS NULL:2010/06/07(月) 00:37:27 ID:???
>>938
1) innodb_file_per_tableのときは各テーブル自動でautoextendする
2) InnoDBはそもそもMAX_ROWS効かない
940NAME IS NULL:2010/06/07(月) 11:44:41 ID:7daPAieJ
すみません、質問させてください
WindowsからLinuxに移行しましてMySQLをインストールシヨウと思っているのですが、HP(http://dev.mysql.com/downloads/mysql/#downloads)のどれをインストールすればいいのか分かりません
自分の持っている本にはmysql?.tar.gzをダウンロードとありますが、rpmしか見当たりません
で、こういうサイト(http://www.unix-vm.com/centos_4_1.html)を参考にしたのですが、4つもパッケージをダウンロードしています
これはやはり全部ダウンロードしなければいけないのでしょうか?
Windowsだとインストーラ一つだけだったのでどうなのかなぁ、と思いまして

OSはcentOSを使っております
以前yumでMySQLをインストールしたことはあったのですが、バージョンが古かったものでクリーンインストール時に「この際最新版をインストールしよう」と思い立ったのですが分からなくなりまして
宜しくお願いいたします
941NAME IS NULL:2010/06/07(月) 11:48:29 ID:7daPAieJ
ごめんなさい、もう一つ質問がありました
centOS5.4を使っている自分の場合、Select PlatformはRed Hat Enterprise Linux 5を選択するのでしょうか?
それともLinux - Genericを選択すればいいのでしょうか?
942NAME IS NULL:2010/06/07(月) 12:29:12 ID:???
本がどれだかわからんけど、持ってる本の通りにやりたいなら
Source Code 選んでGeneric Linuxのとこに*.tar.gzあるよ
943NAME IS NULL:2010/06/07(月) 12:30:08 ID:???
"Source Code"すら探せないんだからWindowsに戻るが正解
944NAME IS NULL:2010/06/07(月) 18:09:46 ID:???
100万レコードを全文検索する事って出来ますか?
945NAME IS NULL:2010/06/07(月) 20:27:24 ID:???
可能
946NAME IS NULL:2010/06/07(月) 21:08:02 ID:???
条件がそれだけならまぁ可能だわなぁ
947NAME IS NULL:2010/06/07(月) 22:23:00 ID:???
じゃ、1レコード10KB程度の文章があったら?
948NAME IS NULL:2010/06/07(月) 23:01:38 ID:???
>>939
ありがとうございます。
file_per_tableだとデフォルトでautoextendつくんですね。

2)についてですが、
質問の仕方がかなり悪くて申し訳なかったです。
MAX_ROWSではなくてautoextendのMAX指定のことをお聞きしたいのです。
既存ファイルのautoextendのMAXサイズを変更できるのでしょうか。
教えていただければ幸いです。

よろしくお願いします。
949NAME IS NULL:2010/06/07(月) 23:28:05 ID:???
>>948
できるはず
まずは試してみよう!
950NAME IS NULL:2010/06/07(月) 23:29:41 ID:???
>>947
可能
ただし1回の検索に20分ぐらいかかるかも
951NAME IS NULL:2010/06/07(月) 23:32:40 ID:???
>>941
どちらでもよい
rpmの場合はclient、server、shared、develの4つを入れるのが基本
952NAME IS NULL:2010/06/07(月) 23:34:44 ID:???
>>937
my.cnfって最大200項目ぐらいあるけどそれでも少ない?
セキュリティは主にSQLでmysqlデータベースに対して設定する
953NAME IS NULL:2010/06/07(月) 23:41:24 ID:???
>>950
また条件後付けで「私のメモリは16GBです」「私のストレージはSSDです」とか言われるぞ。
954NAME IS NULL:2010/06/08(火) 00:16:03 ID:???
>>953
その条件だからって、20分が2秒にはならないだろ?
955NAME IS NULL:2010/06/08(火) 00:26:01 ID:???
>>954
20分がなんぼになるかじゃなくて、>>947条件後出しすんなボケ氏ねって話。
956NAME IS NULL:2010/06/08(火) 01:12:11 ID:???
いいえ、死ぬ必要はNight思うわ
957NAME IS NULL:2010/06/08(火) 10:07:34 ID:???
夜に死ねと
958NAME IS NULL:2010/06/08(火) 10:13:06 ID:???
・後出して条件出して答えてもらう
・単にMySQLの可能性が知りたいだけ

どっちだろ?素人だったらそもそも
100万件のデータなんて扱わないはずだから、後者かな。
959NAME IS NULL:2010/06/08(火) 14:18:15 ID:6789QTvE
話はそれるけどいまMysqlの日本語全文検索って
senna 以外はどんなのがあるの?
960NAME IS NULL:2010/06/08(火) 14:34:14 ID:???
5.1のエクステンションを見たことある
実績とかは知らない
961NAME IS NULL:2010/06/08(火) 22:46:37 ID:???
JOIN使うとすんごく遅くなるんですけど仕様ですか?
データは1テーブル数10万件
3、4テーブルJOINしてます。
962NAME IS NULL:2010/06/08(火) 22:48:10 ID:???
さあ、ジョイナス!!
963NAME IS NULL:2010/06/08(火) 23:15:01 ID:???
テーブル構造もSQL文もインデックスも情報なしに、なぁ。
964NAME IS NULL:2010/06/09(水) 04:06:02 ID:???
>>963
だからじゃね?
965NAME IS NULL:2010/06/09(水) 07:12:19 ID:???
ありがちなのは、N自乗。
966NAME IS NULL:2010/06/09(水) 13:17:17 ID:???
でも実際、インデックスを理解しないで使っている人周りに結構居ない?
967NAME IS NULL:2010/06/09(水) 13:39:55 ID:???
なんだか分からないが付けると速くなる魔法の機能でしょ、理解してるよ
968NAME IS NULL:2010/06/09(水) 13:41:21 ID:???
>>967
はネタだろうが、
実際に使わないインデックスが20くらい付いたテーブルは見たことがある
969NAME IS NULL:2010/06/09(水) 16:10:11 ID:???
とりあえず、JOINのキーになっているフィールドはインデックスにしてる
970NAME IS NULL:2010/06/09(水) 16:15:57 ID:???
where句ある?
971NAME IS NULL:2010/06/09(水) 18:51:52 ID:???
join されるテーブルで where 句使うなら、
複合インデックスで
where 句のカラム, 結合カラム
とインデックスを張らないとダメだよ。
joinする場合はどっち道 フルJOIN 避けるために件数減らしてからJOINだから、
結合カラムに単体でインデックスを張るのは意味がないと思う。
972NAME IS NULL:2010/06/09(水) 19:00:02 ID:???
>>971
結合カラム自体を where で絞り込む場合は?
973NAME IS NULL:2010/06/09(水) 19:02:01 ID:???
>>972
その場合は有効か。
974NAME IS NULL:2010/06/09(水) 19:35:50 ID:???
でもまあ実際コード引継ぎとかすると、
インデックスとクエリ直すだけで速度が100倍とかなるから、
おかげで神みたいな扱いをされて楽。
975NAME IS NULL:2010/06/09(水) 20:40:41 ID:???
とあるカラムのインデックス
976NAME IS NULL:2010/06/09(水) 22:13:06 ID:7pAbJT2V
auto_incrementを既存のテーブルに追加したいのですが、
どのようにsqlを書けばいいのかわかりません
どなたか、教えてください

977NAME IS NULL:2010/06/09(水) 22:39:04 ID:???
ALTER TABLE
ADDなのかCHENGEなのか知らんが。
978NAME IS NULL:2010/06/09(水) 23:31:31 ID:???
インナーのネイティブアルターか
979NAME IS NULL:2010/06/10(木) 00:09:03 ID:???
>>968
魔術はあるもん!
980NAME IS NULL:2010/06/10(木) 03:34:47 ID:???
キュキュキュッ
981NAME IS NULL:2010/06/10(木) 09:07:48 ID:9/rnYsAK
質問させてください。
記号などをInsertするとIncorrect string valueでエラーになる
のですがどうしたらいいでしょうか?
A,B,Cと複数のDBがあり、Aでしか起きない現象になってます。
982NAME IS NULL:2010/06/10(木) 10:03:27 ID:???
記号などって…w
例えばどの文字なのか、いくつか挙げるってのを何故しないの?

DB/テーブルの文字コード設定を調べておくってことを
「質問させてください」の前にやってないの?

そういやMySQLのバージョンすら分からんな。
983NAME IS NULL:2010/06/10(木) 14:45:20 ID:3agFnNQw
みなさん、どこまで正規化します?
正規化してテーブル分けすぎて後から結合する時に困ります・・。
かといって1つのテーブルで管理すると、レコードが多くなりすぎるし。
984NAME IS NULL:2010/06/10(木) 14:51:51 ID:???
正規化って何なのかよくワカンナイ
同じデータが重複しないようにしたりするだけ、1つのテーブルで管理とか逆にどうやってるのか分からない
正規化もワカンナイ
985NAME IS NULL:2010/06/10(木) 15:03:32 ID:???
>>983
結合する時に困るってどう困るんだい?
986NAME IS NULL:2010/06/10(木) 16:23:57 ID:3agFnNQw
>>985
例えばECサイト用のDBを構築してレポート表示したい時、

注文レポート、売上げレポート、アクセスレポート

と、3つの用途に関するレポートをテーブル分けしているとします。
これを表示する時、商品IDで結合するわけですが、
物凄くSQL文が長くなり、パフォーマンスに影響が出ないか懸念しています。
テストで、10レコード程度入れて試している分には速いのですが・・。
987NAME IS NULL:2010/06/10(木) 16:28:09 ID:???
>>986
ハードウェアのスペック挙げれば解決できるからいいんじゃないの。
俺の場合、データを重複させないようにした方が、二時利用に役立つから極力してるよ。
988NAME IS NULL:2010/06/10(木) 16:31:35 ID:3agFnNQw
>>987
そうですね。SQL文が長くなる=プログラム側の問題は考えないようにします。
989NAME IS NULL:2010/06/10(木) 16:55:58 ID:???
>>988
SQL文が長くなってしまってメンテが大変になる場合は、
ある程度区切って結合させてデータを取得し、プログラム側で結合させる事もある。

ま、いろいろ方法はあるよね。
990NAME IS NULL:2010/06/10(木) 19:09:09 ID:???
>>987
ハードに逃げるのは馬鹿のやること。
厳しい事を言うが設計がおかしいと考えるべき。
991NAME IS NULL:2010/06/10(木) 19:35:56 ID:???
3テーブルを結合したくらいで"ものすごく"SQLが長くなるってのがイメージ付かないんだけど?

それにSQLの長さ自体はパフォーマンスには関係ない。
商品IDは主キーなりインデックス張ってあるなりしてるだろうけど、インデックスを使っている限りはDBというものは極めて高速に動く。

データ数が1テーブル10万〜100万オーダー超になるとどうしても遅くなるので、
そういった場合は最後の手段としてハードウェアのスペックを上げる。

3テーブルJOINを使うとメンテ出来ないって?さっさと別業種に転職しろw
992NAME IS NULL:2010/06/10(木) 19:58:03 ID:???
メンテ出来ないって誰が書いてるの?
993NAME IS NULL:2010/06/10(木) 20:17:15 ID:???
「長い」という基準の違いでしょう
994NAME IS NULL:2010/06/10(木) 21:39:21 ID:???
>物凄くSQL文が長くなり、パフォーマンスに影響が出ないか懸念しています。

奇妙な考えだなぁ。
995NAME IS NULL:2010/06/10(木) 22:06:07 ID:???
10KB程度のSQLはよくあること
996NAME IS NULL:2010/06/10(木) 22:25:18 ID:???
どうせDBの実行所要時間なんて殆どがディスクアクセスでしょ。
いくら長いSQL文たって、そのパースにかかる時間の割合なんぞたかが知れてるんじゃないの。
997NAME IS NULL:2010/06/10(木) 23:02:38 ID:???
いろいろとパスワードを設置できるみたいですが、
mysqlにログインする時のパスワードと、databaseにログインする時のパスワードは別なんですか?
998NAME IS NULL:2010/06/10(木) 23:54:41 ID:???
パスワードはユーザに設定してるもんだよ。
だから、DBにそのユーザが含まれていたら同じ。
999NAME IS NULL:2010/06/11(金) 10:35:04 ID:???

毎日毎日、10万件ものデータいつどうやって作ってるのか、そっちのほうが気になるよ。
1000NAME IS NULL:2010/06/11(金) 13:53:37 ID:???
普通にサイト運営してたらログとして溜まるだろうが
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。