NAME IS NULL<><>2011/11/27(日) 23:04:42.56 ID:Ay1cbXrU<> 質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
<>【MySQL】下らねぇ質問はID出して書き込みやがれ 2
NAME IS NULL<><>2011/11/27(日) 23:05:39.68 ID:Ay1cbXrU<> テンプレは随時追加予定 <>
NAME IS NULL<>sage<>2011/11/27(日) 23:24:48.96 ID:???<> 1乙 <>
NAME IS NULL<>sage<>2011/11/28(月) 02:52:03.45 ID:???<> 前スレくらい貼れよ <>
NAME IS NULL<>age<>2011/11/28(月) 22:07:46.51 ID:???<> 多分前レスなんてないんだろうな
スレたてした1の事情は分かった気がする <>
NAME IS NULL<><>2011/11/29(火) 02:45:09.49 ID:wzk/DA6j<> >>5
分かってもらえてよかったです。
多分、思ってる通りだと思いますw <>
NAME IS NULL<><>2011/12/02(金) 16:03:42.01 ID:vO+2Qk5j<> で、質問していいのか? <>
NAME IS NULL<><>2011/12/05(月) 02:05:37.05 ID:fY4mGBIH<> PHPスレのパクリ? <>
NAME IS NULL<>sage<>2011/12/05(月) 02:08:07.40 ID:???<> もう一つのMySQLスレが荒れて機能してないからな
パクリってか避難ってことでいんじゃね? <>
NAME IS NULL<>sage<>2011/12/06(火) 12:58:14.26 ID:???<> おっさんをここに誘導して来るよ <>
NAME IS NULL<>sage<>2011/12/06(火) 17:04:21.54 ID:???<> SNSの個人設定で、以下のような日記の公開範囲設定があります。
※「○月○日の日記を公開するかどうか」ではなく、そのユーザーの日記全体の設定です。
5.インターネット全体に公開
4.SNSユーザー全員に公開
3.友達の友達にまで公開
2.友達にだけ公開
1.非公開
ここで、特定のサイト訪問者が閲覧できる日記だけを、記事単位で最新10件分取得したい場合、
どのようなSQLを書くのがスマートでしょうか。
いまは、最初に上記の公開範囲テーブルから「閲覧できるユーザーID」を全取得して、
日記を select するときに where user_id in(1,2,3,5,6,8,9,10,11,13,...) などとやってて、
パフォーマンスがだいぶ悪いです。
そこで、手段を変えて、次のようにひとつのクエリで取得しようとしたら、もっと悪化しました。
where
(private.diary = 5) or
(private.diary = 4 and ログインしてるかどうか) or
(private.diary = 3 and 友達の友達かどうかのサブクエリ) or
(private.diary = 2 and 友達かどうか) or
(private.diary = 1 and 自分かどうか) <>
NAME IS NULL<>sage<>2011/12/06(火) 17:53:42.54 ID:???<> >>11
日記なら、更新頻度そんなに高くないだろうからキャッシュしちゃえば?
10〜20分しても問題ないと思うけど <>
NAME IS NULL<><>2011/12/11(日) 12:24:38.37 ID:55w2N/S/<> 検索エンジンGoogleで「インターネットテレビ 朝鮮総連 少頭劣一族 マイクロソフト社(又は経済産業省等気になる省やインターネットや原発、地震 波動砲)」を検索。
警察と自衛隊の武器は少頭劣一族が奪い、朝鮮に送ったらしい。知能障害以前の頭が悪い家族達。「工作員」の意味を知らない「工作員」家族。 <>
NAME IS NULL<><>2011/12/11(日) 16:11:53.90 ID:2BDdxjrX<> 「俺の全文検索」のソースをアップロードした。
http://www.ne.jp/asahi/sun/patagonia/fulltext/fulltext.html
うまく全文検索できないときには掲示板に書きこんでくれ。 <>
NAME IS NULL<><>2011/12/16(金) 17:54:11.04 ID:eaA3R1cS<> 宣伝乙 <>
NAME IS NULL<><>2011/12/16(金) 18:51:36.19 ID:3uhL2NBa<> w <>
NAME IS NULL<><>2011/12/19(月) 03:50:24.37 ID:84V7mD2V<> VMwareにubuntuをインストールし、そこでmysql 5.1.58使ってます。
ホスト側スペック:win7 / i7:3.4GHz / memory:16GB
ゲスト側スペック:ubuntu 11.10 / CPU core: 4cores / memory:8GB
my.cnfは標準キャラクターセットをutf8に変更した以外には何もいじっていません。
この状態で、8000万レコードのデータ(カラム1(主キー): bigint / カラム2: double)を
200万レコードづつ40分割し、load local infileを用いて下記のテーブルに入れたところ、読み込みに40時間かかりました。
create table ExpRecord(
__ID bigint,
__frequency double,
__primary key(ID)
)
ENGINE=InnoDB
partition by hash(ID)
partitions 100;
少しでも高速化させたく、my.cnfのチューニングをしたいと考えています。
ネット上で適当に見つけたmy.cnfを使ったところ、テーブルへのデータの読み込みがさらに遅くなりました。
(既存のログファイルは削除しています)
また、チューニングについて書かれた複数のブログを参考に、標準のmy.cnfにInnoDB系の行を追加したところ、
今度はデータの登録そのものが出来なくなりました。
チューニングの方法や、ubuntu向けのmy.cnfのチューニングについて解説しているサイト、
DBのチューニングについて参考になるサイトなどありましたらご教示願います。
<>
NAME IS NULL<>sage<>2011/12/19(月) 05:59:30.71 ID:???<> >>17
100パーティションにしたらデフォルトのtable_open_cache = 64だと足りない。
1レコードINSERTするごとにopen/closeが走って悲惨なことになる。
パーティショニングをやめたほうがいいと思うけど、さしあたり
table_open_cache = 5000
innodb_buffer_pool_size = 4g
innodb_log_file_size = 512m
innodb_flush_log_at_trx_commit = 2
ぐらいでどう。
innodb_log_file_sizeを変更すると起動しなくなるがそこはググって。 <>
NAME IS NULL<><>2011/12/19(月) 14:31:10.85 ID:84V7mD2V<> >>18
ありがとうございます。今までは全く動かなかったのですが、
動くようになり、また速度も約2倍に向上しました。 <>
NAME IS NULL<>sage<>2011/12/20(火) 22:58:01.54 ID:???<> 質問です。
以下のようなSQLファイルを作成し、実行してみました。
---------------------------------
~$ cat hoge.sql
use test;
drop table if exists table_abc;
create table table_abc(id int primary key, name text, delete_flg int);
insert into table_abc values (1, 'aaa', NULL);
insert into table_abc values (2, 'bbb', 1);
insert into table_abc values (3, 'ccc', 0);
select * from test.table_abc where delete_flg != 1;
---------------------------------
結果は、以下のようになったのですが、delete_flg=NULLのレコードが返却されないのはなぜでしょうか。
~$ cat hoge.sql | mysql
---------------------------------
id name delete_flg
3 ccc 0
---------------------------------
<>
NAME IS NULL<><>2011/12/20(火) 23:31:18.07 ID:Xz45otf/<> 以下のようなDBがあります。
ID str time
3 123 102828
4 321 103020
5 123 103520
6 123 103530
ここで現在時刻(&time)を10:30:00としたとき
select from テーブル where time >$time
とすると実行結果は、ID4〜6を表示します。
これだと、strの中身(123)がかぶってしまっているとき、
最新の情報だけ抜き出すことはできますでしょうか。
理想の結果は、
ID4とID6が表示されることです。
どなたかわかる方よろしくお願い致します。 <>
NAME IS NULL<>sage<>2011/12/21(水) 00:41:10.81 ID:???<> >>21
group by と max
http://toro.2ch.net/test/read.cgi/db/1316769778/4
↑あたりが参考にならんかの?
<>
NAME IS NULL<><>2011/12/21(水) 01:09:28.76 ID:ygQiTYNs<> >>22
ありがとうございます。
無事やることはできました。
ただ、where time >$time
をどこにいれればよいのでしょうか。 <>
NAME IS NULL<>sage<>2011/12/21(水) 03:06:08.20 ID:???<> >>20
SQLの仕様。MySQL以外のDBMSでも同じ。
mysql> select * from table_abc where delete_flg != 1 or delete_flg is null;
+----+------+------------+
| id | name | delete_flg |
+----+------+------------+
| 1 | aaa | NULL |
| 3 | ccc | 0 |
+----+------+------------+
2 rows in set (0.00 sec)
このへん参照
http://www.geocities.jp/mickindex/database/db_getout_null.html <>
NAME IS NULL<>sage<>2011/12/21(水) 15:42:33.18 ID:???<> >>22
正解
>>23
間違っています <>
>>20<>sage<>2011/12/22(木) 23:33:49.00 ID:???<> >>24
ありがとうございます。null撲滅委員会のページはとても参考になりました。
<>
NAME IS NULL<>sage<>2011/12/25(日) 19:45:00.35 ID:???<> ( ´Д`)y━・~~ <>
NAME IS NULL<><>2011/12/25(日) 20:36:41.52 ID:OXV1P/Ab<> ( ´,_ゝ`)プッ <>
NAME IS NULL<>sage<>2011/12/25(日) 20:43:11.37 ID:???<> ( ´Д`)y━・~~ <>
NAME IS NULL<>sage<>2011/12/27(火) 14:27:06.72 ID:???<> ( ´,_ゝ`)プッ <>
NAME IS NULL<>sage<>2011/12/27(火) 23:19:41.33 ID:???<> >>30
なんやお前、ここでもワシに喧嘩売る気か?( ´Д`)y━・~~ <>
NAME IS NULL<>sage<>2011/12/28(水) 16:19:05.75 ID:???<> ( ´Д`)y━・~~ <>
NAME IS NULL<>sage<>2011/12/28(水) 17:23:24.76 ID:???<> MySQL 総合スレは終了したの? <>
NAME IS NULL<>sage<>2011/12/28(水) 18:53:01.54 ID:???<> このスレ消費するか <>
NAME IS NULL<><>2011/12/28(水) 22:08:17.25 ID:b5+L0j52<> >>33
消滅したみたいやでw
>>34
どういう意味で使っとるんや?
まさか下手なワシの猿芝居しとるんちゃうやろな
( ´ー`)y-~~ <>
NAME IS NULL<>sage<>2011/12/28(水) 22:11:20.99 ID:???<> ( ´Д`)y━・~~ <>
NAME IS NULL<><>2011/12/28(水) 22:16:15.91 ID:b5+L0j52<> >>36
そういうつまらんレスせんでええから(爆笑)
そうやってワシの真似せーへんとなんも抵抗でけへんの?( ´ー`)y-~~
つくづく光線卒のIT下請けドカタはアホなんやなぁって思いました(爆笑) <>
NAME IS NULL<>sage<>2011/12/28(水) 22:18:54.55 ID:???<> ( ´,_ゝ`)プッ <>
NAME IS NULL<>sage<>2011/12/29(木) 01:15:34.28 ID:???<> 【再掲】
一月半ほど前
130 名前:NAME IS NULL[] 投稿日:2011/11/06(日) 10:09:44.37 ID:VrwJXmAE [1/10]
超初心者なんだが、SQLってなにに使うの?全くメリットが伝わらん。データベースでなにすんのさ?
Excelでいいよなきがしてならんのだが
現在
ワシが聞いたんは定性的に説明してみぃという問いかけやった、
http://toro.2ch.net/test/read.cgi/db/1318935267/
誘導します。本スレ立った模様です。こちらへどうぞ
http://toro.2ch.net/test/read.cgi/db/1325079058/
<>
NAME IS NULL<><>2011/12/29(木) 02:25:21.30 ID:bdP69J45<> >>38
池沼レス野郎がキタ━━━━━━━━m9( ゚∀゚)━━━━━━━━!!
お前はホンマド底辺の光線卒なんやなw
<>
NAME IS NULL<><>2011/12/29(木) 02:26:10.50 ID:bdP69J45<> >>39
お、できとるんかw
ほなちょっくら覗いてみるわ( ´ー`)y-~~
<>
NAME IS NULL<><>2011/12/29(木) 18:59:30.01 ID:uECZB68Q<> 予約語がカラム名に使われてるデータベースがあります。
以下のようにすると、参照できることはわかりました。
select * from table_name where 'show' like 'hoge';
ですが、これだと予約語ではないカラム名の場合検索できません。
select * from table_name where column_name like 'hoge';
で帰ってくる結果が
select * from table_name where 'column_name' like 'hoge';
では帰ってこなくなります。
どういうsql文ならカラム名が予約語、予約語ではない場合の両方で使えるでしょうか?
sql文はphpから発行しています。 <>
NAME IS NULL<>sage<>2011/12/29(木) 19:11:42.58 ID:???<> >>42
ここの連中は物事何も知らんから諦めとき( ´ー`)y-~~ <>
NAME IS NULL<>sage<>2011/12/29(木) 21:31:16.12 ID:???<> >>42
名前は、とにかくバッククオート(`hoge`)で囲んでおけば、
予約語だろうがそうで無かろうが使えるはずだけどね。
(クオート('hoge')ではない)
予約語でなければ囲まなくとも支障は無いが。 <>
NAME IS NULL<><>2011/12/31(土) 10:45:51.21 ID:vMkeFH30<> yyyyMMddHHmmssXXという形式の値を入れる、uniqueなカラムがあります。
yyyyMMddHHmmssはインサート時刻、XXは連番で00〜99です。
1秒間に100行までしかインサートできないという仕様です。
このテーブルにインサートするとき、XXの部分を決めるには
どういう処理が一般的でしょうか?
(テーブルはInnoDBです)
1.lock writeして、select count(*)で既存の行数を求める。
2.とりあえずXX=00でインサートして、unique違反になったらXX+=1してリトライ(成功するまでループ)
気になっているのは
1→パフォーマンス低下。万一のデッドロック。auto_commit=falseでトランザクションを
つかって、さらに他のテーブルも更新しているので、ロックとトランザクションの関係
がちょっと複雑。
2→このカラムに依存して値が決まるカラムBが存在するため、一度
インサートした後カラムBだけアップデートしなければならない。
実際は、1秒間にインサートするのはたいてい1回、最大で10回くらいと
想定しています。
ご意見をお聞かせいただければ幸いです。 <>
NAME IS NULL<>sage<>2011/12/31(土) 11:29:14.29 ID:???<> yyyyMMddHHmmss 部分はホストプログラムで生成してるのかな? <>
NAME IS NULL<>sage<>2011/12/31(土) 14:53:40.36 ID:???<> ホストプログラムを考えてましたが、DB生成でも大丈夫と思います。 <>
NAME IS NULL<>sage<>2011/12/31(土) 14:55:16.33 ID:???<> あ、でもやっぱりホストプログラムでお願いします。 <>
NAME IS NULL<>sage<>2011/12/31(土) 16:26:04.48 ID:???<> なら、
・YYYYからXXまで全部ホストプログラムで生成
・XX の部分は連番で
・秒が変わればゼロリセット(ホストプログラムでなら容易)
でいけそうに思えるんだが。
そういうことするプログラム(プロセス)が複数でないならばだけど。 <>
NAME IS NULL<>sage<>2012/01/01(日) 11:17:38.17 ID:???<> プロセスは複数なんです。PHPで。 <>
NAME IS NULL<>sage<>2012/01/01(日) 15:20:12.54 ID:???<> 秒が変わってもXXの連番が必ずしも00から始まらなくても良いなら、
採番テーブルから採番して、その番号を100で割った余りをXXとする。
どうしても00から始まって欲しいなら、採番テーブルにdatetimeのカラムを
設けて、それで秒替わりを検出したら番号をゼロとしてしまう。
<>
NAME IS NULL<>sage<>2012/01/01(日) 17:27:32.79 ID:???<> 秒間100件程度ならMyISAMで採番テーブル作るで何の問題もないよ。
アベンドしたときに番号の抜けを出したくないとかいうならInnoDBでもいいと思う。 <>
NAME IS NULL<>sage<>2012/01/01(日) 19:23:47.21 ID:???<> ホストプログラムが複数マシンで動いていて、システム時刻が
ずれていたりすると問題にならない? <>
NAME IS NULL<>sage<>2012/01/01(日) 21:21:46.71 ID:???<> 皆様,お助けください。p_blog というディスコンとなったcmsソフトを使い
続けています。
apache 2.2.17, php 5.3.5, mysql 5.1.57
というバージョンまでは「データベース全体のバックアップ・リストア」で
問題が生じたことはありませんでした(4系列から5系列への移行時を除く)
が,
apache 2.2.21, php 5.3.8, mysql 5.5.16
では,バックアップ・リストアは出来るものの,ブログ本文部分が「全く出
力されない」のです。ここだけ,ゴソッと抜け落ちてしまいます。ブログ本
文が収められているテーブルはちゃんとリストアされていますし,バック
アップ・リストアの際にもエラーは何一つ発生していません。文字コードは
全部UTF-8に統一してあり(status; で確認済み),php.ini, my.cnf の
設定も同じです。
何か,この不具合を解消するための,ヒントを頂戴できませんでしょうか?
<>
NAME IS NULL<>sage<>2012/01/02(月) 02:13:05.96 ID:???<> >>53
日時も採番用ホストのそれを使えばいいだけじゃんか。
<>
45<>sage<>2012/01/02(月) 08:10:17.79 ID:???<> 皆様ありがとうございます。
まとめると、採番テーブルでDBサーバの時刻を使ったほうが問題が
少ないということで、こんな感じですよね?
create table seq (
id int not null,
dt datetime
);
update seq set id=if(dt<now(),0,id+1),dt=(dt<now(),now(),dt); <>
NAME IS NULL<>sage<>2012/01/02(月) 08:49:01.83 ID:???<> create table seq (
id int not null,
dt datetime
) engine=MyISAM;
update seq set id = last_insert_id( if(dt<now(),0,id+1) ), dt = if(dt<now(),now(),dt);
select last_insert_id(), dt from seq; <>
NAME IS NULL<>sage<>2012/01/02(月) 17:44:52.55 ID:???<> それだとupdateとselectの間にdtが変わってるかもしれないからロック必要じゃね? <>
NAME IS NULL<><>2012/01/02(月) 23:16:17.38 ID:bfexwW1F<> phpで
$query = mysql_query("SELECT * FROM question_tb WHERE purchase_date >='$sdate' AND purchase_date <='$edate' AND star>=4 ORDER BY purchase_date");
これでpurchase_dateが$sdate以上、purchase_dateが$edate以下、star>=4
の3つの条件でmysqlで問い合わせできますが、
別の書き方、
$sql = 'SELECT question_id,purchase_date,purchase_price,star,
lang_php,lang_perl,lang_java,lang_cs,lang_cpp,lang_basic,
job,entry_date
FROM question_tb
WHERE purchase_date >= "' . $sdate . '"
AND purchase_date <= "' . $edate . '"';
ではどのようにstarが4以上を書くのですか?
<>
NAME IS NULL<>sage<>2012/01/03(火) 11:58:23.96 ID:???<> >>59
phpで質問したほうがいいっす
>AND purchase_date <= "' . $edate . '"';
AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date'
ヒアドキュメントにするとわかりやすい・・かも
BETWEENにするとわかりやすい・・かも
$sql = <<<EOT
SELECT question_id,purchase_date,purchase_price,star,
lang_php,lang_perl,lang_java,lang_cs,lang_cpp,lang_basic,
job,entry_date
FROM question_tb
WHERE purchase_date BETWEEN '{$sdate}' AND '{$edate}'
AND star >= 4
ORDER BY purchase_date
EOT;
<>
NAME IS NULL<>sage<>2012/01/03(火) 12:00:14.98 ID:???<> すまぬセミコロン抜け
AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date'
↓
AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date'; <>
NAME IS NULL<><>2012/01/03(火) 21:26:26.40 ID:v8hjRyik<> mysqlを使っていて、AとBというカラムがあって、基本的にはAでソートするのですが、
AがnullのときにBでソートするようにしたいのですが、どうしたらいいのでしょうか?
obder by A,Bにすると、Aがnullのものが先に出るようになります。
AがnullならBの値を使って、AとBを合わせたようなソートを行いたいです。
<>
NAME IS NULL<>sage<>2012/01/03(火) 22:14:55.82 ID:???<> >>62
ORDER BY IFNULL(A, B) は? <>
62<><>2012/01/04(水) 17:57:45.89 ID:k3MZr3nC<> >>63
ありがとうございます、解決しました。 <>
NAME IS NULL<><>2012/01/04(水) 19:03:27.48 ID:Y4FS6eZm<> ストアドの引数に配列渡すのってどうするのが良いんでしようか?
テンポラリテーブル作って渡してるのですが、どうにもすっきりしなくて。 <>
NAME IS NULL<>sage<>2012/01/05(木) 13:03:07.92 ID:???<> >>60
>>61
ありがとうございました。ヒアドキュメントの方が何故がエラーで
動きません <>
NAME IS NULL<><>2012/01/05(木) 15:53:31.06 ID:ktbGIpiI<> テキストをデータベースに格納する場合、普通にINSERTとかするとそのまま格納されると思います
これを圧縮して格納するような事は出来るのでしょうか?
もし出来るとしたら、どのような技術とか手法を行えばいいのでしょうか?
<>
NAME IS NULL<><>2012/01/05(木) 18:06:22.23 ID:krX1LSNT<> zip圧縮とかの事言ってんだったら、バイナリだからカラムはBlobでだとか? <>
NAME IS NULL<>sage<>2012/01/05(木) 19:24:21.17 ID:???<> 株取引のデータがcsv形式であって、これを検索したりして分析したいと思っているんですけど、
MySQLを使えばいいんでしょうか?
データベースは初めてなので初心者向きのがいいです。 <>
NAME IS NULL<>sage<>2012/01/05(木) 19:26:25.55 ID:???<> >>69
そうです。 <>
NAME IS NULL<>sage<>2012/01/05(木) 19:37:19.33 ID:???<> >>70
thx <>
NAME IS NULL<>sage<>2012/01/05(木) 19:52:06.35 ID:???<> >>69
MySQLで、銘柄情報テーブルやら株価テーブルやら作ってるyo <>
NAME IS NULL<><>2012/01/08(日) 13:49:21.05 ID:T7mS6gv8<> log
name buy inputdate
1.yamamoto 20 2011-12-8
2.takahashi 10 2011-12-7
3.yamamoto 10 2011-12-3
4.hayashi 5 2011-12-1
このようなテーブルがあった場合。
select from log where name ='yamamoto' group by DATE_FORMAT(inputdate,"%Y%M");
このとき最新のもの(1行目)を選んだり最古のもの(3行目)を選んだりできるようにしたいです。
要はgroupby で抽出される行を選択するということなのですが、
having byですと、group by抽出後のものに対する文みたいですし、
なにかいい方法はありますでしょうか?
<>
NAME IS NULL<>sage<>2012/01/08(日) 14:35:30.60 ID:???<> >>73
order by inputdate (desc) limit 1 じゃダメなの? <>
73<><>2012/01/08(日) 15:37:59.03 ID:T7mS6gv8<> >>74
ありがとうございます。
ですが、実際にはこのようなレコードが過去の月の分もあります。
そうなると、一行ではなくて、
結果は
yamamoto 20 2011-12
yamamoto 30 2011-11
yamamoto 5 2011-10
.
.
.
みたいに何月分も抽出したい感じなのです。
<>
NAME IS NULL<>sage<>2012/01/08(日) 16:54:31.91 ID:???<> >>75
Oracleの場合rank()関数を使ってやる内容。
MySQLの場合はユーザ変数を使ったrank()の再現をする。
かなりめんどくさいけどこんな感じ。
set @r := 0;
select * from
(select @r := @r + 1 rank, e2.* from
(select job, count(*) from emp group by job order by count(*)
) e2
) e3 where rank = 2;
<>
NAME IS NULL<><>2012/01/08(日) 17:27:07.28 ID:338XqApr<> 基礎からのMySQLという本を読んで、学習中です。
302ページのファイルエクスポートのところなのですが、
SELECT * INTO OUTFILE 'C:/data/out.csv' FIELDS TERMINATED BY ',' FROM tb1;
とすると
「Can't create/write to file 'C:\data\out.csv'(Errcode:2)」というエラーがでます。
これはパーミッションの問題ですか? Windows XPを使っています。 <>
NAME IS NULL<>sage<>2012/01/08(日) 17:47:00.02 ID:???<> >>77
perrorというコマンドでエラーの詳細が取れる。
> perror 2
OS error code 2: No such file or directory
Win32 error code 2: 指定されたファイルが見つかりません。
<>
77<><>2012/01/08(日) 17:59:35.92 ID:338XqApr<> >>78
perrorというのは、コマンドプロンプトでやるんですね。
いただいたヒントをもとにdataというフォルダーを作ってもう一度やってみたら
できました!ありがとうございました。
mysqlでファイルのエクスポートはできるけど、フォルダーの作成まではできないと
理解していいでしょうか? <>
NAME IS NULL<>sage<>2012/01/08(日) 19:03:01.43 ID:???<> そういう操作はしない。into outfile で同名のファイルが有ったら消すということをせずエラーで終了するし <>
NAME IS NULL<><>2012/01/08(日) 22:04:59.13 ID:J7RBkAVS<> うむ <>
77<><>2012/01/09(月) 08:27:51.19 ID:VlYtpvNh<> >>80-81
ありがとうございました。 <>
NAME IS NULL<><>2012/01/09(月) 14:09:44.88 ID:8po/85zC<> 安藤優子、木村太郎は、某プロパイダの社外取締役、かつ、安藤は、フジ社外の人間にもかかわらず、フジテレビジョンのM&Aの最中、フジのホワイトナ
イトの【親会社】の本業を無視して、「インターネットは虚業だ。具体性がない
。」というようなことをコメントしました。この虚業は、livedoorを指していた
としても、「同業者」であったということは、非常に、違和感を感じずには、い
られません。 <>
NAME IS NULL<>sage<>2012/01/12(木) 00:33:15.75 ID:???<> 原発の監視システムが止まった件
オラクルのせいにされてるぞ
http://www.ustream.tv/recorded/19694240 <>
NAME IS NULL<>sage<>2012/01/12(木) 11:34:57.83 ID:???<> 十数年前、オラクルの箱を見たとき書いてあったけどなぁ。
原発制御等、不調に見舞われるととても重篤な結果をもたらすことに使っちゃ駄目です
みたいなことを。 <>
NAME IS NULL<><>2012/01/17(火) 17:00:22.26 ID:CQkbdlKb<> CMS seezooのプログラムを解析してたら
$sql =
'SELECT '
. 'sz_blog_id, '
. 'entry_date '
.'FROM '
. 'sz_blog '
.'WHERE '
. 'entry_date >= ? '
.'AND '
. 'entry_date < ? '
.'AND '
. 'is_public = 1 '
;
というクエリがmodelに書きこまれてたのですが、
なぜ、こんなにも連結だらけにしてあるのかと、
クエリ中の?は何を意味するのでしょうか。 <>
NAME IS NULL<><>2012/01/17(火) 17:13:33.99 ID:CQkbdlKb<> クエリにあるクエスチョンの意味分かりました。
フレームワークcodeigniterの記述ルールみたいです。 <>
NAME IS NULL<>sage<>2012/01/18(水) 02:01:21.80 ID:???<> 連結が多いのは単に
そういうコーディングルールにしてるってだけだと思うよ <>
NAME IS NULL<><>2012/01/18(水) 15:01:17.12 ID:mSCIAkOx<> Mysqlにインデックスってあるじゃないですか。
あれって、たとえば京都市に住む男性の田中さんを検索しようとしたとき、
京都市の人口146万人からさがすところを
"性別"というカラムにインデックスがつけてあったら
京都市の男性人口70万人から
検索されてはやくなるということですか?
<>
NAME IS NULL<>sage<>2012/01/18(水) 15:28:07.50 ID:???<> >>89
性別ならそうだね
名前にインデックスをつければ、大雑把にいうと名前のあいうえお順で探してくれる
普通なら登録順に探す
本の後ろの索引みたいなものだね <>
NAME IS NULL<>sage<>2012/01/18(水) 15:31:12.87 ID:???<> >>90
>名前にインデックスをつければ、大雑把にいうと名前のあいうえお順で探してくれる
? <>
NAME IS NULL<>sage<>2012/01/18(水) 16:05:10.55 ID:???<> 性別はBTreeインデックスだと意味ないな。
使わないほうが速い。 <>
NAME IS NULL<>sage<>2012/01/18(水) 16:29:16.39 ID:???<> 「埼玉県の田中太郎さん(31)」を探すときに、
50音順版の名簿があれば「た」のあたりに目星を付けて探すだろ?
都道府県順版の名簿なら、埼玉県のあたりから探し始められる。
年齢順版の名簿なら、31歳に絞って探せる。
以下略 <>
NAME IS NULL<><>2012/01/18(水) 18:30:45.66 ID:mSCIAkOx<> >>93
よく聞く、ツリー式というのは、
31歳に絞る(年齢カラム) → 男性に絞る(性カラム) → 埼玉に絞る(地域カラム)
と、どんどん消去法みたいな感じで絞っていく感じですね。
容疑者の絞り込みみたいな感じですね。
死亡推定時刻はどうか → その時刻にいた人物は → その人物のアリバイは → <>
NAME IS NULL<>sage<>2012/01/18(水) 20:20:15.78 ID:???<> >>94
ちょっと違うかな
インデックスはカラムごとにつけるから名前のインデックスだったら一文字目、その一文字目に属する中で二文字目っていうツリーができて素早く検索できる <>
NAME IS NULL<><>2012/01/23(月) 09:53:13.19 ID:L93U36BH<> 現在 何万件とレコードのデータがあります。
データが復活できるよう、レコードを消す時は
DELETE ではなく、 表示フラグが false になるという処理をしてます。
やっぱ、このままいくと 重くなっていきますか?
<>
NAME IS NULL<>sage<>2012/01/23(月) 10:30:29.85 ID:???<> そらそうでしょ。 <>
NAME IS NULL<><>2012/01/23(月) 11:15:29.23 ID:L93U36BH<> >>97
そらそうですか・・・。
ということは、パフォーマンスをもとめるなら
SQLに残しておけるレコード数には限界があるということですね・・・。 <>
NAME IS NULL<>sage<>2012/01/23(月) 11:18:06.85 ID:???<> 1番軽いのはデータが0件の状態 <>
NAME IS NULL<><>2012/01/24(火) 20:32:06.55 ID:/we2kZhZ<> PHP+MySQLです。バージョンはおそらく最新
プレースホルダを使ってログインフォームを作成したいのですが、
参考になるサイトもしくは簡単なソースを教えてもらえないでしょうか。
できればピュアPHPでと考えています。
不可能なようならライブラリを使う方法でも一般的なものならOKです。
よろしくお願いします。 <>
NAME IS NULL<><>2012/01/25(水) 20:28:35.18 ID:RWRjtLgh<> 下のCの部分でそれぞれのA,Bを参照するにはどうすればいいですか?
INSERT INTO hoge (id, counter) values (1,A), (2,B) ON DUPLICATE KEY UPDATE counter=C <>
NAME IS NULL<>sage<>2012/01/25(水) 23:05:40.91 ID:???<> >>101
INSERT INTO hoge (id, counter) VALUES (1, 11), (2, 12)
ON DUPLICATE KEY UPDATE counter = VALUES(counter);
http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html <>
101<><>2012/01/25(水) 23:33:35.29 ID:RWRjtLgh<> >>102
ありがとうございます。VALUESを使うと元の値を参照してしまいませんか?
VALUS(counter)の部分で11,12を参照したいです。 <>
NAME IS NULL<>sage<>2012/01/26(木) 07:54:38.21 ID:???<> >>103
自分で試してから言ってる?
<>
NAME IS NULL<>sage<>2012/01/26(木) 08:00:06.62 ID:???<> >>101
無理 <>
101<><>2012/01/26(木) 15:58:13.43 ID:hYdeFFJe<> >>104
試してますよ。
>>105
ありがとうございます。諦めます。 <>
NAME IS NULL<>sage<>2012/01/26(木) 16:31:17.49 ID:???<> すみません、SQLの勉強初めてまもないもので、ヒントを教えてください。
テーブルA と テーブルB があって、構造は同じ。データの中身もほとんど同じ。
(でもちょっと違う) テーブルAにあって、テーブルBにないものを探すのは
JOINでつないで、そのあとどうしたらいいんでしょう? <>
107<><>2012/01/26(木) 16:34:14.28 ID:6n12af06<> あ、SQL文を教えてくださいというのではなくて、考え方の流れを教えていただけませんか。
よろしくお願いします。 <>
107<><>2012/01/26(木) 16:45:41.68 ID:6n12af06<> すみません、なんとなくヒントを思いついたので、質問取り下げます <>
NAME IS NULL<>sage<>2012/01/26(木) 23:08:26.92 ID:???<> 思いついたヒントを教えてください。 <>
NAME IS NULL<><>2012/01/27(金) 18:49:21.28 ID:53qgMtio<> mysqldumpでバックアップを取る際はロックが掛かってユーザーの操作を受け付けないのは分かるんですけど、リストアする際はsourceでダンプしたsql読み込む際にロックって掛かるんですか? <>
NAME IS NULL<>sage<>2012/01/27(金) 19:39:18.09 ID:???<> mysqldump のファイル見てみると
LOCK TABLES `xxx` WRITE
〜
UNLOCK TABLES;
とかあるけど <>
NAME IS NULL<><>2012/01/27(金) 20:36:45.38 ID:7IreXnDq<> >>112
なるほど〜
mysqldump取る時にすでにロックとアンロック掛けてsqlへ書き出しているからファイルからsql流し込む際も同様の処理しているので問題ないって事ですね…
ありがとうございます、納得しました <>
NAME IS NULL<>sage<>2012/01/27(金) 23:22:35.76 ID:???<> クエリログを出力させようとmy.iniファイルの[mysqld]以下にlog=/var/log/query.log
と書いてMySQLを再起動し、DBに接続してSQLを実行したのですが、ログが出力されません。
何が原因か教えて頂けないでしょうか?よろしくお願いします。 <>
NAME IS NULL<>sage<>2012/01/28(土) 08:45:10.45 ID:???<> >>114
Linuxならmy.iniじゃなくてmy.cnf
Windowsなら/var/log/query/logじゃなくてC:\...\query.log <>
NAME IS NULL<>sage<>2012/01/28(土) 10:23:11.60 ID:???<> Macならどうしよう? <>
NAME IS NULL<><>2012/02/01(水) 18:30:23.94 ID:1T51RBbY<> 単純なcsv形式の数値データをデータベースに格納したいのですが
列数が固定されていない場合に上手く処理する方法ってあるでしょうか?
5×5型のデータが来たり4×8型のデータが来たりするというわけです…
列の最大値はあると仮定してもよいです
1列分のデータをシリアライズしてしまうか
列の最大値でテーブルを作ってそこにインサートしてしまう(余ってるカラムは空とする)
ということくらいしか思いつきませんが
もっと上手い方法があれば教えてください
よろしくおねがいします <>
NAME IS NULL<>sage<>2012/02/01(水) 18:39:31.02 ID:???<> splitで切れば配列に入るので、それをinsertすればいいんじゃね
不足分はnullになるね <>
NAME IS NULL<>sage<>2012/02/01(水) 20:26:24.11 ID:???<> CSVストレージエンジンって無かったか?
足りない分はnull可ってしときゃ直接マウント(?)できるかも。
やったことないから保証はしないけど。 <>
NAME IS NULL<><>2012/02/01(水) 22:51:55.59 ID:1T51RBbY<> やはり列数の最大値でテーブルを作っておいて
列数が少ないものも埋め込むようにするしかないですかね…
ちなみに中身がnullの場合と値が入っている場合とでは
ディスク容量は違うのでしょうか?
例えば整数型の10列のテーブルを作ったとして、そこに
10列分のデータをインサートするのと5列分のデータを
インサート(残り5列はnull)するのとで、使用する容量の
大きさに差は出るのでしょうか? <>
NAME IS NULL<>sage<>2012/02/02(木) 00:16:32.13 ID:???<> >>120
http://dev.mysql.com/doc/refman/5.5/en/innodb-physical-record.html
In a fixed-length column, it reserves the fixed length of the column
in the data part of the record. <>
NAME IS NULL<><>2012/02/04(土) 10:02:58.62 ID:/5uKnF5u<> 別スレで聞いていたのですがどうやら原因がMySQL側にあるようなのでこちらで質問させて頂きます
RoRを利用したSNSを作っており
サイトを高速化しようと
keybufferを16MBから500MBに増やしてみました
すると、MYSQLの応答がめちゃくちゃ遅くなりサイトの読み込みが20秒近くかかるようになってしまいました(元は1秒程度)
慌てて元に戻したのですが設定を戻しても重さが戻らず
sudo server mysql stop
コマンドで数分待たされ
sudo service mysql startコマンドで動くまで10分かかるようなレベルです
レコード数は全部で5万程度なのでそんなに重くなるようなことはないはずです
別のサーバーにデータとプログラムを置き換えたら元の速度で動きます
元の速度に戻すにはどうすればいいでしょうか
ログ等も読んでみたのですが特に問題は出ておらず困り切っております
現在のmy.confです
http://memopa.applest.net/d/242222b13250eca7d
よろしくお願いします…… <>
NAME IS NULL<>sage<>2012/02/04(土) 11:48:56.83 ID:???<> >>122
メモリを増やしすぎてスワップ起こしてるんじゃないの。
vmstatでswpd、si、soを確認して、
swpdが大きすぎたらいったんOS再起動してみたら。
MyISAMのkey_buffer_sizeはインデックスしか格納しなくて、
テーブルのデータはOSのページキャッシュに頼る仕組み。
なので、key_buffer_size:freeコマンドのcachedを3:7ぐらいか
それ以上に保っておく必要がある。
thread_cache_size = 500はでかすぎ。3桁は初めて見た。
table_cache = 100は少なすぎ(max_connections×よくアクセスするテーブル数) <>
NAME IS NULL<>sage<>2012/02/04(土) 11:57:02.21 ID:???<> >>123
>メモリを増やしすぎてスワップ起こしてる
? <>
NAME IS NULL<><>2012/02/04(土) 16:01:23.42 ID:/5uKnF5u<> >>123
どうやら大きく勘違いしていたようです
ありがとうございます
めちゃくちゃswapあばばばばな感じになってました
かなりましにはなりましたが結構遅い
PHPMYadminで赤いところを見ると
Innodb_buffer_pool_reads 526 InnoDB がバッファプールの内容を利用できず、シングルページ読み込みを行わなければならなかった論理読み込みの回数
Handler_read_rnd_next 86 G データファイルの次の行を読み込んだリクエストの数。この値が高いのはテーブルスキャンを大量に実行しているためです。一般にこれはテーブルのインデックスが不適切か、クエリがインデックスを利用するように書かれていないことを意味します
Created_tmp_disk_tables 1,598 k ステートメント実行中にサーバがディスク上に自動生成した一時テーブル数。Created_tmp_disk_tables の値が大きい場合は tmp_table_size の値を増やしてディスク上ではなくメモリ上に一時テーブルを構築した方がよいかもしれません
Opened_tables 414 開いているテーブルの数。開いているテーブルが多い場合はおそらくテーブルキャッシュの値が小さすぎます
こんな感じです。適切なインデックスを貼れば改善しそうなのですが、何か参考になるサイトなどはありませんか?
探してみたもののいまいちよくわからなくて…… <>
NAME IS NULL<>sage<>2012/02/04(土) 16:17:33.93 ID:???<> >>125
問題児を見つけるには スロークエリログ
問題児を更生させるヒントは EXPLAIN構文 <>
NAME IS NULL<>sage<>2012/02/04(土) 19:51:20.53 ID:???<> >>125
残念ながら断片的な情報しか載せていないサイトがほとんどで、
インデックスの張り方を懇切丁寧に説明しているのは見たことない。
本を買いましょう。
http://www.amazon.co.jp/dp/4873114268
電子書籍版もあるよ。
http://www.oreilly.co.jp/books/9784873114262/ <>
NAME IS NULL<>sage<>2012/02/04(土) 20:55:09.52 ID:???<> >>125
奥野さんの「漢のコンピュータ道」のブログを隅から隅までよんでみれば <>
NAME IS NULL<>sage<>2012/02/07(火) 16:30:52.85 ID:???<> データベースについてですが
レコードの保存する時最大文字数を1000文字と指定したとき文字コードがUTF-8の場合
aaaだと2バイト分の容量で、ああああ・・・×1000だと30000バイト分のなのでしょうか?
それとも両方とも 可変長テキストみたいに3000バイトになっちゃうんでしょうか? <>
NAME IS NULL<><>2012/02/07(火) 16:31:09.67 ID:+k1oH0oq<> ID出すの忘れてました・・・。 <>
NAME IS NULL<>sage<>2012/02/08(水) 05:03:57.91 ID:???<> >>129
> aaaだと2バイト分の容量で、ああああ・・・×1000だと30000バイト分のなのでしょうか?
どういう計算で2バイト、30000バイトと思ったんだ?
aaaだと3バイト分、ああああ…×1000だと3000バイト分
> それとも両方とも 可変長テキストみたいに
固定長テキストって言いたいのか?
<>
NAME IS NULL<>sage<>2012/02/08(水) 05:10:42.80 ID:???<> >>131
>ああああ…×1000
2000じゃね? <>
NAME IS NULL<>sage<>2012/02/08(水) 09:00:20.59 ID:???<> >>132
utf8は、1文字3バイト。
今は4バイト版も追加されたんだっけ。
<>
NAME IS NULL<>sage<>2012/02/08(水) 17:55:08.69 ID:???<> > それとも両方とも 可変長テキストみたいに3000バイトになっちゃうんでしょうか?
節子!それ可変長やない!固定長や! <>
NAME IS NULL<>sage<>2012/02/08(水) 17:59:58.99 ID:???<> 色々頭ぶっとんでんな
まず最初にaaaで2バイトとかaの数数え間違えてるし
その後更に1000文字で30000って0一個多く間違えてるし <>
NAME IS NULL<><>2012/02/08(水) 23:05:56.37 ID:II3A4M+D<> 科目テーブル
100 現金
110 普通預金
500 売掛金
600 売上
売上テーブル
日付 借方cd 貸方cd 金額
2/8 500 600 1200
2/9 110 500 1200
みたいなテーブルがあって、これを下記のように書きたいです。
日付 借方 貸方 金額
2/8 売掛金 売上 1200
2/9 普通預金 売掛金 1200
SELECT 日付,科目,科目,金額 FROM 科目テーブル JOIN 売上テーブル ON 科目.code = 売上.code
みたいに書いてみたのですが、うまくいきません。どうしたらいいですか? <>
136<><>2012/02/09(木) 09:20:09.27 ID:5QaaUiXg<> あのー、どなたか、ググるヒントだけでも、お願いできませんか?
やりたいことは、借方コードも貸方コードも、同じ科目テーブルのコード番号から検索して
科目名を表示したいんです。
JOINの条件を 借方コード = 科目テーブルのコード にしてしまうと
貸方コードの分はどうしたらいいのか?よくわからないんです。
それともそもそも JOINでテーブルをくっつけるのが間違ってるんでしょうか。 <>
NAME IS NULL<>sage<>2012/02/09(木) 09:31:47.01 ID:???<> 2回検索すればいいでそ <>
NAME IS NULL<>sage<>2012/02/09(木) 09:35:59.15 ID:???<> 科目コードと金額は台帳にあって、
科目名だけを表示したいと想像。
名称取得ファンクション作ればいいんでね? <>
NAME IS NULL<>sage<>2012/02/09(木) 10:02:39.75 ID:???<> >>136
SELECT tu.日付, tkb.名称, tkl.名称, tu.金額
FROM
売上テーブル AS tu,
科目テーブル AS tkl,
科目テーブル AS tkb
WHERE
tu.借方cd = tkb.コード
AND tu.貸方cd = tkl.コード
みたいなことしたらどうなる? <>
136<><>2012/02/09(木) 10:15:11.94 ID:iEIkh6k3<> ありがとうございました!できそうな気がしてきました。
>>140さん方式でやってみます。 <>
NAME IS NULL<>sage<>2012/02/09(木) 10:41:57.84 ID:???<> >>140
MySQLでオラクル方言使えたのか・・・ <>
NAME IS NULL<>sage<>2012/02/10(金) 08:43:27.10 ID:???<> >>136
もしかしてLEFT OUTER JOINか?
ただのJOINてあんまり使えん。
>>142
ちなみにどこが方言?
<>
NAME IS NULL<><>2012/02/10(金) 10:00:39.34 ID:LT2qfOA+<> >>143
>ちなみにどこが方言?
みたいなことしたらどうなる? → みたいなことしたらどうなりますか? <>
NAME IS NULL<><>2012/02/12(日) 18:25:12.15 ID:IFW6F+Ws<> 実践ハイパフォーマンスMySQL89ページに
「'hello'という値を格納するには、VARCHAR(5)型とVARCHAR(200)型の列で同じ量の記憶域が必要となる。もっと短い列を使用するメリットはあるだろうか。」
という文がありますが、意味がわかりません。
・いずれも5バイトを使用する
・いずれも200バイトを使用する
の2通りの解釈ができますが、それ以前のページでVARCHAR型は「必要な記憶域しか使用しない」と明言されているので、前者ですよね?
すると「もっと短い列を使用するメリットはあるだろうか。」とはどういう意味なのでしょう?
'hello'という値を格納するにはVARCHAR(5)より短い列にできないため、意味がわかりません。
何が言いたい分なのか、誰か通訳してください。 <>
NAME IS NULL<>sage<>2012/02/12(日) 18:53:26.01 ID:???<> 通訳しろというなら訳文じゃなくて原文を書け。 <>
NAME IS NULL<><>2012/02/12(日) 18:55:41.66 ID:Kj1j50wQ<> >>146
>>145さんは本を読んでいてわからないことがあったそうです <>
NAME IS NULL<>sage<>2012/02/12(日) 19:17:13.81 ID:???<> >>145
mysqlのページサイズは8KB固定だから。
レコードサイズが8KB以下であっても8KBは必ずアサインされる。 <>
NAME IS NULL<>sage<>2012/02/12(日) 19:19:52.56 ID:???<> >>148
ページサイズじゃなかったブロックサイズだった <>
NAME IS NULL<>sage<>2012/02/12(日) 19:23:53.27 ID:???<> ページサイズは16KBだな <>
NAME IS NULL<><>2012/02/13(月) 11:56:52.58 ID:KA0CffTr<> ディスク上は必ず1レコード8KB食うってこと? <>
NAME IS NULL<>sage<>2012/02/13(月) 12:42:36.09 ID:???<> 質問させて下さい。
select * from Table order by Hoge desc
上記の場合、Hoge列内の文字列を降順で抽出しますが
Hoge内の特定の文字列のみ、最後に回したい場合はどのようにすればよろしいでしょうか。
質問の仕方がおかしかったらスミマセン。
<>
NAME IS NULL<><>2012/02/13(月) 12:43:02.07 ID:fxRwCTZt<> ID出し忘れました。
質問させて下さい。
select * from Table order by Hoge desc
上記の場合、Hoge列内の文字列を降順で抽出しますが
Hoge内の特定の文字列のみ、最後に回したい場合はどのようにすればよろしいでしょうか。
質問の仕方がおかしかったらスミマセン。
<>
sage<><>2012/02/13(月) 15:24:48.60 ID:jkZdWzV4<> >>153
最後に回したい場合
select * from Table order by FIELD(Hoge,'最後に回したい文字列') ASC,Hoge
最初に回したい場合
select * from Table order by FIELD(Hoge,'最初に回したい文字列') DESC,Hoge <>
NAME IS NULL<>sage<>2012/02/13(月) 16:11:27.83 ID:???<> >>154
ありがとうございます。
試してみます。 <>
NAME IS NULL<><>2012/02/14(火) 00:36:53.29 ID:1BB5/ldP<> 直接MYSQLというわけではないのですが
WebアプリでMYSQLサーバーを使う場合
プログラムの処理でしょっちゅうCPU100%になる、メモリ4GB(Mysqlが使えるのは1GB程度)のサーバー
に同居させるか
MYsql専用で使えるメモリ512MBのサーバー
にMYSQL専用サーバーとして置くか
勿論一概には言えないと思いますがどっちの方が全体として考えた時にパフォーマンスがあがりますか?
メモリが多いほうがいいのかと思い上のサーバーに同居させたところプログラムの重さに引きずられてか
単純なSelectで数秒かかったり(普段は*ms)することがありまして……
<>
NAME IS NULL<>sage<>2012/02/15(水) 09:58:59.94 ID:???<> 最初はoracleを使ってみようと思ったんですが、64bit vistaには対応していないらしいので
mysqlに変えようかと思うのですが、mysqlと64bit vistaでは現在普通に動くのでしょうか?
それとも何かしらインストール時に別途作業が発生するのでしょうか? <>
NAME IS NULL<>sage<>2012/02/15(水) 17:37:51.50 ID:???<> win7 home 64ビット + Excel2010(32ビット) で動かしてますが <>
NAME IS NULL<><>2012/02/16(木) 19:44:30.33 ID:puLrBsPX<> エクセルファイルがあってカンマ区切りのCSVファイルに変換
⇒文字コードをUTF8へ変換
⇒MysqlへCSVファイルをインポートすると特定の行がズレてしまいます。
"商品名",”商品コード”,"価格","卸価格"のカラムがあったとして、
"商品A","a001","1000","800"
"商品B","b002","0","0"
"shohinC","shohinC","500","200"
・・・というファイルをインポートすると、
"商品A","a001","1000","800"
"商品B","b002","0","NULL"
"shohinC","500","200","NULL"
・・・という風に同じ内容が続いていると、その部分がすっぽり抜けて左へズレてしまうのです。
初歩的なことかもしれませんが、お助けくださいませ・・・ <>
NAME IS NULL<><>2012/02/17(金) 11:12:38.92 ID:alZZJL4J<> 会員登録されたユーザーのレコードがあります。
ユーザーの年齢とか、プロフィールとかはカラム化されています。
そこに、ユーザー個々がユーザー画面や、細かなセッティングができる
オプション状態を記録するカラムを足そうとおもうのですが、
一個一個、
| userPage_color | userFont_size | userCss_URL |
みたいにカラムを作るか、
一つの
| userOption |
というカラムに、
Page_color,#FF8899,
Font_size,12px,
userCss_URL,http://xxx.com/css/index.css
・
・
・
と、CSV的なものテキストデータとして入れるか
どちらのほうが、後々、管理やシステム変更をしやすいでしょうか? <>
NAME IS NULL<>sage<>2012/02/17(金) 12:22:58.32 ID:???<> ユーザオプションが、予想されうる未来において項目不変なら、前者にするかも。
変わり得るなら、
オプション項目マスタ
項目ID 項目名称
1 ページカラー
2 フォントサイズ
3 CSSのURL
ユーザオプション
ユーザID 項目ID 値(文字列) 値(数値)
値はnull可
とかするかな? (つまりカラムを足すのではなく、別テーブルを作る) <>
NAME IS NULL<>sage<>2012/02/17(金) 13:50:40.73 ID:???<> >>159
手元の5.5.20では再現しなかった。
mysql> load data local infile 'test.csv' into table t1 fields terminated by ',';
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+---------+---------+------+------+
| c1 | c2 | c3 | c4 |
+---------+---------+------+------+
| 商品A | a001 | 1000 | 800 |
| 商品B | b002 | 0 | 0 |
| shohinC | shohinC | 500 | 200 |
+---------+---------+------+------+
3 rows in set (0.00 sec) <>
NAME IS NULL<><>2012/02/18(土) 04:26:13.17 ID:Y+cJ8ys3<> 複数のカラムを一括で空にしたいので、
「 UPDATE table SET `value1' = null , `value2` = null , `value3`・・・・・」
という文を作りたいのですが、一つ一つに=nullを指定するのではなく、(カラム群)=nullのようにまとめて扱う方法はないでしょうか。
PHPでいうarray(val1 , val2)のような感じで。 <>
NAME IS NULL<>sage<>2012/02/18(土) 06:12:14.75 ID:???<> >>163
ないと思う。 <>
NAME IS NULL<>sage<>2012/02/18(土) 11:53:16.79 ID:???<> >>164
そうですかあ・・どうもです <>
NAME IS NULL<>sage<>2012/02/19(日) 07:31:05.02 ID:???<> 「探検ドリランド」 で増殖技がバレてレアカード複製祭り発生中wwwwww
http://jin115.com/archives/51849925.html
>カード増殖裏技
>必要なもの 携帯もしくはPCを二台 gleeアカウント二つ
>二台の機器でそれぞれのgleeアカウントでログインしてドリランド起動後お互いでトレードさせる
>トレード(受け取りはしない)が終わったら片方の機器はログアウトして二つの機器のアカウントを同じにする
>それぞれトレード品受け取り画面にして受け取るボタン同時押し
これどう思いますか?
自分はちょっと信じ難いのですが…
トランザクションするか、してなくてもユニークID割り当ててれば複製なんて出来ないと思うのですが
<>
NAME IS NULL<><>2012/02/19(日) 10:25:33.19 ID:SgHncMDX<> 質問させてください
構造のみでデータが空のテーブルAと、中身の入ってるテーブルBがあります。
Bに入っているID(プライマリ)をAのb_idというカラムにピーコしたいのですが、SQL文はどんなもんになるでしょうか。
よろしくお願いします。 <>
NAME IS NULL<><>2012/02/19(日) 10:27:52.77 ID:M7DDJUDu<> insert into a(b_id)
select id from B;
かな <>
NAME IS NULL<>sage<>2012/02/19(日) 10:46:16.77 ID:???<> >>168
一発回答あざっす!バッチリでした。
http://www.amazon.co.jp/dp/4774138355/
「SQLポケットリファレンス」
この辺り買ってみようかな。
入門書だけだといまいち解決しなくって。 <>
NAME IS NULL<>sage<>2012/02/19(日) 11:15:43.98 ID:???<> 一冊ちゃんとした本を買うのに異論は無いが、今回程度のは、
mysql insert 他テーブルから
でぐぐれば、MySQLのマニュアルも勝手解説ページも、いくらでも見られるよ。 <>
NAME IS NULL<>sage<>2012/02/19(日) 11:44:44.04 ID:???<> >>170
上二つほど紫でございました。
>INSERT ... SELECT 形式の INSERT では、
>別の 1 つまたは複数のテーブルから選択されたレコードが挿入されます。
重要なのはここですかね。
最初に見たときはどこを読めばいいのかが分からなくて諦めてしまいました。
足りないのは参考書でもgoogleの性能でもなく、文章を理解する能力のようで。。。お恥ずかしい <>
NAME IS NULL<>sage<>2012/02/19(日) 12:56:49.12 ID:???<> GUIでテーブルの中にデータ突っ込むとインサート文を発行してくれるようなツールって無いでしょうか?
現在eclipseのERMaster使ってるんですが、このツールだとデータの作成の時に直接DBに突っ込めないのと、桁数チェックとかやってくれないのが不満です。
テストデータの作成に特化しているようなツールが有れば紹介してください。 <>
172<><>2012/02/19(日) 12:59:18.26 ID:2Z0oxaKz<> ID表示はこれで出来るかな?? <>
NAME IS NULL<>sage<>2012/02/19(日) 21:40:54.76 ID:???<> >>172
好きなツールでデータ突っ込んでからmysqldumpすればいいんじゃね <>
NAME IS NULL<><>2012/02/20(月) 03:44:47.77 ID:bm2ewz8N<> GREEのドリランドというゲームでアイテム複製バグ祭りが発生してますが
あれだけでかいサービスになると、テーブル分割かサーバー分割とかしてると思うので
そういった場合でもトランザクションてできるもんなんでしょうか?
仮にMySQL5.5でINNODB使ってるとして、
・テーブルがパーティショニングで分割されている
・テーブルが別DB(別サーバー)に分割されている
それぞれの場合でトランザクションできるか・する方法を教えてください <>
NAME IS NULL<><>2012/02/21(火) 00:12:17.84 ID:KD0gxEQf<> そんなに誰も答えられないほど難問なのか? <>
NAME IS NULL<>sage<>2012/02/21(火) 03:03:23.04 ID:???<> >>175
そういう要件のためにXAがある。MySQLで実際に使ってるのは見たことないけど
http://dev.mysql.com/doc/refman/5.1/ja/xa.html <>
NAME IS NULL<>sage<>2012/02/21(火) 07:56:39.52 ID:???<> >>175
まず、InnoDBの場合、XAはSQLレイヤーとInnoDBの間での2フェーズコミットに使います。
で、回答ですが
>・テーブルが別DB(別サーバー)に分割されている
たぶんコレには使っていないと思いますが…
中の人じゃないのでわからん
テーブルパーティショニングはXA関係ないんじゃね?と思っていた。
だれか補足
<>
NAME IS NULL<>sage<>2012/02/21(火) 09:04:38.39 ID:???<> Aというユーザーでテンポラリテーブルを
create temporary table tmp(id int(4));
作り、Aでまた別に
MySQLに接続した時、テンポラリテーブルを
select * from tmp;
とすると
Table 'tmp' doesn't exist
となりますが、作って接続しているユーザーのみがその時だけ
実行できるということなんでしょうか?
作ったユーザーでその場で
show tables;
しても見えないんですけど
select * from tmp;
すると
Empty Set
なんで存在していることは判るんですが。
<>
NAME IS NULL<>sage<>2012/02/21(火) 10:27:26.49 ID:???<> >作って接続しているユーザーのみがその時だけ実行できるということなんでしょうか?
http://dev.mysql.com/doc/refman/5.1/ja/create-table.html
TEMPORARY テーブルは現在の接続でのみ現れ、接続が終了すると自動的にドロップされます。
これは、2つの異なる接続同士、または、既存の同名の非TEMPORARY テーブルとお互いに
対立する事無く、同じテンポラリ テーブル名を利用する事ができるという意味になります。
(テンポラリ テーブルがドロップされるまで、既存テーブルは隠されています。)
>作ったユーザーでその場で show tables; しても見えないんですけど
既知の問題らしいよ。
http://dev.mysql.com/doc/refman/5.1/en/temporary-table-problems.html
The SHOW TABLES statement does not list TEMPORARY tables. <>
NAME IS NULL<>sage<>2012/02/21(火) 10:50:53.75 ID:???<> >>180
あ〜、、、ありがとうございます
ERROR 1137: Can't reopen table: 'temp_table'
↑も、はて?と思ってたとこでした。 <>
NAME IS NULL<><>2012/02/21(火) 10:57:00.43 ID:OsnjwX+/<>
MIKAMIのインターネット でググれ
このブログ痛すぎwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
クソワラタwwwwwwwwwwwwwwwwwwwwwwwwww <>
NAME IS NULL<>sage<>2012/02/21(火) 16:22:30.12 ID:???<> GREEの事件を見て思ったんだけど、重複カードを一枚だけ残して他は削除するSQLってどう書くの?
仮のテーブル構造として、USER_CARDテーブルにidと card_idがあって
何故か主キーが(id,card_id)ではなく(id)だけってお題で教えて。 <>
NAME IS NULL<><>2012/02/21(火) 18:14:45.94 ID:IA7KONQM<> 質問です
web developerがクエリを
select id,name from [table];
のように角括弧付きで生成するせいかエラー落ちするのですが
これはmySQLのバージョンupしたら治りますか?
[MySQL][ODBC 3.51 Driver][mysqld-5.5.20]
You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near '[accitem]' at line 1
となってます
ちなみにSQLバージョンは5.5.20です
もう死にたい <>
NAME IS NULL<>sage<>2012/02/21(火) 19:53:13.10 ID:???<> >>177
InnoDBであれば、別DBにシャーディングしてしまったら、2フェーズコミットはできない。
(Semi-Synchronus replicationがせいぜい。) <>
NAME IS NULL<>sage<>2012/02/21(火) 21:53:42.51 ID:???<> >>183
そういう質問するなら、idとcard_idが何を表していて、重複カードというものが
そこでどう表現されるのかくらいは書こうよ。 <>
NAME IS NULL<><>2012/02/22(水) 18:59:16.04 ID:pZRWhFER<> サイトを構築するとき 設計図を書いたりすることもあると思うんですが
データベースに関する設計も、メインテーブルがこれで、こんなカラムがあって・・・
とか設計図を書いたりしますか?
それともつくりながら考えますか? <>
NAME IS NULL<>sage<>2012/02/22(水) 19:28:21.38 ID:???<> ER図は一応描くわな。 <>
NAME IS NULL<>sage<>2012/02/22(水) 23:13:58.31 ID:???<> 仕事でドキュメントの提出が必須な時はER図など嫌々書く。 <>
NAME IS NULL<>sage<>2012/02/23(木) 07:05:38.30 ID:???<> >>187
>>172のツール使ってみ、ER図の作成が=DBにcreate table突っ込むのと同じになるし
そもそもER図が有った方が後々見やすい、成果物に設計書付けない事も無いと思うし
他の人の使ってるツールも聞いてそれで作ってみるのも重要だと思うよ
てか保守が厳しいからER図書かないなんてよっぽど小さい物以外無いだろ
頼むからER図ぐらい書けてくれ、そしてかけない奴はSE名乗るなと思ったりもする <>
NAME IS NULL<><>2012/02/23(木) 08:55:35.27 ID:+ehmXX/R<> 【1 OSの種類 .】 Windows vista 64bit
【2 Excelのバージョン 】 Excel2007
microsoft queryからのmysqlへの接続がうまく行きません、ご存知の方ご教授ください。
http://www.dbonline.jp/mysqlinstall/install/
ここを参考にmysqlを落とし、utf^8で設定
コマンドプロンプトからは文字コードが違うので日本語が打ち込めない状態。
適当にルート以外のユーザーとテスト用のDBを作成、参照出来るようにテーブルを作り、データをインサートしておく
mysql-connector-odbc-5.1.10-winx64.msiを落とし設定(適当にnext)
コントロールパネル→管理ツール→データソース(ODBC)から
ユーザーDSNとシステムDNSに設定、testボタンを押したとき
「connection successful」と出るのを確認
excelからデータ→その他のデータソース→microsoft queryを選択
データソースの選択画面が出てくるので、先ほどデータソース(ODBC)から追加したと思われる(おそらくシステムDNSの方?)
「test*」を選択し、OKボタンを押す
「データ ソース名および指定された既定のドライバが見つかりません」と表示される
このような感じなのですが原因はどのような物が考えられるでしょうか? <>
187<><>2012/02/23(木) 10:10:51.28 ID:/m8OsfNy<> >>回答くださった方
回答くださった方ありがとうございます!!
ER図なるものを初めて知りました。
それをググって派生して、
エンティティ、属性、等も知ることができました。
いやー、質問してよかったです。
<>
NAME IS NULL<><>2012/02/23(木) 11:20:19.74 ID:4TD8YxUG<> >>191
odbcドライバを32ビットのものにしたらあっさりと接続したよ、俺は w
結局office側は32ビットなんで <>
NAME IS NULL<><>2012/02/23(木) 11:53:09.74 ID:+ehmXX/R<> >>193
ありがとうございます。
私も今しがた32bit版のドライバをインストールし接続できました。
ただインストーラーを使ってしまったので、どんな状況になって繋がってるのかさっぱりわかりません;;
どういった感じなんでしょう??
64bit版のドライバを32bit版が上書きしているが、64bitMySQLに繋がっている状態??
英語が出来ないのでインストーラーに頼る前提でインストールしていたので謎は深まるばかりです。
DSNの設定は64bit版を入れていた時に設定した物でそのまま動作しているし??
取り敢えず64bitMysqlと32bitドライバで動くようになった事を書付として残しておいて、暫く試験運用って事で様子見をして見ます。
※現在そちらも同じような環境でしょうか?運用してどれぐらいになるか参考までに聞かせていただけると嬉しいです。 <>
193<>sage<>2012/02/23(木) 12:59:05.86 ID:???<> >>194
win7(home) 64ビット + office2010(32ビット)
mysql 5.5.19
odbc mysql-connector-odbc-5.1.9-win32
1月に新しいPCにして以来
俺はqueryは使わずもっぱら ado接続のみだけ
Windows7(x64)でMySql ODBC接続
http://blog.toratech.net/article/40504533.html
を読んだけどよく判らんかった^^; <>
191<>sage<>2012/02/23(木) 13:50:19.06 ID:???<> >>195
回答ありがとうございます。
その記事は私もたどり着きました。
ただ、ODBCの管理ツールが二つある、32bit版の管理ツールで設定すると良いらしいとの事だと読み取りましたが、
フルパスで打ち込んでそちらの方で設定しようとすると、ODBCが見つからないと言われて行き詰ってました。
64bitのドライバを32bitの管理ツールで??とか思いましたが。
何処でどういうエラーが出ているのか・・・管理するソフトウェアの仕様という事なんでしょうかね?
詳しく分からないとやはり母国語が英語じゃ無い事が憎らしい;; <>
NAME IS NULL<><>2012/02/23(木) 21:15:05.54 ID:/m8OsfNy<> 非依存型リレーションは分かるのですが、
依存型リレーションで、
【受注テーブル】
受注番号
受注日
配送先
|
|(依存リレーション)
|
【受注明細テーブル】
受注番号(FK)
明細番号
数量
送料
と分けるのと
【受注テーブル】
受注番号
受注日
配送先
明細番号
数量
送料
と、一つのテーブルにまとめる違いが
イマイチよくわかりません。
依存型リレーションとして分けるメリットは
どのようなことがあるのでしょうか。 <>
NAME IS NULL<>sage<>2012/02/23(木) 22:18:13.58 ID:???<> ひとつのエンティティとみなすか、ふたつの異なるエンティティの組合せとみなすかだろ。
まぁエンティティというのは不可分でその単位で存在したりしなかったりするものだから
その形の場合、依存する側の多重度は0..1/*となるのが普通だが。 <>
NAME IS NULL<>sage<>2012/02/24(金) 07:24:12.68 ID:???<> 明細番号が分かれるから複数ページにまたがる時にとか <>
NAME IS NULL<>sage<>2012/02/24(金) 15:25:17.50 ID:???<>
あ、1受注に対して、明細が複数あった場合ということか・・・
回答ありがとうございます。 <>
NAME IS NULL<><>2012/02/24(金) 21:52:23.80 ID:zcQyvLtE<> SET timestamp=1330087285;
UPDATE `entry` SET `up_date` = '2012-02-24 21:41:13', `view` = 15 WHERE `entry`.`id` = 2968;
記事が閲覧される度に閲覧数をカウントアップするためにこんな感じのSQLを発行しています
slowlog_queryを確認すると
これが7秒や8秒、遅い時で40秒近くかかる時があります
PHPMYADMINから直で打つと数ミリ秒で実行されます
更に、他のUPDATE処理は全て正常にミリ秒で行われます
原因として一体何が考えられますか?
entry.idには勿論indexは貼ってあります <>
NAME IS NULL<>sage<>2012/02/25(土) 00:31:10.93 ID:???<> >>201
あんまりないと思うけど、ロック待ちかな。
SHOW FULL PROCESSLIST;を数秒おきに実行して、
40秒かかっているときに何が起こっているのかを確認するとよい <>
NAME IS NULL<><>2012/02/25(土) 01:21:06.60 ID:eXfD6bYl<> >>202
ありがとうございます。ちょっと確認してみたのですが
特に何も異常は見当たらず……
# Query_time: 7.948575 Lock_time: 0.000051 Rows_sent: 0 Rows_examined: 0
SET timestamp=1330099695;
UPDATE `entry` SET `up_date` = '2012-02-25 01:08:08', `view` = 298 WHERE `entry`.`id` = 8821
ロックタイムは微々たるものです
他の項目に関しては全然遅くないのですがなぜかここだけめちゃくちゃ遅い……
なんでなんだろう…… <>
NAME IS NULL<><>2012/02/25(土) 17:30:08.76 ID:AgGTppYT<> 質問です。
使えるねっとのWin2003VPSサーバーを契約してます。
plesk→phpadminでmysqlのテストデータベースとテーブルを作成
↓
odbcドライバをインストール
↓
odbcデータソースに「mysql5.1ドライバー」を追加
↓
テスト接続では「connection successful」と出る。
↓
Excel2003で「データ」→「外部データのとりこみ」→「新しいデータベースクエリ」
→「データソースの種類」→「MYSQL」を選択しOKを押すと
「データ ソース名及び指定された規定のドライバが見つかりません」とエラーメッセージが出ます。
原因はなんでしょうか?
<>
NAME IS NULL<>sage<>2012/02/26(日) 17:38:02.70 ID:???<> チョット上を読もうか <>
NAME IS NULL<><>2012/02/27(月) 17:50:49.40 ID:oVY8HvyU<> 以下のようなSQLを発行したいと思っています。
update
table1
set
table1.num + (select num from table2 where column1 = 1)
where
table1.id in (select id from table2 where column1 = 1)
このようなクエリで、どちらのサブクエリも同じレコードにする方法などございますか? <>
NAME IS NULL<>sage<>2012/02/28(火) 13:53:12.29 ID:???<> >>206
こういう事かな?
update
table1
inner join table2 using(id)
set
table1.num = table1.num + table2.num
where
table2.column1 = 1; <>
NAME IS NULL<><>2012/02/28(火) 14:30:20.40 ID:ugSWazyc<> 多対多の関係が必要な時につくる、中間テーブルってあるじゃないですか、
あれって正式には何と呼ばれてるんでしょうか。
たとえばテーブル users と groups があって、両方を結びつける
create table users_groups (
user_id integer not null references users(id),
group_id integer not null references groups(id)
)
みたいなの。
呼び方がわからないので、勝手に中間テーブルと呼んでいるんですが、ほんとは何という名前なのでしょうか。
<>
NAME IS NULL<>sage<>2012/02/28(火) 20:07:32.98 ID:???<> テーブルをパーティションというものに分けた時のメリットってなんですか? <>
NAME IS NULL<><>2012/02/28(火) 23:39:58.46 ID:tm6Avr0W<> あるアクションに対するログテーブルみたいのがあるんですが、
1時間以内ログを全部とってきて、それぞれのログの数をカウントしたいんですよね。
で、クエリじゃなくスクリプトで作るならできるんですが、
クエリで、アクション毎のカウントってできますか?
1アクション1レコードな感じで保存しています。
よろしくおねがいします。 <>
NAME IS NULL<>sage<>2012/02/29(水) 10:27:03.93 ID:???<> >>208
この記事でも中間テーブルって言ってるからそれでいいんじゃないかな
http://siob.sint.co.jp/er/serial/serial02.html <>
NAME IS NULL<>sage<>2012/02/29(水) 10:45:37.74 ID:???<> >>209
・フルスキャンするクエリの負荷を絞り込める
・統計情報がパーティションごとに管理されるため、より適切なSQL実行計画が期待できる
・DROP PARTITIONを使えば過去データの削除が速い
・DELETEで削除する方針に比べデータファイルの断片化を抑えられる
Oracleならこれに加えて
・パラレルクエリを用いた並列処理ができる
・古いパーティションのデータを圧縮することができる
<>
NAME IS NULL<>sage<>2012/02/29(水) 10:49:23.81 ID:???<> >>210
SELECT action_type, COUNT(*)
FROM action_log
WHERE action_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY action_type
むしろ、どこらへんが難しいと思ったのか知りたい
<>
NAME IS NULL<>sage<>2012/02/29(水) 16:36:23.91 ID:???<> >>212
回答ありがとうございます
>・フルスキャンするクエリの負荷を絞り込める
これは、例えばアクセスを局所的に抑えることが出来るという理解でよろしいのでしょうか?
<>
NAME IS NULL<>sage<>2012/02/29(水) 17:21:37.63 ID:???<> >>214
そう。
例えば売上テーブルを月ごとにパーティショニングしておけば
月ごとの売上集計で多少ひどいクエリを実行しても、
フルスキャンするのは当月の1パーティションだけに抑えられる。
<>
NAME IS NULL<>sage<>2012/02/29(水) 18:20:33.06 ID:???<> ER図を書くのにいいツールはありませんか。
テーブルやカラムごとにコメントが書けるものがいいです。
当方Macですが、プラットフォームにこだわらず紹介していただければ。
<>
NAME IS NULL<>sage<>2012/02/29(水) 19:27:30.80 ID:???<> ID出してないな。 >>216
俺は、EclipseのプラグインのER Master っての使ってる。
良いとして薦めはしない(これは勘弁してくれってとこがある)けど、
いちおうテーブルにもカラムにもコメントは書ける。
つか、書けないツールの方が少ないんじゃないか?
<>
NAME IS NULL<>sage<>2012/02/29(水) 19:34:39.94 ID:???<> >>216
特別絶賛おすすめするほどではないけど
本家のMySQL Workbenchでいいんじゃないの。コメント書けるよ <>
NAME IS NULL<>sage<>2012/02/29(水) 19:37:53.61 ID:???<> >>215
ありがとうございます。 <>
NAME IS NULL<>sage<>2012/03/01(木) 10:49:41.46 ID:???<> >>216
当方MACなので
ブラウザ上で動作する mysql designer というの使ってる。
http://ondras.zarovi.cz/sql/demo/?keyword=default <>
NAME IS NULL<><>2012/03/01(木) 21:27:51.42 ID:5sB6rcpv<> MySQLのテーブルに”−”(全角マイナス)って登録できないんですか?
”ー”(長音)ならば出来るようですが… <>
NAME IS NULL<>sage<>2012/03/01(木) 22:16:13.29 ID:???<> 文字コードで 0x5c に引っかかってると予想
http://charset.7jp.net/sjis.html <>
NAME IS NULL<>sage<>2012/03/01(木) 22:47:10.46 ID:???<> 質問です。
MyISAMは、書き込みのときにテーブルロックを行うそうなのですが、
このテーブルロックというのは、他の書き込みを阻止するという意味でしょうか?
または、書き込みも読み込みも関係なくすべてのアクセスを阻止するという意味でしょうか?
<>
NAME IS NULL<>sage<>2012/03/01(木) 23:36:03.44 ID:???<> 書き込みのテーブルロックは、ロックを取得した奴以外は、
(書き込みは勿論)読み込みでもブロックされるよ。 <>
>>223<>sage<>2012/03/01(木) 23:41:25.52 ID:???<> >>224
thanks
<>
NAME IS NULL<><>2012/03/02(金) 01:08:08.60 ID:yjU4uzp8<> echo "CREATE INDEX `cl_collation` ON categorylinks (`cl_collation`);" | nkf -w| mysql --user=user --password=pass Database | nkf -e
というコマンドのかかれたシェルスクリプトを実行してbashコマンドラインからインデックスの付与を行いたいのですが、
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON categorylinks (,,,)' at line 1
というエラーが出て止まってしまいます。
恐らくバッククォートのエスケープ処理がうまくできていないのだと思いますが、どうすればいいのでしょうか。 <>
226<><>2012/03/02(金) 01:45:10.50 ID:yjU4uzp8<> バックスラッシュをバッククォートの前につけるだけでとりあえず動きました。 <>
NAME IS NULL<>sage<>2012/03/02(金) 15:42:30.13 ID:???<> まだほとんど勉強してない状態でイメージでの質問ですが、
よくウェブサーバーとMySQLサーバはわけろって言われるんですが、
ウェブサーバとSQLサーバを別個に用意して、phpなどからMySQLサーバーに
接続して処理させようとするときは、phpのソースに接続先IPおよびMySQLのアカウントとパスを
書いておくってことなんでしょうか? <>
NAME IS NULL<>sage<>2012/03/02(金) 20:30:05.49 ID:???<> >>228
YES <>
NAME IS NULL<><>2012/03/02(金) 21:31:28.31 ID:BzTarHSh<> 一般的にそうなんですか??
ウチの会社ではデータベースもperlもPHPも同じサーバで運用してます。
分けるとレスポンスが低下するってイメージしか無かったです。 <>
NAME IS NULL<>sage<>2012/03/02(金) 21:46:22.76 ID:???<> 小規模なら1台にまとめる、
中規模以上なら分けて、PHPが動くサーバの台数を増やしていく <>
228<><>2012/03/02(金) 22:25:01.18 ID:45ALAGnb<> レスどうもです
小規模なら1台で良いのですか?
よく、ウェブサーバーとデータベースサーバー一緒にするなんて
セキュリティ的に御法度だと聞くんですが・・・
脆弱性が起こりやすいウェブサーバーから、データベースに影響が及ぶのを避けるためかと
思ってましたが、現場ではそんなことはないのですか? <>
NAME IS NULL<>sage<>2012/03/02(金) 23:29:29.35 ID:???<> 心配なら分ければいいんじゃね <>
NAME IS NULL<>sage<>2012/03/03(土) 05:43:00.24 ID:???<> >>232
>セキュリティ的に御法度
? <>
NAME IS NULL<>sage<>2012/03/03(土) 11:41:26.08 ID:???<> そら分けた方が、Webサーバー盗まれてもDBは無事って意味では安全だべ
心配なら分ければ?としか言えない <>
NAME IS NULL<>sage<>2012/03/03(土) 11:51:51.43 ID:???<> 会社の信用が大事なら分けるだろ。
webサーバーが危ないんだっけ?PHPの方が危ないバグが出るイメージあるが <>
NAME IS NULL<><>2012/03/04(日) 07:25:56.39 ID:8oq86TOM<> アクセスログ用の100万件のレコードに対して
最適な設計が出来るようにテストしています。
日付のカラムをdatetime型にしているのですが、
WHEREの条件でDATE_FORMAT(date, '%Y%m%d')='20120304'
とすると、EXPLAINを見る限りインデックスが使われていません。
DATE_FORMATを使った場合って、インデックスは効かないのでしょうか?
また、アクセスログのような用途で「年・月・日別検索」を想定した場合、
datetime型ではなくて複数に分けるべきなのでしょうか? <>
NAME IS NULL<>sage<>2012/03/04(日) 10:48:41.09 ID:???<> >>237
検索対象カラムに関数を挟むとインデックスは利用できない。
これはOracleやPostgreSQLでも同じ。
date >= STR_TO_DATE('20120304', '%Y%m%d')
AND date < STR_TO_DATE('20120305', '%Y%m%d')
> datetime型ではなくて複数に分けるべきなのでしょうか?
分けていいけどDATETIMEも残しておいた方がいいかと <>
NAME IS NULL<><>2012/03/04(日) 16:47:09.73 ID:8oq86TOM<> >>238
ありがとうございます。
よく調べたら確かに関数を使うとインデックスが効かないとありました。
試しに「年」「月」「日」「時間」で分けるカラム構成にしたところ、
インデックスが効くようで高速になった気がします。
ただ、やっぱり十万単位のレコードがあると重いですね。
PHPで表示させた時、数秒単位で時間がかかります。
オープンソース見ると特に変わったことしてないし、
Webサービスのアクセス解析はどうしてるんですかね。
あとDATETIMEも残すようにしたいと思います。アドバイスありがとうございました。 <>
NAME IS NULL<><>2012/03/04(日) 20:44:20.25 ID:CmBNNLM+<> 常に参照され、定期的に更新し、全文検索が必要な場合、InnoDB、MyISAM、マスター、スレーブ等はどのような構成にするのが良いでしょうか? <>
NAME IS NULL<>sage<>2012/03/04(日) 22:34:11.34 ID:???<> 全文検索が必要な場合 というだけでテーブルのエンジンはMyIsam一択でしょ?
後、「常に参照され、定期的に更新し、全文検索が必要な場合」
ということと、マスター、スレーブは関係ないと思うのだけど <>
NAME IS NULL<>sage<>2012/03/05(月) 08:23:14.25 ID:???<> MySQLで日本語の全文検索は可能なのですか? <>
NAME IS NULL<>sage<>2012/03/05(月) 18:43:15.39 ID:???<> mysqlが文字化けしちゃう。助けて <>
NAME IS NULL<>sage<>2012/03/05(月) 19:04:58.16 ID:???<> mampのmy.cnfってどこにあるの? <>
NAME IS NULL<>sage<>2012/03/05(月) 19:32:23.06 ID:???<> >>243
症状は?
コマンドプロンプトから更新かける時に文字コードが違うと言われるなら
プロンプトの文字がshift-jisだkら。
shift-jisで設定していて読み出す時に一部だけ文字化けするならそれはshift-jisの仕様だから。
utf-8にすれば出ないと思われ。
linuxだったらデフォルトの文字コードがutf-8だからお勧めの文字コードがutf-8で設定されている。 <>
NAME IS NULL<>sage<>2012/03/05(月) 23:01:18.03 ID:???<> 俺も全文検索知りたい。どういうSQLになるんだ? <>
NAME IS NULL<>sage<>2012/03/05(月) 23:32:27.59 ID:???<> >>246
MyISAMでの全文検索構文なら、普通にMySQLのマニュアルに書かれてるよ。
Tritonn(MySQLにパッチあてて、sennaを使えるようにしたもの)でも、
mroonga(groongaをMySQLから使えるようにするもの)でも、
基本的にはその構文を引き継いでたはず。 <>
NAME IS NULL<>sage<>2012/03/06(火) 04:28:49.92 ID:???<> >>247
>Tritonn(MySQLにパッチあてて、sennaを使えるようにしたもの)でも、
>mroonga
どちらも日本語全文検索はうまくいかないと思うが <>
NAME IS NULL<>sage<>2012/03/06(火) 11:41:07.55 ID:???<> Tritonnの日本語全文検索は実績あるだろ
ぐぐってみ <>
NAME IS NULL<>sage<>2012/03/06(火) 22:51:11.94 ID:???<> fc2のレンタルサーバーlightでmysqlを使っているのですが、
日本語を登録すると文字化けしてしまいます。
全然操作方法が分かりません。照合順序をujis_japanese_ciに
しています。多分照合順序で文字化けと思うのですか。
日本語設定がない?でしょうか?
FC2にメールすべきでしょうか? <>
NAME IS NULL<><>2012/03/07(水) 17:38:30.67 ID:kDqT5Hn4<> phpmyadmin で あるテーブルのフィールドの内容を変更しようとすると
#1025 - Error on rename of .... (errno: 150)
とエラーがでます。
削除もできません。
他のフィールドは大丈夫です。
なんか、編集できないようにロックがかかってるぽいんですが
どうすれば、解くことが出来るのでしょうか <>
NAME IS NULL<>sage<>2012/03/07(水) 18:44:05.27 ID:???<> 「mysql エラー 1025 150」で検索してみた? <>
NAME IS NULL<>sage<>2012/03/07(水) 23:13:11.46 ID:???<> 質問です。
データベースaaaとデータベースbbbがあったとして、
それぞれが利用しているディスク容量を知るにはどうしたらよいでしょうか?
MyISAMとInnoDBの両方について知りたいです。
<>
NAME IS NULL<>sage<>2012/03/07(水) 23:36:51.38 ID:???<> >>253
こうかな?
SELECT TABLE_SCHEMA, SUM(DATA_LENGTH + INDEX_LENGTH)
FROM INFORMATION_SCHEMA.TABLES
GROUP BY TABLE_SCHEMA; <>
>>253<>sage<>2012/03/08(木) 23:07:59.70 ID:???<> >>254
ありがとうございます!
<>
NAME IS NULL<><>2012/03/10(土) 15:49:20.33 ID:W+nE1TCt<> 1回目の書き込みは新規、2回目の書き込みは上書きを
もっとうまくでけんかと調べてたら
REPLACE文 なんて便利なものあるのかよ!
ちくしょう! <>
NAME IS NULL<>sage<>2012/03/10(土) 18:30:15.40 ID:???<> insert で on duplidate update kery というのもある <>
NAME IS NULL<><>2012/03/11(日) 03:33:49.88 ID:v7Ji0Ifs<> Aテーブルにあるdateが2011-12-31以前のデータを
Bテーブルに移したいのですが、どういうSQLを書けばいいのでしょうか?
上手く、ググれないので教えてください <>
NAME IS NULL<>sage<>2012/03/11(日) 06:19:30.88 ID:???<> insert into b select * from a where 日付カラム <= '2011-12-31'; <>
NAME IS NULL<>sage<>2012/03/11(日) 17:36:22.19 ID:???<> >>259
ありがとうございます。希望通りに出来ました。 <>
NAME IS NULL<>sage<>2012/03/13(火) 00:46:04.63 ID:???<> 質問です。
select for updateって何のために必要なのでしょうか?
トランザクション使えばいいだけだと思うんですが。。
こういう場面で、select for updateを使う!というのがありましたら教えてくださいm(_ _)m
<>
NAME IS NULL<>sage<>2012/03/13(火) 08:01:00.97 ID:???<> >>261
SELECT FOR UPDATEを使わず同じことをするには
トランザクション分離レベルをSERIALIZABLEにする必要がある。
READ COMMITTED/REPEATABLE READ+SELECT FOR UPDATEの方が
設計はかなり楽 <>
NAME IS NULL<><>2012/03/14(水) 21:36:21.36 ID:xkBwsneG<> MySQLの文字化けでご質問させてください。
XAMPPからインストールしたMySQL ver5.5.16ですが文字化けが直せません。
UTF-8にしたく、my.iniにも
character_set_server = utf8
skip-character-set-client-handshake
の2文を追加し、MySQL再起動。
その後データベースを削除し、新規に作り直し、status等で確認したところutf8になっていましのたで、
テーブル等も作りましたが、select分で確認したところ、全角文字だけ空白でなにも表示されません。
同じような手順でsjis,ujisと試しましたが、ujisは文字化けしましたがsjisだけうまくいきました。
しかし、ブラウザ表示させたく、utf8にしたいので非常に困ったいます。
よろしくお願いいたします。 <>
NAME IS NULL<>sage<>2012/03/14(水) 23:53:24.83 ID:???<> >>263
skip-character-set-client-handshakeしろって書いてあるブログを信用してはいけない。
[mysqld]
character_set_server = utf8mb4
[mysql]
default_character_set = cp932
[client]
default_character_set = utf8mb4
これで試してみて。 <>
NAME IS NULL<>sage<>2012/03/15(木) 17:07:39.66 ID:???<> 特殊文字を扱うにはどうしたらいいんでしょうか
INSERT INTO LIST VALUES(0, '\', '0', '0');
とコマンドプロンプトで入力しても反応しません <>
NAME IS NULL<>sage<>2012/03/15(木) 21:01:02.32 ID:???<> >>265
SET NAMES cp932;
を試してみて、ダメならWindowsを窓から投げ捨てる <>
NAME IS NULL<><>2012/03/15(木) 22:04:51.81 ID:H1D1gssR<> ダメどころか普通に日本語insertすると
incorrect string valueと出るようになった <>
NAME IS NULL<>sage<>2012/03/15(木) 22:13:41.46 ID:???<> >>267
ALTER TABLE LIST CHARSET utf8;
SET NAMES cp932;
と打ってからやるとどんな感じ? <>
NAME IS NULL<><>2012/03/15(木) 22:42:38.41 ID:H1D1gssR<> ダメでした同じ結果が出ますね
さっきグーグル先生の言うとおりUTF8に設定して
文字化け対策というのも試してみたけど
日本語含んでいると
同じようにincorrect string valueが返ってきます
なぜかlatin1じゃないと日本語が使えないみたいです
<>
NAME IS NULL<>sage<>2012/03/16(金) 09:26:59.80 ID:???<> >>269
もしかしてバージョンが古い?
いまどきのバージョンはlatin1にはどう頑張っても
日本語は入らないはず。 <>
NAME IS NULL<>sage<>2012/03/16(金) 12:49:14.93 ID:???<> MySQL5.5
idはオートインクリメントです
id10とid11の間に新しいカラムを入れて、idをずらすにはどういうSQLを書くといいでしょうか?
id 10のカラム みかん
id 11のカラム りんご
↓
id 10のカラム みかん
id 12のカラム 新しく挿入した箇所
id 12のカラム りんご
<>
271<>sage<>2012/03/16(金) 12:54:51.13 ID:???<> すみません質問取り消します
SQLスレに移動します <>
NAME IS NULL<><>2012/03/20(火) 19:15:17.32 ID:IKrf959C<> CREATE TABLE unko ( a INT, b INT, c INT );
と作ったテーブルを、ALTER TABLEかなんかで
a,b,c の順から b,a,c の順に変更したいんだけど
かっこういい方法ある? <>
NAME IS NULL<>sage<>2012/03/20(火) 19:40:24.64 ID:???<> >>273
ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification ...]
alter_specification:
...
| MODIFY [COLUMN] create_definition [FIRST | AFTER column_name] <>
NAME IS NULL<>sage<>2012/03/21(水) 12:27:05.48 ID:???<> 常に上から2行目にデータを挿入する方法を教えて先生 <>
NAME IS NULL<>sage<>2012/03/21(水) 14:53:43.56 ID:???<> >>275
ない <>
NAME IS NULL<><>2012/03/21(水) 15:07:56.14 ID:PLbwqVKz<> テーブル名を英語で直訳すると長くなる場合どうしてます?
土建屋の一括見積サイト作ることになったのですが。
「土建屋」を英語で直すと「contractor」になり、少し長く感じます。
「company」だと会社概要と混同しそうだし・・。 <>
NAME IS NULL<>sage<>2012/03/21(水) 17:39:20.76 ID:???<> >>277
doken
いや、マジで。 <>
NAME IS NULL<><>2012/03/21(水) 17:40:32.50 ID:PLbwqVKz<> なるほど。ローマ字にするんですね。
その方が見た感じ分かりやすいし、そうします。ありがとうございました。 <>
NAME IS NULL<><>2012/03/21(水) 20:05:42.42 ID:Ny2BPNOP<> 主キーと外部キーの違いがよくわかりません。ご教授お願いします。
<>
NAME IS NULL<>sage<>2012/03/21(水) 20:10:33.27 ID:???<> >>280
主キー:いわゆるキー
外部キー:他のテーブルのキーの値のどれかが入る。なくてもいい
<>
NAME IS NULL<>sage<>2012/03/21(水) 20:23:08.71 ID:???<> >>281
それは、どういうことでしょうか?
例えば? <>
NAME IS NULL<>sage<>2012/03/21(水) 20:25:18.86 ID:???<> >>282
マルチする暇があったら検索くらいしろよ
いい例が1個めにでてくるぞ <>
NAME IS NULL<>sage<>2012/03/21(水) 20:31:36.96 ID:???<> >>283
何と検索したらいいでしょう? <>
NAME IS NULL<>sage<>2012/03/21(水) 21:47:36.10 ID:???<> >>284
MySQLと関係ないからスレ違い。
あとマルチしすぎ。 <>
NAME IS NULL<><>2012/03/22(木) 12:42:31.67 ID:1AR4SqpK<> >>277
俺は、もともとが英語でないカラム名は、
そのまま日本語をヘボン式ローマ字で書くことにしてる
いちいち、翻訳を調べたり考えたりする時間が無駄すぎる。
文字化けだの、文字コードだの、翻訳だの、文字の再利用性だの
全角文字文化というものは、プログラムの生産性を2〜3割ぐらい
落としてるんじゃないかと思うほど、ハンデ。
半角文化がうらやましい。 <>
NAME IS NULL<><>2012/03/22(木) 21:29:53.28 ID:WaeM069C<> >>286
英語に疎いもので「ヘボン式」というのがわかりませんでした。
シャも今までsyaと書いてました。shaがヘボン式であり、一般的なんですね。
今後は英語で長くなる場合、わかりづらい場合は
ヘボン式ローマ字を使うようにします。すごく参考になりました。ありがとうございます。 <>
NAME IS NULL<>sage<>2012/03/24(土) 02:06:25.34 ID:???<> mysqlのバックアップって、みなさんはどうやってやってますか?
今、以下の2つの方法のどちらを採用するか迷っています。
1.mysqldumpで、毎日指定時間にバックアップする。
2.tarコマンドで、データディレクトリをバックアップする。
よろしくご教授お願いします。
<>
NAME IS NULL<>sage<>2012/03/24(土) 07:47:32.05 ID:???<> >>288
いったんmysqldをshutdownできるなら2、できないなら1。
mysqldを動かしたままtarでバックアップは取れないよ <>
NAME IS NULL<>sage<>2012/03/24(土) 19:20:13.79 ID:???<> temporary tableに関してですが
create temporary table tmp select * from hoge;
として作ったtmpを次に
select * from tmp as a1, tmp as a2
として、比較用に同じtmpを使ったSQLを作りたいのですが
Can't reopen table: 'a1' となってしまいます。
このような使い方はできないんでしょうか <>
NAME IS NULL<>sage<>2012/03/24(土) 19:51:16.67 ID:???<> >>290
できない。残念ながら仕様。
C.5.7.2. TEMPORARY Table Problems
http://dev.mysql.com/doc/refman/5.5/en/temporary-table-problems.html
You cannot refer to a TEMPORARY table more than once in the same query.
For example, the following does not work:
mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'
<>
NAME IS NULL<>sage<>2012/03/24(土) 21:13:21.98 ID:???<> >>291
ありがとうございます。
無理だったんですね、、
もう一つ質問です。
MySQLで
id, A, B, C というカラムがあるテーブルで、
1, 1, 5, 7
2, 0, 3, 4
3, 0, 0, 1
という感じでデータが入っていて、 id=1のA,B,Cのいずれかが入っているidを見つけたいのですが
(この場合は 3が該当する)
どのようなクエリを書けばいいでしょうか <>
NAME IS NULL<>sage<>2012/03/24(土) 22:12:12.46 ID:???<> (前略) WHERE A = 1 OR B = 1 OR C = 1
とちゃうの? <>
>>288<>sage<>2012/03/25(日) 00:09:16.14 ID:???<> >>289
ありがとうございます。
<>
NAME IS NULL<>sage<>2012/03/25(日) 00:11:34.98 ID:???<> 質問です。
mysqldump -Aで取得したバックアップファイルは複数のデータベースが入っていますが、
そのうち、一つのデータベースのみを利用したい場合、
vimで関係ないデータベースを削除するしかないんでしょうか?
<>
NAME IS NULL<>sage<>2012/03/25(日) 00:47:34.94 ID:???<> mysqldumpのmanをよく読んでみるといい <>
NAME IS NULL<>sage<>2012/03/25(日) 13:50:31.84 ID:???<> xamppを使っていて、mysqlで2バイト文字を使うと文字化けしてしまうので、色々調べてみたのですが、
default-character-set=utf8 を追加すると下記のようなエラーが出てしまい起動できずにいます。
120325 13:08:57 [ERROR] c:\xampp\mysql\bin\mysqld.exe: unknown variable 'default-character-set=utf8'
120325 13:08:57 [ERROR] Aborting
コメントアウトして、character-set-server=utf8を追加しても文字コードがlatin1になってしまっていて、文字化けしてしまいます。どうすればいいのでしょうか・・・。 <>
297<><>2012/03/25(日) 13:55:46.18 ID:jZQ0Ce8P<> すみません、sageたままでした <>
NAME IS NULL<>sage<>2012/03/25(日) 20:23:30.29 ID:???<> >>297
一度化けたデータはもう戻らないので、
character-set-serverを設定したあと
データベース、テーブルを作り直してデータを入れなおす。
<>
297<><>2012/03/25(日) 20:57:29.40 ID:0c4g4u0j<> >>299
ありがとうございます。やってみます。 <>
NAME IS NULL<>sage<>2012/03/25(日) 21:02:50.39 ID:???<> PHP側も接続後に
$conn->set_charset("utf8");
するのを忘れずに。 <>
297<><>2012/03/25(日) 21:15:08.72 ID:0c4g4u0j<> わーーーーーできました!!!!みなさんありがとうございました!!!!!!!!!! <>
NAME IS NULL<>sage<>2012/03/25(日) 21:42:21.17 ID:???<> よかったね <>
>>295<>sage<>2012/03/27(火) 00:21:52.21 ID:???<> >>296
ありがとうございます。
mysqldump --databasesでデータベースを指定できるのは知っているのですが、
mysqldump -Aで取得したバックアップファイルから、特定のデータベース一つを取り出す方法が知りたいのですが、
やはり、この場合は、vimで、いらないデータベースを削除するしか、方法がないのでしょうか?
<>
NAME IS NULL<>sage<>2012/03/28(水) 23:25:58.20 ID:???<> MySQLのロックについて教えてください
環境:5.0.87 (tritonnですが、tritonnに起因する問題ではないです)
2つのInnoDBストレージのテーブルからMyISAMテーブルへINSERTするクエリを発行すると
元のInnoDBテーブルにロックが発生するときがあります。
クエリはこんな感じ
-----
INSERT INTO myisam_table ( field1 , field2)
SELECT i1.A, FN(i2.B)
FROM innodb_table1 i1
INNER JOIN innodb2_table i2 ON i1.id=i2.id
-----
FNはテキストを変更するストアドファンクションです
myisam_tableはインデックス等の設定はありません(のでtritonnの問題ではないです)
innodb_table1,innodb_table2は1対1でパーティションを分けただけです(id列はキー列)
上記のSQLを実行中に、innodb_table1へのINSERTがロック解除待ちになるときがあります。
ダーティーリードOK、ファントムリード大歓迎という一貫性無関係なクエリなので、分離レベルを
READ UNCOMMITTEDにしてもinnodb_table1へのINSERTクエリがロック解除待ちになりました。
FNがちょっと時間のかかる処理なので、10万レコードを処理すると2時間ぐらいかかります。
それでロックが発生していることが分かったのですが、READ UNCOMMITTEDにしているのに
ロックが発生していることがどうしても理解できなく、対策も思いつきません
#そもそも書き込み先はMyISAMなのに何でロックが?という疑問も…
一貫性保持のロックはまだ分かるのですがですが、READ UNCOMMITTEDで一貫性を放棄したのに
それでもロックが発生する理由が分かりません… <>
NAME IS NULL<>sage<>2012/03/29(木) 00:25:10.26 ID:???<> >>305
トランザクション分離レベルに関わらず、「更新」は「更新」をブロックする。
そのINSERT … SELECT文は一見「参照」に見えるけど
内部的には「更新」扱いされるんじゃないかなあ。 <>
306<>sage<>2012/03/29(木) 00:31:38.87 ID:???<> 補足だけどMySQL 5.5を検証環境に入れて、処理中に
information_schema.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS
あたりを見ると分かるはず。 <>
306<>sage<>2012/03/29(木) 00:35:29.87 ID:???<> マニュアルに書いてあったよ。
http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locks-set.html
INSERT INTO T SELECT ... FROM S WHERE ... は〜
あたりから。 <>
NAME IS NULL<>sage<>2012/03/29(木) 00:44:14.36 ID:???<> >>304
mysqldumpじゃなくてmysqlコマンドの方に
--one-databaseっていうそれっぽいオプションがあるよ。 <>
305<>sage<>2012/03/30(金) 00:05:17.86 ID:???<> >306-308
有難う。
指摘された箇所読み直して、ようやく理解した。(ような気がする)
myisam_tableへのINSERTは一貫性関係ないからREAD UNCOMMITTEDと考えてたけど、
innodb_table1/2にはREAD COMMITTED以外だとロックがかかるのね…
質問したinnodb_table1 へのINSERTのロック待ちが起きているクエリのトランザクションの
レベルはデフォルトのRPEATABLE READ。ロック待ちになっても仕方ないですね
「それ以外の場合、InnoDB は S から取得した行に共有ネクストキーロックを設定します」の
「それ=READ CMMITTED」以外というのはREAD UNCOMMITTEDも含むんだろうなぁ <>
NAME IS NULL<><>2012/03/30(金) 08:06:51.45 ID:oR+inl8b<> mysql で
新規挿入時のユニークIDの生成 が 1..2...3 と順番ではなく
14932 34643 96949 と ある桁数、又は範囲のなかで
ランダムに生成出来る方法ってないでしょうか <>
NAME IS NULL<>sage<>2012/03/30(金) 09:29:17.25 ID:???<> >>311
INSERT INTO user (id) VALUES (FLOOR(RAND() * 100));
して、重複してたらやり直す。
やり直すのが面倒なら、「未割り当てID一覧テーブル」
っていうのを作ればいいんじゃないかな。
SELECT id FROM unassigned ORDER BY RAND() LIMIT 1;
DELETE FROM unassigned WHERE id = ?;
INSERT INTO user (id) VALUES (?);
COMMIT;
<>
NAME IS NULL<><>2012/03/31(土) 17:03:47.81 ID:ocTAzuV3<> レプリケーションというのを最近知ったのですが
メインのDB(更新用)とスレーブのDB(参照用)があって、
webアプリでDB接続を指定するときは「参照用IPアドレスで接続」「更新用IPアドレスで接続」のように
きっちり分けないとダメなんでしょうか?
更新系クエリ/参照系クエリで自動的にDBを切り替えるなんて事は無理ですか? <>
NAME IS NULL<>sage<>2012/03/31(土) 18:26:58.95 ID:???<> >>313
分けないとだめ
みんな自社用フレームワーク作ったりしてるんだと思う <>
NAME IS NULL<><>2012/03/31(土) 19:21:34.22 ID:ocTAzuV3<> >>314
レスありがとうございます
という事は、レプリケーションした場合、参照系と更新系を混ぜたトランザクションなんてことは
無理で、トランザクション時のみ更新系DB(マスター)だけを対象に接続することになるんですか? <>
NAME IS NULL<>sage<>2012/03/31(土) 19:33:50.67 ID:???<> >>315
YES。
自分でシステムの要件を決められるWeb企業だからできる設計であって、
顧客が要件を決める受託システム開発で採用するのは難しいと思うよ。
<>
NAME IS NULL<>sage<>2012/03/31(土) 20:27:14.61 ID:???<> >>316
ありがとうございます、勉強になりました <>
NAME IS NULL<>sage<>2012/04/01(日) 00:41:57.29 ID:???<> レプリケーションのDBを構築するならば、
MySQL Cluster で構築した方が可用性にも性能にも優れていると思うんだけど、
この認識って合ってますかね?
MySQL Clusterよりもレプリケーションの方が優れている点があれば、教えてください。
<>
NAME IS NULL<>sage<>2012/04/01(日) 01:02:28.54 ID:???<> >>318
まずこれを読むべき
http://zak.asablo.jp/blog/2009/12/08/4746257
http://zak.asablo.jp/blog/2011/11/24/6212759 <>
NAME IS NULL<><>2012/04/02(月) 09:57:12.31 ID:NjGfIFoN<> AさんとBさんが、全く同じレコードを同時に更新したばあい
どちらかのデータが消えてしまうことになるとおもうのですが、
これを防ぐのにどういう方法が考えられますか?
<>
NAME IS NULL<>sage<>2012/04/02(月) 11:50:05.19 ID:???<> >>320
「ロストアップデート」でぐぐるといいよ <>
NAME IS NULL<>sage<>2012/04/02(月) 18:48:31.43 ID:???<> MySQLDumpで出力する時にwhere なりなんなりで条件で絞ることって出来ましたっけ? <>
NAME IS NULL<>sage<>2012/04/02(月) 20:17:41.87 ID:???<> そういうことしたいときは、SELECT 〜 INTO OUTFILE じゃなかろか。 <>
305<>sage<>2012/04/02(月) 22:03:31.14 ID:???<> ようやくネクストキーロックを理解しました
言葉では知ってたんだけど、実際に影響を受けたことがなくて、実感がなかった。
ところで、自分以外のスレッドの実行中クエリの分離レベルって、分かるのでしょうか。
SHOW PROCESSLISTで実行中のクエリは確認できるけど、そのクエリがどの分離レベルなのか、ってことです。
自分:SELECT @@tx_isolation;
グローバル設定:SELECT @@global.tx_isolation;
で調べることはできるけど、これでは他のスレッドは分からないです。
#変更していなければGLOBALという予測は出来ますが…
SHOW INNODB STATUSでも分離レベルは表示されないですよね? <>
NAME IS NULL<>sage<>2012/04/03(火) 00:25:19.43 ID:???<> >>324
MySQL 5.1+InnoDB Plugin、またはMySQL 5.5以上が必要。
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G
*************************** 1. row ***************************
trx_id: 3BCB01
trx_state: RUNNING
trx_started: 2012-04-03 00:22:46
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 3
trx_mysql_thread_id: 1
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 2
trx_lock_memory_bytes: 376
trx_rows_locked: 1
trx_rows_modified: 1
trx_concurrency_tickets: 0
trx_isolation_level: READ COMMITTED
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
1 row in set (0.00 sec) <>
NAME IS NULL<>sage<>2012/04/03(火) 00:27:05.95 ID:???<> >>322
そのまんま--whereっていうオプションがある <>
NAME IS NULL<><>2012/04/03(火) 08:05:06.57 ID:lbIOR0jo<> >>323
そうかも、、、と思いつつ質問させて頂きました^^;
けど
>>326
ぐぐったら
一定の条件を満たすレコードのみdumpする
$ mysqldump -u ユーザ名 -p -t "--where=カラム名='文字列'" データベース名 テーブル名 > ファイル名
使いた方としてふさわしいかどうかはともかく出来るんですね。
ありがとうございました <>
NAME IS NULL<><>2012/04/03(火) 10:00:58.31 ID:m9gZGzcZ<> テーブルの中にフィールドがずらーっと登録されてますが
あれのデフォルト表示の順番って変えれるものなんですか? <>
NAME IS NULL<>sage<>2012/04/03(火) 11:22:54.78 ID:???<> >>328
テーブル定義を変えればできるけど、一般的にはあまりやらない。
そもそも「SELECT *」をするなというのが定石。
mysql> SELECT * FROM t;
+------+--------+---------+
| i_id | i_name | i_price |
+------+--------+---------+
| 1 | sample | 100 |
+------+--------+---------+
mysql> ALTER TABLE t MODIFY i_name VARCHAR(100) AFTER i_price;
mysql> SELECT * FROM t;
+------+---------+--------+
| i_id | i_price | i_name |
+------+---------+--------+
| 1 | 100 | sample |
+------+---------+--------+
<>
NAME IS NULL<><>2012/04/03(火) 17:23:37.18 ID:7cc4mfVn<> MySQLってDBファイルにある全てのテーブル同士で共有するkeyを指定できたりします? <>
NAME IS NULL<>sage<>2012/04/03(火) 17:27:24.72 ID:???<> できます <>
NAME IS NULL<><>2012/04/03(火) 18:09:49.63 ID:7cc4mfVn<> おおおお!本当ですか!
MySQLに乗り換えてみます!
ちなみにそれは何とググったら出てきます?ちょっと色々と調べてみたいんで <>
NAME IS NULL<>sage<>2012/04/03(火) 19:47:57.55 ID:???<> 全てのテーブル同士で共有するkeyってなんだろう <>
NAME IS NULL<>sage<>2012/04/03(火) 19:53:55.03 ID:???<> primary keyじゃない? <>
324<>sage<>2012/04/03(火) 22:18:27.41 ID:???<> >325
ありがとうございます。5.0系だと手段はないんですね…
5.0のサポートが終わったのは分かっているのですが、
日本語全文検索の関係でtoritonnから離れられなくて…
後継?のぐるんがってどうなんでしょうか?
予算でがっつり削られたので、検証すら困難になってしまいました…
去年(ベータ版のころ)の検証時は性能不足で却下だったのですが、
リリースの度、機能と安定度は増したので期待しているのですが… <>
NAME IS NULL<>sage<>2012/04/03(火) 23:36:06.64 ID:???<> 【全文検索】groonga【senna後継】
http://kohada.2ch.net/test/read.cgi/php/1320128617/ <>
NAME IS NULL<>sage<>2012/04/04(水) 20:18:58.97 ID:???<> 生徒の出席テーブルを作りたいのですが
生徒IDと日付をテーブルにして、一日1回レコードに追加したいです。
すでに存在していたら追加したくないのですが
create table hoge(
seito int(11),
hiduke datetime
);
みたいなテーブルで
INSERT IGNORE hoge (seito, hiduke) VALUES($seitoid, DATE_FORMAT(CURDATE(),'%Y-%m-%d'));
としたいのですが
seito とhidukeの両方が一致した場合はINSERTしないようにするには、どのようなテーブルにしたらよいでしょうか <>
NAME IS NULL<>sage<>2012/04/04(水) 20:33:52.94 ID:???<> primary key(seito,hiduke)
とかw <>
NAME IS NULL<>sage<>2012/04/04(水) 20:37:06.28 ID:???<> その場合
hidukeはdatetimeではなくdateね
<>
337<>sage<>2012/04/05(木) 11:09:43.61 ID:???<> 両方ともprimary key にしておけば
両方に一致したときの挙動になるんですね
ありがとうございました。
<>
NAME IS NULL<><>2012/04/06(金) 19:30:54.35 ID:v6c3ekcx<> mysql の index にするカラムは、
リレーションにするカラムをindexにしといたら
とりあえずえんちゃうみたいな感じですか?
<>
NAME IS NULL<>sage<>2012/04/07(土) 17:13:27.88 ID:???<> >>341
とりあえずはそれでいい
応用はあとで痛い目見てからでいい <>
NAME IS NULL<><>2012/04/11(水) 16:24:42.41 ID:96JSVMn0<> ローカルでWEB制作してるDBとリモートで運営してるDBとが
別々に独立してるため、ローカルで作成したDBやレコードを
リモートDBにインポートしています。
まっさらな状態のリモートDBに、インポートはできるのですが
すでに同じ名前のDB、テーブルが入ってるところに
上書きとしてインポートする方法はないですか?
インポートツールはphpmyadmin です。 <>
NAME IS NULL<>sage<>2012/04/11(水) 16:36:23.19 ID:???<> >>343
元からあるテーブルをDROPして、それからインポートすれば
うまく出来ると思います <>
NAME IS NULL<><>2012/04/11(水) 16:51:57.73 ID:96JSVMn0<> >>344
いや、ですからドロップ済みにして、まっさらな状態でインポートしたら
いけるんですが、それだとリモートにたまったデータが
全部消えてしまうでしょ?
フィールドを増やすなどテーブルをいじる時は、まずリモートからいじって
それからローカルに移す(ローカルならまだ全部消しても問題ない)
しかないですかね。
<>
NAME IS NULL<>sage<>2012/04/11(水) 17:50:15.89 ID:???<> insert on duplicate key updateとか replace into ではダメなんすか? <>
NAME IS NULL<><>2012/04/12(木) 07:53:21.89 ID:9j8MO5uQ<> すみません、どうかどうか、知恵をお貸しください。
macOSX、MySQL4.1.22、MT3.2.1、
データベースに接続しようとした所、間違えてパスワードを変更してしまい、
直ぐに変更しなおしたものの、phpmyadminログイン時に
「#2002 - サーバが応答しません (あるいはローカルの MySQL サーバのソケットが正しく設定されていません)」
と言うエラーが出るようになってしまいました。
接続してあったMTのログイン画面にアクセスすると
「Got an error: データベース接続の設定に誤りがあります: エラーが発生しました: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)」
と言う表示が出ます。
ソケット(mysql.sock)が確認できないのでソケット関連の問題だとは思うのですが、
MySQL(phpmyadmin)を再起動しても、パスを設定してみても
ずっと同じエラーが出ています。
一体どうしたら良いのでしょうか?
初心者丸出しの質問ですみません、どうか宜しくお願い致します。 <>
NAME IS NULL<>sage<>2012/04/12(木) 10:29:10.69 ID:???<> >>347
mysqlは起動してます? <>
NAME IS NULL<>sage<>2012/04/12(木) 10:42:43.08 ID:???<> >>347
MAMP ?
リモート ?
<>
NAME IS NULL<><>2012/04/12(木) 10:49:52.51 ID:9j8MO5uQ<> >>348
ありがとうございます。恐らく起動しています。
サーバーに付いてたphpMyAdminは相変わらず「#2002 - サーバが応答しません〜」と言うエラーで入れませんが、
php.iniやrc.confを触りながらターミナルから入ってみたら、「Welcome」と言われたので、どうやらmySQL自体は
今は動いている?ようです。(違っていたらすみません)
MTログイン画面の「Got an error: データベース接続の〜」と言うエラーも解消されログインできようになりました。
ソケット自体は確認できませんが、ターミナルでパスを調べたUNIX socket「/tmp/mysql.sock」を入れています。
ただ、phpMyAdminの「#2002〜ソケットが正しく設定されていません)」のエラーは相変わらずです…。 <>
NAME IS NULL<><>2012/04/12(木) 10:51:34.13 ID:9j8MO5uQ<> >>349
ありがとうございます。
VPSのウェブサーバーです。と言う回答で大丈夫でしょうか…。 <>
NAME IS NULL<><>2012/04/12(木) 14:50:04.40 ID:DR3AaSQz<> 不動産系ポータルサイトをつくろうと思います。
賃貸と売買があります。
7割くらい両方共通するような似たようなフィールド項目が並びますが、
賃貸と売買では名称が違ったり、賃貸だけにしか無いフィールド
売買にしかないフィールドがあったり微妙に違います。
賃貸と売買のテーブルは別々にしたほうがよいですか?
<>
NAME IS NULL<>sage<>2012/04/12(木) 17:17:21.27 ID:???<> おれなら2つのテーブルに分ける
3つには分けない <>
NAME IS NULL<>sage<>2012/04/12(木) 17:19:34.76 ID:???<> 同じ意味の要素は同じ名前にした上で、テーブルをふたつにわける
リレーショナルな設計はしない <>
NAME IS NULL<><>2012/04/12(木) 18:33:46.84 ID:DR3AaSQz<> 回答有難うございます。
分けることにしました。
ただ、都道府県テーブルとか、駅名テーブルとかにリレーションさせる場合は
別に、よっぽど、賃貸と売買の取り扱いが違わない限り
同じ物を参照しても問題ないですよね?
<>
NAME IS NULL<>sage<>2012/04/12(木) 20:34:27.51 ID:???<> そういうのは分けていいんじゃね?
「ちょっと似てるけどあとで意味変わるかも」
みたいなのをまとめて正規化すると
あとでろくな目にあわないからな <>
NAME IS NULL<><>2012/04/13(金) 12:40:50.71 ID:iVfEgpfV<> MySQL5.1について質問があります。
DBサーバA(192.168.0.10)
---
・テーブルA
---
DBサーバB(192.168.0.20)
---
・テーブルA
・テーブルB
---
DBサーバC(192.168.0.30)
---
・テーブルA
・テーブルC
---
このような構成のサーバがあったとします。
目的は、フィールド構成が同一のテーブルAを、
DBサーバBとDBサーバCで共有したいということです。
DBサーバAを共通で使うサーバとして、
これを起点にBとCのテーブルAを常に同一の状態にしておくことは可能でしょうか。
それとも、DBサーバAは不要なのでしょうか。
なにかよいアイディアがありましたら、ご教授ください。m(_ _)m <>
NAME IS NULL<>sage<>2012/04/13(金) 13:08:26.45 ID:???<> >>352
設計スレのがいんじゃね?
http://toro.2ch.net/test/read.cgi/db/1331558806/
<>
NAME IS NULL<>sage<>2012/04/13(金) 18:00:20.01 ID:???<> >>357
可能だよ
レプリケーション
夜の駐車場で <>
NAME IS NULL<>sage<>2012/04/14(土) 18:58:10.73 ID:???<> 質問です。
顧客テーブル
- 顧客id
- (その他、名前、誕生日など)
電話番号テーブル
- 主キー
- 顧客id (外部キー)
- 電話番号
- (その他、備考など)
メールアドレステーブル
- 主キー
- 顧客id (外部キー)
- メールアドレス
- (その他、備考など)
上のような3つのテーブルがあるとします。
GUI上で特定の顧客情報を表示した際に、電話番号とメールアドレスが複数個表示出来るわけですが、
「この電話・メールを同一リストにごちゃまぜで表示し、さらにその順序も制御させたい」
のです。これは、連絡を取る際の優先順位みたいなものです。
こういう機能を考慮すると、
* 案1
以下のような、顧客と電話・メールとの中間に入るテーブルをつくり、
(詳細は省略)
連絡先テーブル (新規)
- 連絡先id (主キー)
- 顧客id (外部キー)
- 順番 (顧客idが同じレコードは、このフィールドを重複しないようにする)
電話番号テーブル
- 連絡先id (外部キー)
メールアドレステーブル
- 連絡先id (外部キー)
* 案2
電話番号テーブルとメールアドレステーブルそれぞれに順番のフィールドを追加し、重複に注意する
上の2つの案を思いつきました。
案1は、より正規化された形だと思うが、実装とかが面倒
案2は、正規化されておらず気持ち悪いが、案1よりは実装が楽?
こういう場合、案1と案2のどちらかがいいか、みなさんの考えを教えてください。
また、ほかの実装例などがあれば、ぜひとも教えてください。
どうぞよろしくお願いします。 <>
360<><>2012/04/14(土) 18:59:04.31 ID:8VcWjWCG<> すいません、sageてしまいました。 <>
NAME IS NULL<>sage<>2012/04/14(土) 20:12:19.28 ID:???<> >>360
案1ってそこから連絡先を引っ張るSQLが思いつかない。
idだけ見て電話なのかメールなのかが分からない。
案2はお作法とは違うかもだけどそんなに問題ない気がするなあ。
SELECT id, 電話番号, NULL, ... , 表示順 FROM 電話
UNION ALL
SELECT id, NULL, メールアドレス, ... , 表示順 FROM メール
ORDER BY 表示順; <>
NAME IS NULL<>sage<>2012/04/14(土) 20:42:39.34 ID:???<> >>360
なんで案2が「正規化されてない」と思ったんだ?
重複に注意する、ってのがちょっと意味がわからんが。 <>
NAME IS NULL<>sage<>2012/04/14(土) 21:30:29.65 ID:???<> 今気付いたが、設計スレ落ちてんだな。即死と言うには長い気もするが。 <>
NAME IS NULL<><>2012/04/14(土) 21:33:20.25 ID:8VcWjWCG<> >>362
ありがとうございます。
idだけ見ても電話なのかメールなのかが分からない、というのは、確かにその通りですね。
案1にて、一応顧客id指定で、全メアドと電話番号を一緒くたに表示できることだけ、確認しました。
表示順云々はよくわからないのですが。
SELECT [顧客テーブル].顧客id, [電話番号テーブル].電話番号 AS 電話かメール
FROM (顧客テーブル INNER JOIN 連絡先テーブル ON [顧客テーブル].顧客id=[連絡先テーブル].顧客id) INNER JOIN 電話番号テーブル ON [連絡先テーブル].連絡先id=[電話番号テーブル].連絡先id
WHERE ((([顧客テーブル].顧客id)= xxx ));
UNION
SELECT [顧客テーブル].顧客id, [メールアドレステーブル].メールアドレス AS 電話かメール
FROM (顧客テーブル INNER JOIN 連絡先テーブル ON [顧客テーブル].顧客id=[連絡先テーブル].顧客id) INNER JOIN メールアドレステーブル ON [連絡先テーブル].連絡先id=[メールアドレステーブル].連絡先id
WHERE ((([顧客テーブル].顧客id)= xxx ));
また、お作法ってのが気になるのですが、教えていただけるとありがたいです。
>>363
失礼しました。
冗長性をなくす、という意味で正規化、と言ってしまいましたが、これ正規化じゃないですね。
重複に注意するってのは、電話番号とメアドの2つのテーブルで、同一の顧客idなものは、順番の数値が重複しちゃダメって
いう意味でした。
しかし、よく考えたら、この2つのテーブルで、外部キーである、同じ連絡先idを参照しちゃダメっていうのもありました。
冗長性を考えていたら、逆に冗長性はあるけど、実装が楽かもしれない方法を思いついたので、のせておきます。
* 案3
- 電話番号テーブルとメールアドレステーブルは削除
- 新たに連絡先テーブルを作成
- フィールドは、「連絡先フィールド」の1つにいっしょくたに書く、または、「電話番号フィールド」と「メールアドレスフィールド」の2つを作り、どちらかだけ使う
(出来れば、電話番号テーブルと、メールアドレステーブルに複数個のフィールドを作るかもしれないため、この方法は避けるべきなのかもしれません)
よろしくお願いします。
<>
360, 361, 365<>sage<>2012/04/14(土) 21:52:11.92 ID:???<> いろいろググっていたのですが、自分が詰まっていることが、
オブジェクト指向とSQLとの親和性、についてであることが分かりました。
この辺の議論はすでにあるようですね。
ここら辺を切り口に、いろいろ調べてみたいと思います。
ひとまず質問を取り下げます。
失礼しました。 <>
NAME IS NULL<>sage<>2012/04/15(日) 12:33:26.90 ID:???<> 案1がいい <>
NAME IS NULL<><>2012/04/16(月) 12:05:52.33 ID:Vxx0CCgx<> http://www.hideblog.net/nikkis/show/158/
を参考に さくらインターネットサーバーでmysqlを自動バックアップするよう
CRONで設定しました。
定期的に、mysql.120416.gz というようなファイルが生成されますが、
サイズが 1kb しかありません。
これは、バックアップに失敗してると思っていいのでしょうか。 <>
NAME IS NULL<>sage<>2012/04/16(月) 19:36:10.13 ID:???<> そのファイルの中身見てみりゃいいじゃん。 <>
NAME IS NULL<>sage<>2012/04/16(月) 23:09:12.73 ID:???<>
whereサブクエリanyselectがおもいんだけどなんとかなんない?
CGIで入れ子ループしたほうが劇的に速いてのが納得いかんよ <>
NAME IS NULL<>sage<>2012/04/16(月) 23:24:30.81 ID:???<> たぶんなんない <>
NAME IS NULL<>sage<>2012/04/16(月) 23:33:20.30 ID:???<> この辺は?
なぜMySQLのサブクエリは遅いのか。
http://nippondanji.blogspot.jp/2009/03/mysql_25.html <>
NAME IS NULL<>sage<>2012/04/17(火) 09:42:36.43 ID:???<> >>370
SQL晒せるなら書き換え案を考えてみる <>
NAME IS NULL<><>2012/04/17(火) 10:14:49.30 ID:YLn+46Gs<> >>370
any とか in とかは、数が多くなると重いよね。
もしかしたら、
世田谷区(30件) 、足立区(22件)
みたいなカウント処理を考えてる?
<>
NAME IS NULL<><>2012/04/17(火) 11:51:18.78 ID:z+5HaJWD<>
>>373
>>374
いまPerlでこんな処理をしています
table_aには10万行程度
table_bには40万行程度
$bbsd2 = $dbh -> prepare("SELECT R_no from table_a where T_no = '$linkno' order by R_no");
$bbsd2 -> execute;
while( @res2 = $bbsd2 -> fetchrow ) {
$bbsd = $dbh -> prepare("SELECT * FROM table_b where No='$res2[0]'");
$bbsd -> execute;
while( @res = $bbsd -> fetchrow ) {
処理
}
$bbsd -> finish;
}
$bbsd2 -> finish;
}
Perl上でループselectを使わないようサブクエリを使って処理にすれば早くなるかなと思ったのだけど逆にめちゃくちゃ重くなってしまったんですよね
SELECT * FROM table_b where No=ANY(select R_no from table_a where T_no='$linkno')
<>
NAME IS NULL<>sage<>2012/04/17(火) 12:41:44.54 ID:???<> >>375
これで試してみて。
SELECT b.*
FROM table_b b INNER JOIN
(SELECT DISTINCT R_no FROM table_a WHERE T_NO = $linkno) a
ON b.No = a.R_no
ORDER BY b.No
<>
NAME IS NULL<>sage<>2012/04/17(火) 13:04:15.24 ID:???<> >>376
天才現る…!
ビックリするくらい早くなりました!ありがとうございます。
INNER JOIN DISTINCTあたりが勉強不足ですので勉強したいと思います。
もしよければ簡単に説明していただいてもいいですか? <>
NAME IS NULL<>sage<>2012/04/17(火) 13:23:44.06 ID:???<> 自分なりにググリながら解釈してみました
SELECT * FROM table_b where No=ANY(select R_no from table_a where T_no='$linkno')
の場合はサブクエリの検索結果をもとにさらにtable_bの全検索
>>376
あらかじめTnoと$lingnoが同一のものを結合してダブりを除去してソート
こんな考え方もあるのか・・・解釈があってるのかアレですがwwwwwww <>
NAME IS NULL<>sage<>2012/04/17(火) 13:52:50.01 ID:???<> >>378
それで合ってるよ。
ちなみに現在開発中のMySQL 5.6で最初のANYをつけたクエリでも速くなる
(ANYの中身を最初に評価するMaterialization最適化という機能が入る)ので、
まあバッドノウハウだね。5.6出たら忘れておk
<>
NAME IS NULL<>sage<>2012/04/17(火) 14:02:13.82 ID:???<> >>378
ごめん合ってなかった。
× サブクエリの検索結果をもとにさらにtable_bの全検索
○ table_bから1件もってくるごとにtable_aを全件検索
<>
NAME IS NULL<>sage<>2012/04/17(火) 14:54:28.06 ID:???<> わかりやすい説明ありがとうございます! <>
NAME IS NULL<><>2012/04/18(水) 22:48:52.43 ID:v4Lo1reV<> PRIMARY KEYがユニークかどうかの処理ってMySQLに任せていいんですよね?
事前にチェックする必要はないですよね? <>
NAME IS NULL<>sage<>2012/04/18(水) 23:05:09.04 ID:???<> >>382
MySQLに任せておけばすべて問題ありません <>
NAME IS NULL<>sage<>2012/04/18(水) 23:35:10.73 ID:???<> >>383
ありがとうこざいます! <>
NAME IS NULL<>sage<>2012/04/19(木) 13:55:11.57 ID:???<> 【質問】
Win7のPCに、Windows版のMySQL5.5をインストールしています。
古いVerのMyODBCを利用しています。
MySQL5.5側で、old_passwordの設定を行い、古いVerのMyODBCで用意した該当DB用のDNSの接続は確認できています。
(1)
Access2000で、MySQL5.5の該当DBの任意のテーブルをインポートorリンクしようとした際、
古いVerのMyODBCを利用すると「ODBC--呼び出しが失敗しました」とエラーが表示され
インポートorリンクが出来ません。
※Access2000から、同様のverのMyODBCを利用して、Mysql3.*の他のDBの任意のテーブルを
インポートorリンクすることは成功しています。
接続に失敗しているのだとは思うのですが、Access2000で、
(1)のインポートorリンクを成功させるための方法はありますでしょうか?
「環境」
OS:Windows7 32bit
MySQL5.5 (Windows版)
MyODBC 3.51.04
Access2000
お手数をお掛けしますが、よろしくお願いします。 <>
385<><>2012/04/19(木) 13:56:08.00 ID:Ib029TrQ<> すみません
age
【質問】
Win7のPCに、Windows版のMySQL5.5をインストールしています。
古いVerのMyODBCを利用しています。
MySQL5.5側で、old_passwordの設定を行い、古いVerのMyODBCで用意した該当DB用のDNSの接続は確認できています。
(1)
Access2000で、MySQL5.5の該当DBの任意のテーブルをインポートorリンクしようとした際、
古いVerのMyODBCを利用すると「ODBC--呼び出しが失敗しました」とエラーが表示され
インポートorリンクが出来ません。
※Access2000から、同様のverのMyODBCを利用して、Mysql3.*の他のDBの任意のテーブルを
インポートorリンクすることは成功しています。
接続に失敗しているのだとは思うのですが、Access2000で、
(1)のインポートorリンクを成功させるための方法はありますでしょうか?
「環境」
OS:Windows7 32bit
MySQL5.5 (Windows版)
MyODBC 3.51.04
Access2000
お手数をお掛けしますが、よろしくお願いします。 <>
385<><>2012/04/19(木) 14:04:29.83 ID:Ib029TrQ<> ・・・
○DSN
×DNS
orz <>
NAME IS NULL<>sage<>2012/04/19(木) 18:32:58.62 ID:???<> MySQL 5.0.95 で
slow queryを調べようと
/etc/my.confに
[mysqld]
log-slow-queries=/hoge/myslow.log
long-query-time=1
log-queries-not-using-indexes
log-slow-admin-statements
を追記してmysqlを再起動したところ、ログがたくさん出力され
# Query_time: 0 Lock_time: 0 Rows_sent: 1 Rows_examined: 126
このように Query_time: 0 まで出力されています。
long-query-time=2
にすると
SELECT sleep(3);
とかにしても出力されません。
variablesを見ると
mysql> show variables like 'long%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 1 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'log%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log | OFF |
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| log_error | |
| log_queries_not_using_indexes | ON |
| log_slave_updates | OFF |
| log_slow_queries | ON |
| log_warnings | 1 |
+---------------------------------+-------+
こうなっているのですが、なぜ0秒のコマンドまで出力されているのでしょうか <>
NAME IS NULL<>sage<>2012/04/20(金) 00:57:06.77 ID:???<> >>388
log-queries-not-using-indexes は、
インデックスを使っていないクエリをたとえ0秒でも出すオプションだから。 <>
388<>sage<>2012/04/20(金) 07:35:11.33 ID:???<> >>389
出力されていたのはインデックスを使っていたクエリだと思うのです。
同じ条件で
long-query-time=2
に変更しただけで 何も出力されなくなるので
no-indexのクエリではないと思います。 <>
NAME IS NULL<>sage<>2012/04/20(金) 12:27:55.54 ID:???<> >>390
うーん分からん。
# Query_time: 0 Lock_time: 0 Rows_sent: 1 Rows_examined: 126
126行スキャンして1行しか出さないクエリと言っているので
これについてはフルスキャンしてるんじゃないかなあ。
その後出なくなったのは、例えばクエリキャッシュが効いていたとか
別の理由じゃないかなあ。 <>
385<><>2012/04/21(土) 14:41:12.84 ID:1uIjPpQr<> ODBCの設定で、トレースをしてみました
ACCESS2000で、MySQL5.5(Win7)のテーブルをインポートorリンクした場合
テーブル名に「_」(アンダーバー)が入力されていると、
ワイルドカード?として認識されるため、「\_」と変換されるみたいです。
例)
DIAG [S1000] [MySQL][ODBC 3.51 Driver][mysqld-5.5.22]Table 'testtest_db.seq\_mst' doesn't exist (1146)
MySQL3.*のテーブルでは、「_」(アンダーバー)は、SQL文を作成する際、
そのまま使われていました。
ODBC 3.51 Driver
MySQL 5.5
Access2000から上記の環境のODBCを利用して、MySQL5.5のDB内のアンダーバー付テーブルをインポートorリンクするには、どのような手段がありますでしょうか? <>
NAME IS NULL<><>2012/04/21(土) 16:55:10.15 ID:29j42DcK<> >>385
これじゃないの?
odbcad32.exe
http://blog.tpc.jp/2010/11/windows-2008-r2-64-32-odbc.html
<>
385<><>2012/04/21(土) 17:52:16.75 ID:1uIjPpQr<> >>393
ありがとうございます
Windows版のMySQLサーバ(5.5)をインストールしている環境は
Windows7 32bit版で、64ビット問題とは違うようです。
・該当DSNを使用したODBC接続は成功しています
・プログラム(VB6で作成)から、該当のDSNを使用してODBC接続を行い
名前にアンダーバー(スコア)の入ったテーブルの参照も確認出来ています。
「ODBC--呼び出しが失敗しました」というエラーが発生するタイミングは
今現在で把握しているのは、
Access2000からMySQL5.5のDB接続用のMySQL ODBC 3.51ドライバで作成したDSNを使い
テーブルのリンクorインポートを行う際、
テーブル名にアンダーバー(スコア)の入ったテーブルのみです。
アンダーバー(スコア)が入っていないテーブルはインポートもリンクも可能です。
また、Access2003でも試しましたが、同様のエラーが発生しました。
それよりも新しいVerのAccessはないため試していません。
Access2000の設定、もしくは、MySQL ODBC 3.51 Driverの設定、もしくはその他の方法で、
上記のエラーを避ける手段を探しています。
※トレースで出力したログのエラー箇所
MSACCESS 9cc-960 EXIT SQLColumnsW with return code -1 (SQL_ERROR)
HSTMT 088E18D0
WCHAR * 0x00000000 [ -3] <empty string>
SWORD -3
WCHAR * 0x00000000 [ -3] <empty string>
SWORD -3
WCHAR * 0x00128C9C [ -3] "seq\_mst\ 0"
SWORD -3
WCHAR * 0x00000000 [ -3] <empty string>
SWORD -3
DIAG [S1000] [MySQL][ODBC 3.51 Driver][mysqld-5.5.22]Table 'testtest_db.seq\_mst' doesn't exist (1146) <>
NAME IS NULL<><>2012/04/21(土) 18:36:09.33 ID:GHSqy5Mv<> 多分 答えにならないと思うが
ODBC5.1でも同じだろうか?
<>
NAME IS NULL<>sage<>2012/04/23(月) 07:33:36.11 ID:???<> You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"20120409003341", created="2012-04-09 00:33:45"' at line 1
これは何のエラーですか? <>
385<><>2012/04/23(月) 09:22:00.30 ID:ppMwU/3N<> >>395
レスありがとう御座います。
MySQLサーバ5.5 (Windows)
サーバインストールマシン:win7 32bit
クライアントマシン:win7 32bit
ODBC5.1
この環境で、Access2000からODBC接続でリンクを実行したところ、
テーブル名にアンダーバー(スコア)が入っていても成功しました。
もし、ODBC3.51ドライバから同様の作業が可能か分かりましたら、ご教授いただければと思います。
***
ちなみにで申し訳ないのですが
クライアントマシン:win2k sp4 から、ODBC5.1ドライバを使用することは可能でしょうか?
win2kの端末から実行するとシステムエラー127によりDB(MySQL5.5、MySQL3.23いずれも)への接続が出来ませんでした。
検索を念入りにしている訳ではなく横着をして申し訳ないのですが、
ODBC5.1は始めての使用でして、仕様として無理なのか設定次第で可能なのかが分かれば教えていただければと思います。
>>396
ついでの記述で申し訳ないですが、構文エラーだと思われます。
実行時のSQL文をデバック取得し、201204・・・の前くらいから、構文がおかしくないかチェックするのがよいと思います。 <>
385<><>2012/04/24(火) 14:30:31.90 ID:MOjnp39Z<> >>394
>win2kの端末から実行するとシステムエラー127によりDB(MySQL5.5、MySQL3.23いずれも)への接続が出来ませんでした。
自己解決。
MyODBC5.1.10を使用したのですが、5.1.8より後のVerからWin2kで認識出来ない
ようです。これが仕様なのか、バグなのかは分かりません。(バグのような気は
しますが) MySQL ODBC 5.1.8をインストールしたところ、MySQL5.5に接続できました。
※ただし、対応がMySQL4以降のため、MySQL3.23.55のサーバにはアクセス
出来ませんでした。またその際に、Win2kの端末でAccess2000からODBC5.1.8
接続でのリンクは成功しました。
ちなみに、環境的にMySQL3.23サーバをメイン(3台)で使用し、クライアントも
Win2kが二十数台残っている状況なので、所見としてMySQL5.5サーバを導入、
また、MyODBC5.1を使用するのは、安定動作の面で不安を感じます。
常に全てを最新に保てる環境ではないので、MySQL5.5の導入は出来れば見送り
たいと考えるようになりました。
※引き続き、MySQL5.5サーバで、Access2000からMyODBC3.51を使用して、
テーブル名にアンダーバー付でリンク貼る方法をご存知の方がいましたら、
教えてください。
※ちなみに、今回導入しようとしているMySQL5.5は、DB(MySQL3.23)サーバ
として使っているサーバの保守が切れるので、新しいサーバを念のため購入
した際、購入希望の機種がMySQL3シリーズは動作できない可能性がある。
と脅されましたので、MySQL5.5を社内の環境で運用可能か調査していました。
ついでの質問で申し訳ないのですが、
PRIMERGY TX150 S7 Linux (OS:RedHat Enterprise Linux 5.6)こちらに、
MySQL3.23のバージョン(もしくはMySQL4.*)をインストールして使っている人が
もしいましたら、評価を教えてもらえると幸いです。
長々とすみません。 <>
NAME IS NULL<>sage<>2012/04/24(火) 18:08:59.44 ID:???<> >>398
MySQL 4.0は動いた。
MySQL 3.23はたしかビルドが通らなかったと思う。
新しいサーバがRHEL 5.6なら、仮想化を使えばいいのでは。
今の環境をそのまま仮想環境に移行して、バージョン塩漬け。 <>
385<><>2012/04/25(水) 15:50:51.33 ID:ISxy2/+A<> >>399
レスありがとうございます。
ビルドが通らないとなると・・・スパッと諦めて他の方法を検討します^^;
仮想化を必要としてなかったため経験ないですが
旧サーバのOSがインストール出来れば、MySQL3.23.55を試してみます。
ダメなら、MySQL4.0でサーバ構築するか。
いずれにしても、大変参考になりました。
ありがとうございます。
しかし、こういってはなんですがたかだか10年程度の世代の違う環境が混在しただけで
環境の更新に苦労するのが・・・疲れます。
システム担当としては失格なのでしょうが、自分の能力が世の中についていけてないのをヒシヒシと感じます^^; <>
NAME IS NULL<>sage<>2012/04/25(水) 16:35:32.89 ID:???<> その10年でMySQL AB社は2回買収されました。
プロダクトが残っているだけでも奇跡
<>
NAME IS NULL<>sage<>2012/04/25(水) 18:56:00.16 ID:???<> 5年経ったらPCもシステムも切り捨て 人も
<>
NAME IS NULL<>sage<>2012/04/25(水) 22:22:23.70 ID:???<> そしてブラックボックスになってしまったプログラムだけが動いている…と w <>
NAME IS NULL<><>2012/04/27(金) 00:12:55.19 ID:zlgl+19I<> Mysqlのインストはyumでかんたんにできる(まえはソースからいれたかも)
だけど、4年くらいいっさいやってなかったら、
すっかりMySQLのSQL文を忘れてしまい、覚えようとしても覚えられません。
で、いい本やサイトを探してます。
要は初心者というかサルでも分かるような本やサイトで、
できれば本ならカラーだと(のほうがみやすい)助かります。
分厚い本やページ数が多いサイトでもかまりません。
おすすめの本やサイトご存知、ないのでしょうか?
よろしくお願い申し上げます。 <>
404<>sage<>2012/04/27(金) 00:16:06.56 ID:???<> 誤字すみません。
キーボードがいかれてて・・・
<誤>
かまりません。
↓
<正>かまいません。
<誤>
おすすめの本やサイトご存知、ないのでしょうか?
↓
<正>
おすすめの本やサイト、ご存知のかたいらっしゃいませんでしょうか?
よろしくお願い申し上げます。 <>
NAME IS NULL<>sage<>2012/04/27(金) 12:04:42.47 ID:???<> >>404
オライリーのやつでいいよ
クックブック上下買え <>
NAME IS NULL<><>2012/04/28(土) 00:51:20.89 ID:i08GbiU/<> phpからMySQLに接続して処理させていますが、一つのphpファイルの中で
mysql_connectの処理をどう配置するかで迷っています。
処理の中では、データベースから読み込む関数と書き込む関数と処理を分けてるのですが、
読み込みと書き込みそれぞれの処理で一回一回接続・切断をしたほうがよいものでしょうか?
それとも、1つのphpのファイルの中で、1回接続して全ての処理を終わらせてから切断した方が
よいものなのでしょうか? <>
NAME IS NULL<>sage<>2012/04/28(土) 02:45:31.09 ID:???<> もちろん後者
クラスでまとめれば完璧
<>
NAME IS NULL<><>2012/04/28(土) 08:28:13.03 ID:i08GbiU/<> >>408
レスありがとうございます。 後者で組んでみます。
もう一つ質問させてください。
書き込む時間をカラムに入れ込んでいるのですが、時間の取得はphpのdate関数を使うのと
データベースのnow関数を使うのでは、どちらがサーバーに負担が少ないのでしょう。
あまり大差はないのでしょうか? <>
NAME IS NULL<>sage<>2012/04/28(土) 10:01:23.20 ID:???<> 横槍です。
書き込み時間をセットするカラムがあるんですよね?
NOW関数か、phpのdate関数かによるサーバ側の負荷は、
出力する形式次第だけの問題な気がします。
出力形式が一緒であれば、負荷は一緒だと思いますし。
クライアント側では、どちらを使うかによって若干の違いがあるかもしれません。
また、NOW関数が何のNOW関数かによって差が出るかもしれません。
詳しく考えたことがないので曖昧ですが。
勘違いしたこと言ってたらごめんなさい。 <>
NAME IS NULL<>sage<>2012/04/28(土) 11:29:26.79 ID:???<> >>409
どっちがと言うと、確かに微々たる物でも違いはあるだろうけど、
こんなとこでそんなの聞いてる段階の人が気にするような違いじゃあないよ。
そんなの気にするよりは、記録したい時間は
・厳密にアクセスを受け付けた時点のものか(ならばPHP側で時刻取得)
・厳密に最終的に記録した時点のものか(ならばDB側で)
とか考えるのが先じゃない?
他に、一回で複数レコードの記録が発生するとき、そのレコード達に記録される
時刻は、アクセス受付時のもの一つに揃って欲しいかそうでもないかとか。
そういう業務上の論理をすっ飛ばして、どっちがサーバ負荷が低いだろうかなんて
気にするのは馬鹿らしいよ。
論理の必要性を踏まえて、その上でとことん効率を求めなければならない高負荷サイトの
実装/管理者なら気にするところだろうけど、質問内容からすると貴方はそうじゃないでしょ?
気にしなさんな。
そんなに厳密にどっちの時点? ってのがどっちでもいいなら、
now()使っとくのが簡単だよ。 <>
NAME IS NULL<>sage<>2012/04/28(土) 13:47:24.90 ID:???<> 計測してみるのが一番確実だよね <>
NAME IS NULL<><>2012/04/30(月) 08:50:09.71 ID:FgtJ2kL6<> SELECT EXTRACT(YEAR FROM "1999-07-02");
これを実行すると
エラー
実行した SQL:
SELECT EXTRACT(
YEAR
FROM "1999-07-02"
)
LIMIT 0 , 30;
MySQLのメッセージ:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM "1999-07-02" )
LIMIT 0, 30' at line 1
となります。
何故でしょう?
<>
NAME IS NULL<>sage<>2012/04/30(月) 09:49:08.93 ID:???<> シンタックスが間違ってるから <>
NAME IS NULL<>sage<>2012/04/30(月) 10:13:55.08 ID:???<> >SELECT EXTRACT(YEAR FROM "1999-07-02");
エラー無しで 1999がちゃんと返ってきたけど
ver 5.5.19 <>
NAME IS NULL<>sage<>2012/04/30(月) 11:03:04.98 ID:???<> check the manual that corresponds to your MySQL server version for the right syntax
って親切に書いてあるじゃん <>
NAME IS NULL<>sage<>2012/05/01(火) 20:09:24.63 ID:???<> mysql cluster を入れようとしても
$ sudo yum install --enablerepo=epel,remi,dag mysql-cluster.x86_64
Package mysql-cluster is obsoleted by mysql, trying to install mysql-5.5.23-1.el5.remi.x86_64 instead
って言われて、 mysql と mysql-libs くらいしか入らない。
パッケージ管理したいから make したり、http://dev.mysql.com/doc/refman/5.5/en/mysql-cluster-install-linux-binary.html みたいな入れ方をしたくないんだよなぁ。
centos 5.6 なんだけど
http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-Cluster-7.2/
から
MySQL-Cluster-client-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-devel-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-embedded-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-server-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-shared-compat-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-shared-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-test-gpl-7.2.5-1.rhel5.x86_64.rpm
あたりを落としてきて、入れるしかない?
でも、本番サーバは centos6で、そうなると、そっちの環境は
MySQL-Cluster-test-gpl-7.2.5-1.el6.x86_64.rpm
の、 el6 でいいのかな? <>
NAME IS NULL<>sage<>2012/05/01(火) 21:50:49.48 ID:???<> http://dev.mysql.com/downloads/cluster/
ここから落としたやつを rpm のパッケージにするのかな。
どうやってやればいいですかね。。 <>
NAME IS NULL<>sage<>2012/05/01(火) 22:23:03.97 ID:???<> 本家のもパッケージ管理されてると思うけど、yumで管理したいってこと?
iijあたりをローカルにミラーしてcreaterepoすればいいんじゃないの <>
NAME IS NULL<>sage<>2012/05/01(火) 23:06:34.41 ID:???<>
suse 用の sles や、debian 用の deb はあったけど、 centos 用の rhel がなくて、、結局
http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-Cluster-7.2/
から rhel のやつをとってきて
MySQL-Cluster-client-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-devel-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-embedded-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-server-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-shared-compat-gpl-7.2.5-1.rhel5.x86_64.rpm
MySQL-Cluster-shared-gpl-7.2.5-1.rhel5.x86_64.rpm
らを
sudo rpm -ivh MySQL-Cluster-*
でいれますた。 <>
NAME IS NULL<>sage<>2012/05/02(水) 00:00:58.68 ID:???<> >>410>>411
お礼が遅くなりました
レスありがとうございます。
ご指摘の通り、出力するタイミングを考えて(使用側はさほど厳密性がいらないようですが)
now()で書き込む直前に処理させようと思います
<>
NAME IS NULL<><>2012/05/03(木) 04:07:28.24 ID:tS/TQ5Jx<> すみません、初歩的な質問かと思いますが、よろしくお願い致します。
MTのサーバーの移転作業で日本語が「???」となる文字化けで困っています。
文字コード等の問題ということは分かってきたのですが、
共有サーバー(さくら)なので「my.cnf」?等のファイルが直接触れず、コードの変更ができません。
phpMyadminやSSHのコマンドラインから変更することは可能なのでしょうか?
それともVPSサーバーなどに移るのが得策でしょうか。
ちなみに移転前の現在はVSPサーバーを使っています。(人様が導入しました)
PHP 5.2.17 MySQL 5.5 MT 3.21ja mac OSX 10.6.8
どうぞ宜しくお願い致します。 <>
NAME IS NULL<>sage<>2012/05/03(木) 14:08:31.45 ID:???<> >>422
情報小出しにすると解決しないよ。
現行のmy.cnfとダンプファイルをさらせる範囲で、
あと移行先のMySQLバージョン、my.cnfぐらい。 <>
NAME IS NULL<><>2012/05/03(木) 18:46:37.77 ID:tS/TQ5Jx<> 【現行の環境】PHP 4.4.7 MySQL 4.1.22 MT 3.21 ja
【移転先環境】PHP 5.2.17 MySQL 5.5 MT 3.21 ja
【my.cnf(現行VPSサーバー)】
[client]
user=xxx(伏せます)
default-character-set = ujis
[mysqld]
default-character-set = ujis
[mysqldump]
default-character-set = ujis
移行先のmy.cnfはさくらサーバーだからなのか、そもそもmysql系統のファイル置き場が見つけられません。
ダンプファイル…よく分かっていないのですが、
-- phpMyAdmin SQL Dump
-- version 2.11.10
-- http://www.phpmyadmin.net
(略)
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
(略)
ENGINE=MyISAM DEFAULT CHARSET=ujis AUTO_INCREMENT=6 ;
(※各テーブルのCHARASETはujisのようですが、
文中のアマゾンへのリンク等でutf8と言う文字も見つけました)
あと参考になるかわからないのですが…。
【現行のCHARASET?】
character_set_client utf8
character_set_connection utf8
character_set_database ujis
character_set_results utf8
character_set_server ujis
character_set_system utf8
character_sets_dir /usr/local/mysql-4.1.22/share/mysql/charsets/
【移転先CHARASET?】
character_set_client utf8
character_set_connection ujis
character_set_database ujis
character_set_filesystem binary
character_set_results utf8
character_set_server ujis
character_set_system utf8
character_sets_dir /usr/local/share/mysql/charsets/
以上です。宜しくお願い致します。 <>
NAME IS NULL<>sage<>2012/05/04(金) 00:50:03.87 ID:???<> >>424
mysqldump --default-character-set=ujisで
明示的にEUC-JPで引っこ抜いてみて。今はUTF-8になってると思う。 <>
NAME IS NULL<><>2012/05/04(金) 01:51:22.17 ID:sglJpw9f<> >>425
ありがとうございます。
すみませんが、これはphpMyadminのSQLに入れて実行すると良いのでしょうか?
#1064 - You have an error in your SQL syntax; 〜 と出てしまって実行できません…。
<>
NAME IS NULL<><>2012/05/04(金) 01:55:54.64 ID:sglJpw9f<> 追加で、ターミナルSSHで実行としようとしても反応がありません…。 <>
NAME IS NULL<>sage<>2012/05/04(金) 06:34:11.93 ID:???<> >>427
SSHから実行するんだけど、足りないオプションは自分で補ってね。
-u ... -p --all-databasesとか <>
NAME IS NULL<><>2012/05/04(金) 16:58:47.48 ID:mUAVOCUR<> <Sale>中国語版の書籍<IT|3D|NN|理系|上古漢語などなど>(格安) 280円より
http◎lang-8○com/194279/journals/1457398/ <>
NAME IS NULL<>sage<>2012/05/04(金) 20:04:29.39 ID:???<> MySQL5.0を使っていますがGRANT構文で権限を付与したら
FLUSH PRIVILEGES;は必要ですか?
<>
NAME IS NULL<>sage<>2012/05/04(金) 20:14:36.44 ID:???<> 面倒ならサーバ再起動しようぜ <>
NAME IS NULL<>sage<>2012/05/04(金) 20:24:03.93 ID:???<> >>430
GRANT使った場合はFLUSH PRIVILEGES不要 <>
NAME IS NULL<>sage<>2012/05/04(金) 20:33:27.85 ID:???<> は〜い
<>
NAME IS NULL<><>2012/05/05(土) 01:59:03.27 ID:p1vOv43V<> KEY `hoge` (`columnA`,`columnB`,`columnC`,`columnD`)
上のような結合キーを作ったテーブルで、個別のキー単体で検索した場合にインデックスは使ってくれるんでしょうか?
それともセットで検索した場合でないと使ってくれないんでしょうか? <>
NAME IS NULL<>sage<>2012/05/05(土) 02:43:19.90 ID:???<> >>434
Aならセーフ
BやCならアウト <>
NAME IS NULL<><>2012/05/05(土) 18:24:49.79 ID:FfcPD0YX<> 初めまして。
皆様お知恵をお貸しください。
テーブル:
t_work
フィールド:
f_workID
f_a1
f_a2
f_a3
f_b1
f_b2
f_b3
・
・
・
テーブル:
t_user
フィールド:
f_userID
f_userName
f_a1以降にt_userテーブルのf_userIDが入っています。
該当のt_workテーブルにID登録されているユーザー名[f_userName]を表示しようとし、
t_work.f_a1 = t_user.f_userID
t_work.f_a2 = t_user1.f_userID
t_work.f_a3 = t_user2.f_userID
t_work.f_b1 = t_user3.f_userID
・
・
・
とテーブル名にエイリアスをつけて表示されようとした所、
テーブル結合は61までという上限に引っかかってしまいました。
すでに登録の方が作られており、テーブル構成の変更は出来ない状態です。
何かよい方法がはありませんでしょうか。
よろしくお願いいたします。 <>
NAME IS NULL<>sage<>2012/05/05(土) 18:33:49.20 ID:???<> >>436
それどういうシステム? <>
NAME IS NULL<><>2012/05/05(土) 18:55:47.17 ID:FfcPD0YX<> >>436様
レスありがとうございます。
単純化してはありますので
言葉では大変説明しづらいのですが、
t_workの中に、担当者と本当は作業予定日も入っております。
さらにt_workにも親テーブルがあり、その親テーブル(t_oya)から
ユーザー名と作業予定日を見に行くシステムです。
冗長なのだろうとは思いますが、何かお知恵がありましたら
よろしくお願いいたします。 <>
NAME IS NULL<><>2012/05/05(土) 18:56:56.47 ID:FfcPD0YX<> すいません。アンカーミスです。
>>438は>>437様への返答です。 <>
NAME IS NULL<>sage<>2012/05/05(土) 19:12:10.94 ID:???<> テーブル設計がおかしすぎる
フィールドで持つのやめればいいんでねの? <>
NAME IS NULL<><>2012/05/05(土) 19:16:19.04 ID:FfcPD0YX<> >>440様
私もそう思うのですが、>>436に書いたとおり動いてしまっている案件でして、
すでにDBの変更が出来ないのです。
インターフェースはPHPなのですが、
そちらで処理出来ればとも思い、試行錯誤しております。
多少力業でも良いので何かアイデアがありましたらご教授ください。 <>
NAME IS NULL<>sage<>2012/05/05(土) 19:18:41.73 ID:???<> >>441
複数クエリのUNIONでも怒られるの?
あと力技でもいいなら、分割してSQL発行してPHP側で結合とか <>
NAME IS NULL<><>2012/05/05(土) 19:25:45.21 ID:FfcPD0YX<> >>442様
ありがとうございます。
複数クエリのUNIONですか?まだやった事がないので調べて見ます。
分割してSQL発行して…はやっては見ているのですがうまくいっていません。
担当者名で検索->t_userからあいまい検索してuserID抽出->
t_work内から抽出したuserIDを含むレコードを検索までは行けたのですが、
この方法だとどのフィールドにそのuserIDが登録されているかを調べる方法を
見つけられませんでした。 <>
NAME IS NULL<>sage<>2012/05/05(土) 20:15:40.93 ID:???<> 1.userテーブルから全部取ってきてPHPの配列に入れる
2.workテーブルから全部取ってきてPHPの配列に入れる
3.PHP側で結合するなり検索するなり好きに処理書く
でおk <>
NAME IS NULL<><>2012/05/05(土) 20:29:32.82 ID:FfcPD0YX<> >>444様
ありがとうございます。
その方法も試してはいるのですが、時間とスキルが足らず、
四苦八苦しております。
その方向でももっと考えて見ます。 <>
NAME IS NULL<>sage<>2012/05/05(土) 21:58:40.36 ID:???<> この方法で苦労するのなら他の方法はオススメ出来ないな <>
NAME IS NULL<>sage<>2012/05/06(日) 05:21:35.39 ID:???<> ユーザー名だけ欲しいならサブクエリにしてしまえば?
後、他の人が言うように設計した奴をどうにかしないと
何度でも問題に突き当たると思うね
select
t_work.*,
(select f_userName from t_user where f_userID = f_a1) as a1,
(select f_userName from t_user where f_userID = f_a2) as a2,
...
(select f_userName from t_user where f_userID = f_a100) as a100
from
t_work <>
NAME IS NULL<><>2012/05/06(日) 15:56:16.27 ID:kaAb9YNz<> >>428
大変遅くなりましたが、ありがとうございました。
しかしながら、何度も試しているのですが、実行がうまくいきません…。
mysqldump -u ユーザーネーム -pパスワード データベース名 --default-character-set=utf8 > /www/htdocs/mt/mt.sql
このように打っているのですが、enterを押すと次の行に「->」と言う表示が出てしまいます。
ルートパスの問題でしょうか…?色々調べているのですが、あまりに初歩的すぎるのか解決方法が見つかりません…。
問題点がありましたらご指摘頂けますと、大変嬉しく思います。
どうぞ宜しくお願い致します。 <>
448<><>2012/05/06(日) 15:59:02.75 ID:kaAb9YNz<> 度々すみません、スクリプトはこちらでした。
mysqldump -u ユーザーネーム -pパスワード データベース名 --default-character-set=ujis > /www/htdocs/mt/mt.sql <>
NAME IS NULL<>sage<>2012/05/06(日) 16:12:38.91 ID:???<> >>448
mysql3.23しか使ったことないけど
それ、mysql起動してない?
3.23の話しだけど、デフォならc:\mysql\bin に入って、そこでmysqldump実行したらいけそう
<>
448<><>2012/05/06(日) 16:29:05.64 ID:kaAb9YNz<> >>450
早速ありがとうございます!
mysqlを起動してしまっていました…。
一旦exitしてから実行したら上手く出来たようです。大変感謝致します…! <>
NAME IS NULL<>sage<>2012/05/08(火) 22:11:40.49 ID:???<> >436
なんか、Excelのシートをそのままテーブルにしました、って感じだな。
んで、Lookup関数で名前は引っ張れると考えているような…
リレーショナルデータベースの基本中の基本がなっていないですねぇ。
他の方も言っている様に、根本的な設計がおかしいです。
また、t_workテーブルはカラム数が可変(増えていく)ように見えます。
そんなことしていると、レコード長の制限に引っかかったりしますよ。
設計した奴をシメて、初めからやり直すことを薦めます。
まぁ、これでは解決しないと思うので、SQLらしい回答も
userIDが一致するuserNameが含まれるような結合にすれば可能です。
全ての組合せとなる直積集合(デカルト積の方が伝わるかも)はクロス結合で生成できます。
その中からuserIDが一致するものを抜き出せばOKということです。
で、クエリを書くと下記のようになります。
SELECT
t_work.f_workID,
MAX( CASE WHEN t_work.f_a1 = t_user.f_userID THEN t_user.f_userName ELSE NULL END ) AS a1,
MAX( CASE WHEN t_work.f_a2 = t_user.f_userID THEN t_user.f_userName ELSE NULL END ) AS a2,
(必要な数だけ書く)
MAX( CASE WHEN t_work.f_zX = t_user.f_userID THEN t_user.f_userName ELSE NULL END ) AS zX
FROM t_work
CROSS JOIN t_user
GROUP BY t_work.f_workID
簡単に解説
CROSS JOIN t_user
クロス結合です。ON条項のないINNER JOINでも同じ結果になりますが、直積を求めていることを
明示するためにもCROSS JOINを使いましょう。
GROUP BY t_work.f_workID
workID毎に纏める、まぁ普通のGROUP BYです。
MAX( CASE WHEN t_work.f_a1 = t_user.f_userID THEN t_user.f_userName ELSE NULL END ) AS a1
今回のクエリのポイントです。
t_work.f_a1 = t_user.f_userIDが成立するuserNameを引っ張り、それ以外ではNULLにします。
MAX等の集計関数はNULLを除外するので、t_work.f_a1 = t_user.f_userIDの時の値のみ残ります。
※集計関数のNULLは要注意事項です
SELECT *
FROM t_work
CROSS JOIN t_user
ORDER BY t_work.f_workID
を実行すると、理解しやすいかも
今回みたいなテーブル構成の場合CASE式を駆使すると意外に対応できたりします。
PHPのswitch-caseのような「文」とは全く違うので、混同しないようにしましょう。 <>
452<>sage<>2012/05/08(火) 22:27:04.03 ID:???<> あ、SELECT * 〜のクエリを試せば想像できると思いますが、全ての組合せを生成するので
クロス結合はかなり高コストなクエリです。
なので、頻繁には使わない方がいいです。
結局「設計をやり直せ」に戻ります <>
NAME IS NULL<><>2012/05/11(金) 11:13:15.19 ID:3XKKtx03<> MySQLってカラムの追加は向いてるけど、データの激しい更新は向いてないって本当なんでしょうか?
たとえば1秒間に100回更新するカウンターとかはMySQLでするんじゃなくテキストでやった方が良いと聞いたんですが <>
NAME IS NULL<>sage<>2012/05/11(金) 12:36:13.12 ID:???<> >>454
今試してみたらMySQLでカウンタは毎秒1744回更新できたよ。
(Xeon W3520 2.67GHz、MySQL 5.5.24、InnoDB、Java)
これで何か問題ある?
<>
NAME IS NULL<><>2012/05/11(金) 12:37:48.94 ID:3XKKtx03<> わざわざありがとうございます
会社でカウンタ作るときわざわざMySQL使うなといわれたのですみません <>
NAME IS NULL<>sage<>2012/05/11(金) 12:40:49.56 ID:???<> 新入社員がボロクソに扱われる季節か <>
NAME IS NULL<>sage<>2012/05/11(金) 18:44:58.36 ID:???<> 高いボラクルとか買って景気回復に貢献してください <>
NAME IS NULL<>sage<>2012/05/11(金) 19:56:01.82 ID:???<> >454
同時アクセスとかを考えると、テキストファイルよりMySQLの方がマシだと思うが、
カウンタのためだけならMySQLは入れなくてもいいような…
memcachedとかの方がパフォーマンスもいいだろうし <>
NAME IS NULL<>sage<>2012/05/12(土) 01:21:38.26 ID:???<> 新入社員で思い出したが
俺の会社で一つのDBにテーブルが200万個あるのが設計ミスに思えて仕方が無い
皆こんなに作るモン? <>
NAME IS NULL<>sage<>2012/05/12(土) 01:32:30.84 ID:???<> >>460
具体的にどう設計ミス? <>
NAME IS NULL<>sage<>2012/05/12(土) 01:45:11.04 ID:???<> ID出した方が良いか
俺個人のがphpmyadmin使ってるからかもしれないけど
テーブルはスッキリ、詰め込めるものは全部不恰好でもレコードでって考えてる
ちなみにその会社の設計は200万個のテーブルにそれぞれ1万個のレコードがある感じ <>
NAME IS NULL<>sage<>2012/05/12(土) 09:20:41.76 ID:???<> 数だけじゃ何も判断できないだろ。
まぁ、その使用する環境でそれだけのテーブルを扱う場合に
パフォーマンスが出ない、なんて問題があったらシステム設計ミスと
いえるかも知れんが。 <>
NAME IS NULL<>sage<>2012/05/12(土) 09:36:38.81 ID:???<> 別にテーブル数は100万個あったって問題はないぞ
なんたってテーブルキャッシュがデフォで65535個もあるんだからなぁ! <>
NAME IS NULL<><>2012/05/12(土) 11:54:58.56 ID:vQgN3wIa<> ゲーム内のランキングを取得するSQL文を教えていただきたいと思い書き込みました。
MySQLのバージョンは5.5.8です。
以下、テーブルです。
USER_TBL
------------
ID, - 主キー
ACTION_MST
------------
ID, - 主キー
SCORE, - 行動に対する獲得スコア
SCORE_TBL
------------
ID, - 主キー
USER_ID, - USER_TBL外部キー
ACTION_ID, - ACTION_MST外部キー
REGIST_DATE, - スコア獲得日
このテーブル構成にて、本日より過去5日間の獲得スコアランキングを
SQL文にて取得したいと考えております。
http://blog.syuhari.jp/archives/64
この説明等を参考にしたのですが、ここで説明されている
scoreカラムは1つのカラムであり、今回の場合は5日間のスコア自体を
関数で計算しながらという事になると思うのですが、うまくいきません。
ご回答頂ければ幸いです。 <>
462<><>2012/05/12(土) 12:04:42.99 ID:+gwxXnlU<> 例えると利用者が200万人、買ったもの履歴が1人大体1万個みたいな感じ
利用者の情報が入ったテーブルと
利用者ごとにテーブル用意して、そのテーブルに購入履歴のレコードを記録してる
俺としては購入履歴を全部一緒にして200億ぐらいレコードのあるテーブルにしていいと思ってるんだけど <>
NAME IS NULL<>sage<>2012/05/12(土) 12:36:43.09 ID:???<> joinとkあunionとかする時めちゃめんどくさいと思うけど(まぁそれを手作業ではしなくて良い状況なんでしょうが) <>
NAME IS NULL<>sage<>2012/05/12(土) 13:35:52.49 ID:???<> >>466
俺も200万テーブルはいかがかと思うが
設計当時のハードウェア制約やパフォーマンス稼ぎ名目で正規形を崩す事があるからなんとも言えない
バッドノウハウだとしても稼動中のシステムの改修は中々やらせてもらえないだろう <>
NAME IS NULL<>sage<>2012/05/12(土) 14:11:25.16 ID:???<> テーブルが多いと接続時時間が掛かるってのは聞いたことある
use databaseでね
200万のテーブルではなく200万のDBファイルにすればいいのではないのか <>
NAME IS NULL<>sage<>2012/05/12(土) 15:16:35.08 ID:???<> まぁ、俺だったらパーティショニングするけどね
それも一つでパーティショニングするのではなく、無理難題を何度も乗り越えてきてもはやDB歴戦の勇者となった俺は2つでパーティショングする
8種類で分けたのを18種類でわけて164通りとかそんな風に。これがとてつもなく早い <>
NAME IS NULL<><>2012/05/12(土) 16:14:22.42 ID:+gwxXnlU<> 二段階に分けるってのは凄い勉強になったけど、それ144通りじゃない? <>
NAME IS NULL<><>2012/05/12(土) 16:24:14.34 ID:A28FyteB<> 今webアプリを作ってるんですが、mysqlへの接続するのに
接続先ホスト(アプリケーションサーバと同じ端末localhostのmysql)が
127.0.0.1なら接続できるのに 192.168.1.100と指定すると接続できません
何が原因なのでしょうか
ポートの問題なのかなと思ったんですが、nmapすると
3306/tcp open mysql
として開いているようです。他にどんな可能性があるのかすみませんがご意見お願いします <>
472<>sage<>2012/05/12(土) 16:57:12.59 ID:???<> ごめんなさい、解決しました
ユーザ名とパスワードを別ホストから使えるよう許可する必要があったんですね
スレ汚しすみませんでした <>
NAME IS NULL<>sage<>2012/05/12(土) 20:01:04.76 ID:???<> 学んだな <>
NAME IS NULL<>sage<>2012/05/12(土) 20:38:44.78 ID:???<> phpmyadminで200万テーブル扱えるんだ…
ブラクラにならないんだ。すげー
MyISAMのテーブルロック回避でユーザーごとにテーブルを作成した、とかなんだろうけど
UNIONで集計とかは考えたくないなぁ <>
NAME IS NULL<>sage<>2012/05/12(土) 20:50:03.72 ID:???<> >465
過去5日分を集計したテーブルを予めつくればいいんじゃないの? <>
465<>sage<>2012/05/12(土) 20:54:24.40 ID:???<> >>476
すいません、書き方が悪かったです。
アクセス日より過去5日ですので、当日分は常に変動すると思うのです。 <>
465<>sage<>2012/05/12(土) 21:34:19.67 ID:???<> >>476
何度もすいません。
テンポラリテーブルというものがあると知ったので
スコアを抽出したテーブルを一時的に作ってランキングを抽出しようと考えたのですが
テンポラリテーブルは自己結合ができないとの事で、また悩んでおります。 <>
NAME IS NULL<>sage<>2012/05/12(土) 21:56:51.07 ID:???<> MySQLは1テーブルあたり1つ以上のファイルを作る。
なのでOSがファイルを200万個扱えるかどうかという話がある。
それくらいだとLinuxではiノードの数が足りなくなる場合がある(増やせるけど)。
あと扱えはするけど、古いOSだとlsするだけで数分かかったり、
さらにulimit -nの制限をくらうので同時には開けず、
テーブルアクセスのたびにopen/closeを繰り替えす残念な挙動になる。
Linuxの都合から言えばテーブル数は1万以下にはしたい。 <>
NAME IS NULL<>sage<>2012/05/12(土) 21:57:31.77 ID:???<> 普通のテーブル作ってそれを更新すりゃいい話じゃないの?
ランキングなんて、見る人によって内容が変わるもんじゃないでしょ。 <>
NAME IS NULL<>sage<>2012/05/12(土) 22:07:33.27 ID:???<> >>478
一時テーブルを2回結合するとエラーが出る!不思議!
でも普通のテーブルをTRUNCATE TABLEしてからINSERT INTO ... AS SELECT ... してから結合すると…? <>
NAME IS NULL<>sage<>2012/05/12(土) 23:47:33.63 ID:???<> REPLACE INTO文ってROLLBACKできるんでしょうか <>
NAME IS NULL<>sage<>2012/05/13(日) 11:10:18.00 ID:???<> mysqlで全文検索を実装したのですが
大量のレコードに引っかかるワードで検索すると
単純なselect...match..against構文でも10秒以上かかってしまいます
一定以上時間かかるようなクエリは途中で実行を終了させる、というようなことはできますでしょうか <>
NAME IS NULL<><>2012/05/13(日) 12:50:11.69 ID:jKuh5bmn<> PHPとMySQLで開発していて、PHPのソースはSubversionで管理していますが
DBのテーブルの変更を、Subversionみたいに(じゃなくてもいいけど)管理する方法ないでしょうか
複数の鯖で運営する時、DBのテーブル構成の同期を取るのにいつも苦労しています <>
NAME IS NULL<>sage<>2012/05/13(日) 16:07:24.39 ID:???<> 同期をとるっつーのならレプリケーションでは?
やったこと無いから知らんけど w <>
NAME IS NULL<>sage<>2012/05/13(日) 16:18:13.75 ID:???<> http://kohada.2ch.net/test/read.cgi/php/1335198562/l50
マルチ <>
NAME IS NULL<>sage<>2012/05/13(日) 18:02:10.09 ID:???<> マルチというか、スレ違いと言われてこっちに来ますた
データの同期じゃなくてテーブル構成の同期だけなので、レプリケーションじゃないです <>
NAME IS NULL<>sage<>2012/05/13(日) 18:35:38.96 ID:???<> >>487
mysqldump --no-dataの出力か、MySQL WorkbenchでExportしたファイルを
Subversionで管理してみたらいいんじゃない。
<>
NAME IS NULL<><>2012/05/14(月) 11:35:35.76 ID:rmHVUy71<> 千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一
千歳科学技術大学 グローバルシステムデザイン学科 深町 賢一 <>
NAME IS NULL<><>2012/05/14(月) 12:34:52.99 ID:6ANnHhUA<> SELECT * FROM tableA WHERE id = 'nuber2' FOR UPDATE
でレコードの排他ロックを行っているのですが
hoge.phpにて
$sql = 'SELECT * FROM tableA WHERE id = 'nuber2' FOR UPDATE';
if($result = mysql_query($sql,$link_id)){
echo 'ロック';
}
sleep(10);
とやっているのですがスリープ中にage.phpにて
$sql = 'SELECT * FROM tableA WHERE id = 'nuber2'';
if($result = mysql_query($sql,$link_id)){
$rows = mysql_fetch_assoc($result);
echo $rows['name'].';
}
とやってもage.phpでも取得できてしまいます
ストレージはInnoDBになってるのですがどうも原因がよくわからず
LOCK TABLES tableA WRITEとかでのテーブルごとのロックはできてるんですが <>
NAME IS NULL<>sage<>2012/05/14(月) 17:36:57.31 ID:???<> 志村ー
検索するほうでも FOR UPDATEつけないとあかんでー <>
NAME IS NULL<><>2012/05/14(月) 21:03:27.71 ID:CB4EPI8d<> http://www.cityheaven.net/k/prime_osaka/A6GirlDetailProfile/?girlId=638074&ref=rank <>
NAME IS NULL<><>2012/05/15(火) 06:29:09.62 ID:bfF6xyzj<> 語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~
語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~語気光線( ´Д`)y━・~~ <>
NAME IS NULL<><>2012/05/15(火) 19:24:07.70 ID:bfF6xyzj<> それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか!
それよりゴキブリ高専卒どもはワシにさっさと謝罪せんか! <>
NAME IS NULL<>sage<>2012/05/15(火) 23:07:41.42 ID:???<> どうも仕事で嫌なことがあると戻ってくるみたいね <>
NAME IS NULL<><>2012/05/16(水) 04:25:09.96 ID:/ibgSKqe<> 私が千歳科学技術大学 グローバルシステムデザイン学科 専任講師・理学博士:深町 賢一だが何か?
用があるなら、http://www.chitose.ac.jp/course/teacher/glo/000057.html <>
NAME IS NULL<><>2012/05/16(水) 04:58:59.13 ID:QUWdYWsE<> このスレじゃ瞬殺されそうなほど下らなくて厨な質問で申し訳ないが、
MySQLのコミュニティーエディションをダウンロードして、
早速アクセスとかファイルメーカーのような使い方って出来ないですよね?
石、投げないで <>
NAME IS NULL<>sage<>2012/05/16(水) 10:14:54.20 ID:???<> できない。MySQL自体にGUIはない。
<>
NAME IS NULL<>sage<>2012/05/16(水) 17:44:05.90 ID:???<> >>498
やはり・・・
レスありがとうでした <>
NAME IS NULL<>sage<>2012/05/16(水) 23:52:10.15 ID:???<> >>497
Accessでリンクテーブル使う <>
NAME IS NULL<><>2012/05/17(木) 22:08:59.56 ID:+V33Ovju<> 今までプログラミングで文字列というとダブルクォートとシングルクォートしか知らなかったんですが
'key'='7001'だと無理で
`key`='7001'だと出来たんですが
「'」と「`」ってどう違うんでしょうか?
文字列の時はシングルクォートでいいんですよね?アクセントの使い方がイマイチよくわかりません <>
NAME IS NULL<>sage<>2012/05/17(木) 22:11:04.86 ID:???<> アクセントって英語の勉強かよ
それバッククォートって言うんだぜ。俺中学の時英語の先生に指摘してやったぜ <>
NAME IS NULL<>sage<>2012/05/17(木) 22:24:56.09 ID:???<> んだからテーブルとフィールドには`必ず入れろと
セキュリティ対策にもなるから必ず入れとけっつーの <>
NAME IS NULL<><>2012/05/19(土) 02:06:01.31 ID:r7mkedqU<> 質問です
UPDATE〜SET〜WHEREでデータの更新した場所を
mysql_fetch_arrayで取得しようとしても取得できませんでした
この場合mysql_queryの返り値がtrueだったので取得できないのは当たり前なのですが
UPDATEした場所のレコードを取得するにはどうしたらいいのでしょうか?
またselectで二度目のmysql_queryを実行しなければならないのでしょうか? <>
NAME IS NULL<>sage<>2012/05/19(土) 08:18:21.00 ID:???<> updateは基本的に行は返さん
トリガでも使え
postgresだったらそのままの事がreturning句で出来るがmysqlは多分出来ない <>
NAME IS NULL<><>2012/05/20(日) 00:40:29.50 ID:qNCu6poQ<> 2度目のselectはいやなんか。
間の更新が気になるなら強い分離レベルにして同じトランザクションで実行すればよい。
select for updateで行ロックとかでも良いのかな。 <>
NAME IS NULL<><>2012/05/22(火) 05:16:07.32 ID:s3FE6m1g<> 以前ココでテーブルの数が数万個あったら時間がかかるので設計ミスとかいうのを聞いたんですが
フィールドの場合も同じで最低でも100個以下とかに抑えたほうが良いんでしょうか? <>
NAME IS NULL<>sage<>2012/05/22(火) 07:04:28.90 ID:???<> >>507
そもそもInnoDBにレコード長8KBの制限があって、500カラムとかまず作れない。
正規化して100カラムぐらいならいいんじゃないの別に <>
NAME IS NULL<><>2012/05/22(火) 13:22:34.72 ID:s3FE6m1g<> > そもそもInnoDBにレコード長8KBの制限があって、500カラムとかまず作れない。
良い事聞きました、ありがとうございます! <>
NAME IS NULL<><>2012/05/22(火) 19:56:43.01 ID:kuoj32zL<> load data I file を実行して容量が足らなくなりエラーが発生し、その後ロックが解除されません。
killコマンドとunlock tablesコマンドを実行してもプロセスの状態がfreeing itemsのままで暫く待っても変化がありません。
アドバイスをお願いします
<>
NAME IS NULL<>sage<>2012/05/22(火) 20:15:44.42 ID:???<> >>510
覚悟を決めてmysqldをkill -9するしかないんじゃ。
MyISAMは該当テーブルが壊れると思うので作り直し。
InnoDBは助かるかもしれないけど自信ない。 <>
NAME IS NULL<><>2012/05/23(水) 15:37:19.59 ID:Jy5HMPPP<> 質問致します
表 sakananovitamin
osakana vitaminB vitaminC vitaminD
まぐろ 20 30 10
かつお 20 10 20
こはだ 10 10 0
やりたいこと
・PHPで上の表をHTMLでだしたい
・ただしそれぞれのレコードで、ビタミンB、C、Dで最大のフィールドの値を強調して下のように表示したい
<tr><td>まぐろ</td><td>20</td><td style="color:red;">30</td><td>10</td></tr>
<tr><td>かつお</td><td style="color:red;">20</td><td>10</td><td style="color:red;">20</td></tr>
<tr><td>こはだ</td><td style="color:red;">10</td><td style="color:red;">10</td><td>0</td></tr>
やったこと(ここまでならできること)
$sql = "SELECT * FROM sakananovitamin ";
$result = mysql_query($sql,$link);// $link =略
print"<table><tr><td>お魚</td><td>ビタミンB</td><td>ビタミンC</td><td>ビタミンD</td></tr>"
while($rows= mysql_fetch_array($result)){
print"<tr><td>".$row["osakana"]."</td>";
print"<td>".$row["vitaminB"]."</td>";
print"<td>".$row["vitaminC"]."</td>";
print"<td>".$row["vitaminD"]."</td></tr>";
}
print"</table>";
よろしくおねがいいたしますm(._.)m
<>
NAME IS NULL<>sage<>2012/05/23(水) 15:58:39.00 ID:???<> それphpの質問じゃね?
とりあえず「レコードの中で一番でっかい値のヤツを赤色にしたい」にしたいんだろうけど
その場合はまず3つの値を配列に入れるなり、比較関数使うなり比較して、その中の最大値を調べて
printでHTML表記するときその値と一緒だったら赤くしろ
あとhtmlだったら<tr><td><?=$row["osakana"]?></td>ってやったほうがいい <>
NAME IS NULL<><>2012/05/24(木) 14:40:00.44 ID:PlrrbWOV<> TSV形式でテーブルをダンプしたいのですが、mysqlサーバとダンプコマンドを実行するのが別のホストなので、
mysqldump -TやSELECT INTO OUTFILEは使えないです。
そこで
mysql -B -e "SELECT ..." > fileでやろうと思ってるのですが、この場合ENCLOSED BYなどの指定は
できないのでしょうか?
TSVでダンプするもっといい方法はありますか?
mysqlはサーバ、クライアントとも5.1.55です。
ちなみに、文字は以下のように変換されるようでした。
TAB→\t
\t→\\t
CR→^M
LF→\n <>
NAME IS NULL<><>2012/05/24(木) 14:44:57.24 ID:PlrrbWOV<> ×CR→^M
○CR→CR (変換なし。0x0Dのまま) <>
NAME IS NULL<><>2012/05/25(金) 02:10:43.70 ID:Rf8GVzqJ<> キャッシュは問い合わせた結果のみをメモリにキャッシュしてるのでしょうか?
ディスクから読み出したデータを、今回使わなかったもの(条件判定に使った列)も含めてキャッシュさせることは可能でしょうか? <>
NAME IS NULL<>sage<>2012/05/25(金) 04:34:02.24 ID:???<> >>516
query_cache_sizeは問い合わせた結果のみ。
key_buffer_sizeとinnodb_buffer_pool_sizeは条件判定だけしたものも含む。
意図的にキャッシュを暖めておくのはテクニックとしてときどきやる。
http://www.mysqlperformanceblog.com/2008/05/01/quickly-preloading-innodb-tables-in-the-buffer-pool/
<>
NAME IS NULL<>sage<>2012/05/25(金) 17:47:22.36 ID:???<> >>517
ありがとうございます。 <>
NAME IS NULL<><>2012/05/25(金) 22:12:46.58 ID:+VPI0aJI<> >>513
ありがとうございます
if うんちゃらかんちゃらでやってみます
<>
NAME IS NULL<>sage<>2012/05/26(土) 11:57:05.90 ID:???<> 横やり失礼。MySQL再起動してキャッシュが暖まるまで、
アプリが激重(普段0.1秒オーダーで表示される画面が5秒とかかかる)なんだけど、
DB・クエリの設計が糞なのかな。MySQLがそういうもんなのかな?
ちなみに InnoDB のみ使用。 <>
NAME IS NULL<>sage<>2012/05/26(土) 12:59:56.17 ID:???<> >>520
5秒ってことは画面を出すために数百I/O走ってるってことだから、
糞とまでは言わないけど改善の余地はありそう。
インデックスが最適な張り方になってないとか、
LIMIT、OFFSETの指定がでかすぎるとか。
そういうクエリはスロークエリを出したときに
# ... Rows_sent: 50 Rows_examined: 15000
Rows_sentに比べてRows_examinedが大きい傾向があるので
まずそういうクエリを探してみる。 <>
NAME IS NULL<><>2012/05/26(土) 16:33:12.01 ID:VdAzzISV<> MySQLのテーブルの基本情報が取得できるかの確認のため一番早そうな select count(*) from テーブル名 を実行してるのですが
count(*)でレコードの数を確認する場合って予めレコード数が登録されているのでしょうか?
それともcountするたびに1個ずつレコードを数えているのでしょうか? <>
NAME IS NULL<>sage<>2012/05/26(土) 19:02:06.63 ID:???<> MyISAMの場合は、記録されてる値を参照するだけだから早いらしい。
InnoDBは、いちいち数えてるらしい。 <>
NAME IS NULL<><>2012/05/26(土) 19:15:06.22 ID:VdAzzISV<> マジっすか、もしやと思い聞いといて正解でした
InnoDBでもテーブルの取得確認するときすばやく簡単に出来る値確認とか無いですかね? <>
NAME IS NULL<>sage<>2012/05/26(土) 19:39:41.81 ID:???<> INSERTするたびにどっかに書いとけば? <>
NAME IS NULL<>sage<>2012/05/26(土) 19:49:08.59 ID:???<> そもそもテーブルの基本情報の取得って何さ
<>
NAME IS NULL<>sage<>2012/05/26(土) 20:11:59.18 ID:???<> テーブルが存在するかどうかとか?
ロックされてるかとかそんな感じか? <>
NAME IS NULL<>sage<>2012/05/26(土) 22:56:46.05 ID:???<> なんでもいいからtableをセレクトして確認したいってことだろ <>
NAME IS NULL<>sage<>2012/05/27(日) 00:02:35.41 ID:???<> じゃあSELECT * FROM unko LIMIT 1でよくね? <>
NAME IS NULL<>sage<>2012/05/27(日) 00:12:19.30 ID:???<> 俺さぁ、ほかのプログラミングスレで思うんだけど
hogeとかfugeとかxxxとかtestとかaとかって変数名とか使えばいいのにわざわざ
sex unko mankoとかするやつってなんなの?
ああいうの質問に答える気が失せるんだが <>
NAME IS NULL<>sage<>2012/05/27(日) 00:48:30.37 ID:???<> いや、もともとhogeってポーランド語でうんこって意味だぞ? <>
NAME IS NULL<>sage<>2012/05/27(日) 02:48:53.70 ID:???<> 10分間調べちまった
hogが豚でhogeなんっつーもんどこにもなかったぞ <>
NAME IS NULL<>sage<>2012/05/27(日) 03:52:05.73 ID:???<> >>530
DT臭い工業高校の生徒さんで、そんな字書くことで射精しているんだから大目に見たりw <>
NAME IS NULL<>sage<>2012/05/27(日) 04:16:41.55 ID:???<> 就職してから会社で仕事するためにプログラミング学ぶようなヤツじゃない精神年齢が幼いヤツって事だから
そういうヤツが沢山居る方がプログラミング界の未来は明るい <>
NAME IS NULL<>sage<>2012/05/27(日) 20:05:59.97 ID:???<> そりゃオンライン辞書に「ビチグソ」なんて口語は載ってないよな <>
NAME IS NULL<><>2012/05/28(月) 10:11:05.44 ID:/y0nTuhH<> レコードが下に行くにつれて上のものとの合計を表示させるにはどうすれば良いですか?
例えば結果は以下のような5行
番号, カラムA, カラムB
1, 0, 1
2, 1, 1
3, 1, 1
4, 1, 1
5, 0, 1
で、これを
1, 0, 1
2, 1, 2
3, 2, 3
4, 3, 4
5, 3, 5
といった形で表示させたいのです。
番号はそのままで特定のカラムだけこのような仕様にしたいのですがこれは可能でしょうか?
<>
NAME IS NULL<>sage<>2012/05/28(月) 10:27:23.37 ID:???<> >>536
サブクエリで自分の番号より上の物をカウントする <>
NAME IS NULL<><>2012/05/28(月) 19:48:56.57 ID:PCvuge+6<> MySQLに限らないテーブルの最適化の問題だと思うのですが、質問させてください
あるテーブルにカラム1,カラム2,カラム3,…と複数のカラムがあって、
そのうち一つのカラムの値が何かによって他のカラムの中身の性質が変わるというのはおかしいでしょうか?
具体的に言うと商品販売のサービスで注文状況のステータス用のテーブルなんですが
以下のようなイメージを考えています
注文受注)
ordered, NULL, 2012-05-30 09:10:11 ※カラム2はnull
発送済み)
shipped, クロネコ, 2012-05-30 12:20:30 ※カラム2は配送業者
キャンセル要望発生)
canceled_byBuyer, 1, 2012-05-30 14:05:40 ※カラム2はキャンセル理由
おかしいでしょうか? <>
NAME IS NULL<>sage<>2012/05/28(月) 21:14:04.18 ID:???<> >>538
うちの会社のシステムにそういう設計してるDBがあるけど、
性能が出なくて改修するのに大赤字になったからやめたほうがいいよ。
<>
NAME IS NULL<><>2012/05/28(月) 22:30:20.94 ID:HBhFDl+H<> ブラウザゲームでカラムが
イベントグループ、イベント、そのイベントが起こる確率 といったテーブルがあるとします
例:
group1 event10 50%
group1 event2 30%
group1 event9 20%
group2 event4 100%
いま、プログラム側で乱数を発生させてそれを基に確率のカラムを参照してイベントを選択するような処理をしたいと考えています
このとき同一のイベントグループに属する全ての行を取得すれば所望の処理は実現できますが、確率が細分化されたとき(1%:event3 2%:event6・・)には
それだけ多くの行を取得しなければなりません
そこで乱数発生→それを基にして確率のカラムを参照して一発で対象のレコードを取り出す為にはどのようなテーブル構成が望ましいでしょうか
どなたかご教示願います
<>
NAME IS NULL<>sage<>2012/05/28(月) 22:47:13.20 ID:???<> イベントグループがそう多くないなら、イベントグループごとにテーブル作る。
カラムはイベントIDだけ。
各イベントの発生確率に応じた比率のレコード数で書き込んでおく。
で、
SELECT ev_id FROM EvGroup1 ORDER BY rand() LIMIT 1
いや、冗談ですけどね。 <>
NAME IS NULL<>sage<>2012/05/28(月) 23:20:25.34 ID:???<> >>540
selectの速度重視なら確率範囲の上下限を入れとけば?
何万レコードもあるわけじゃないだろうから全部取得しても大して違わないだろうけど。 <>
NAME IS NULL<><>2012/05/29(火) 00:33:36.06 ID:KrEU2IUU<> >>537
回答ありがとうございます。
すみません、ちょっとよくわからないのですが、簡単に例を書いてもらうことはできますか? <>
538<><>2012/05/29(火) 02:10:52.57 ID:e6byRQIc<> >>539
ありがとうございます
カラム2をどんな値が入るかわからない、例えばお問い合わせフォームの自由入力欄と思えば
問題ないのではと思ってたんですがダメなんでしょうか?
このやり方をしないとすると、配送業者テーブル、キャンセル理由テーブルなどが必要になって
insert時のトランザクションや、select時のcase, joinなどなどが発生し重くなるのではという
考えだったんですが… <>
NAME IS NULL<><>2012/05/29(火) 02:31:15.21 ID:BE4Y+zyI<> レプリケーション構成でslave自体が更新処理をやっちゃいけないのは分かるんだけれど、
slaveがproxyになって更新クエリをmasterに丸投げするようには出来ないんでしょうか <>
NAME IS NULL<>sage<>2012/05/29(火) 02:32:17.70 ID:???<> >>540
ケータイからなんで適当ですが
例:
# group_id event_id ratio_min ratio_max
group1 event10 0 50
group1 event2 50 80
group1 event9 80 100
group2 event4 0 100
SELECT event_id FROM events
WHERE group_id = ? AND ratio_min <= ? AND ratio_max < ?; <>
546<>sage<>2012/05/29(火) 02:35:42.70 ID:???<> ごめん、不等号の向きがみすってました。
SELECT event_id FROM events
WHERE group_id = ? AND ratio_min <= ? AND ratio_max > ?; <>
NAME IS NULL<><>2012/05/29(火) 04:07:22.96 ID:JPDfjh3l<> id、nameカラムがあるデータベースから
nameカラムだけ順次表示していきたいのですが、
idカラムだけが出力されてしまいます。
どこが悪いのでしょうか?
データベースの構造は以下です
http://or2.mobi/index.php?mode=image&file=33254.jpg
http://or2.mobi/index.php?mode=image&file=33253.jpg
コードです
<?php
$server = "localhost";
$mydb = "test";
$usr = "root";
$pass = "";
$link = mysql_connect($server, $usr, $pass);
$db = mysql_select_db($mydb, $link);
$query = "select id name from homo";
$result = mysql_query($query);
/* 取得、表示 */
$query = "select id name from homo";
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result))
{
printf("<li>%s</li>", $row["name"]); //ここで"name"を指定して取得したいが"id"を取得してしまう
}
?> <>
NAME IS NULL<>sage<>2012/05/29(火) 04:39:33.54 ID:???<> >>548
idのあとにカンマが足りない
select id, name from homo
それだと
select id as name from homo
と同じ <>
NAME IS NULL<>sage<>2012/05/29(火) 06:53:56.07 ID:???<> >>543
こんな感じ <>
NAME IS NULL<>sage<>2012/05/29(火) 06:54:15.32 ID:???<> >>543
みすった
http://blog.syuhari.jp/archives/64 <>
NAME IS NULL<>sage<>2012/05/29(火) 06:55:50.20 ID:???<> >>543
たびたびすまん。リンク先のをSUMに変えれば目的は達成できるかと <>
NAME IS NULL<>sage<>2012/05/29(火) 09:01:16.20 ID:???<> >>544
SQLというものが教科書どおりのモデルを前提に設計されてるので、
設計の定石を外すと急にシンプルなSELECT文が書けなくなるんよ。
配送業者テーブル、キャンセル理由テーブルを作るのが正しくて、
注文状況テーブルだけで何とかしたい場合でも
配送業者カラムとキャンセル理由カラムを分けて作った方がいいよ。
VARCHAR/TEXTは空ならほとんど容量くわないし。
<>
NAME IS NULL<><>2012/05/29(火) 09:46:39.65 ID:dnQr6YFz<> サーバのバージョン: 5.5.20
エンジンはInnoDBです
毎日1万件ほどデータを取得して、Perlでマルチスレッドを使ってinsertしているんですが
10件ほどレコードが欠けてしまいます。
>>305あたりのように、ロックをかけないといけないんでしょうか?
マルチスレッドを使わなければ、すべて正常にinsertできることは確認しています <>
NAME IS NULL<>sage<>2012/05/29(火) 10:53:25.48 ID:???<> >>554
試してないけど
スレッドごとにデータベースハンドルを分けないとダメなんじゃない?
10スレッドならMySQLに10本つなぐ。
forkのときは分けないと確実にダメって話がある。
http://www.jdcn.co.jp/blog/archives/2011/06/perlforkdbi.php
<>
NAME IS NULL<><>2012/05/29(火) 12:06:43.90 ID:JPDfjh3l<> >>549
ありがとうございます!おかげさまでうまくいきました <>
NAME IS NULL<>sage<>2012/05/29(火) 14:24:00.79 ID:???<> >>555
今こんな感じで、サブルーチン内の最初でDBに接続してる。
スレッドごとに接続できていると思ったんだけど…
Perl側の問題かな?threads_yield?
それとも、キューを得るごとに接続しなおさないといけないのかな?
# キューの生成
my $queue = new Thread::Queue;
$queue->enqueue(1..10000);
# スレッドの生成 (サブルーチン routine を実行するスレッドを10個生成)
my @consume_queue;
for(my $i = 0; $i < 10; $i++) {
push @consume_queue, threads->new(\&routine, $queue);
}
# スレッド実行
foreach my $send_queue (@consume_queue) {
$send_queue->join;
}
# MySQLへinsert等の実行内容
sub routine {
my $queue = shift;
my $dbh = DBI->connect(略);
my $sth = $dbh->do(q|SET CHARACTER SET utf8;|);
while(my $row = $queue->dequeue_nb) {
$sth = $dbh->do(qq|INSERT INTO 略|);
}
} <>
NAME IS NULL<>sage<>2012/05/29(火) 16:52:35.65 ID:???<> >>557
データベースハンドルは分かれてるね。
例えばだけどScientific Linux 6でこういう状態なんだけど
$ ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
libmysqlclient.so.16 => /usr/lib64/mysql/libmysqlclient.so.16 (0x00007ffc814ea000)
これもしかしたらスレッドセーフライブラリのlibmysqlclient_rじゃないといかん気がする。
差し替えられる? <>
NAME IS NULL<>sage<>2012/05/29(火) 17:31:35.77 ID:???<> >>546
ありがとうございます
大変参考になりました <>
538<>sage<>2012/05/29(火) 18:09:43.68 ID:???<> >>553
丁寧なご意見ありがとうございます
もう一度良く考えてみたいと思います <>
NAME IS NULL<>sage<>2012/05/29(火) 22:08:36.94 ID:???<> >>558
Winなのでmysql.dllは見つけましたが、libmysqlclientが見当たりません。
これはコンパイルして生成すればいいのでしょうか? <>
NAME IS NULL<><>2012/05/29(火) 22:29:39.67 ID:KrEU2IUU<> >>551 >>552
お手数おかけして申し訳ございません。
無事成功しました!
どうもありがとうございます。
<>
NAME IS NULL<>sage<>2012/05/30(水) 00:10:37.01 ID:???<> >>561
Winならlibmysql.dllがどこかにあってそれでスレッドセーフらしい。
うーん分からなくなった <>
NAME IS NULL<>sage<>2012/05/30(水) 00:26:05.61 ID:???<> >>563
ありました。
Perl内とApache内にバージョンの違うlibmysql.dllが入ってるんで
どっちでうまくいくのか試してみます。
うまく行かなければまた来ます。ありがとうございました。
<>
NAME IS NULL<><>2012/05/30(水) 12:48:17.73 ID:mokoOBTF<> うまくいきませんでした \(^o^)/
10本接続してinsertする際に
2つが同時にinsertしてもMySQLとしては問題無いですよね? <>
NAME IS NULL<><>2012/05/30(水) 19:02:03.40 ID:XRAc8zNk<> 質問です
MySQLで12345で検索するとき'12345'とINT型のクォートでくくらず12345で検索すると
クォートでくくらない方が数倍早かったのですが
これってINSERTする時に''でくくるか、くくらないかでも後々の検索速度変わったりするのでしょうか? <>
NAME IS NULL<>sage<>2012/05/30(水) 20:20:21.10 ID:???<> >>566
あるあるおハマり大事典 - InnoDBなのに行ロックしないの - (ひ)メモ
http://d.hatena.ne.jp/hirose31/20091106/1257493652
コメントも含めて読んだらわかる
<>
NAME IS NULL<>sage<>2012/06/01(金) 03:54:24.48 ID:???<> せめてオラクルさえ手放してくれればココも活気が出るんだろうけどなぁ <>
NAME IS NULL<>sage<>2012/06/01(金) 08:11:21.95 ID:???<> クライアントライブラリをLGPLかBSDにしてくれるだけでもいいのよ <>
NAME IS NULL<>sage<>2012/06/01(金) 08:17:45.01 ID:???<> 自宅サーバーでMySQL使って金儲けとかできんからね <>
NAME IS NULL<>sage<>2012/06/01(金) 18:18:08.10 ID:???<> >>569
さらに通信すればOK <>
NAME IS NULL<>sage<>2012/06/01(金) 21:32:57.94 ID:???<> ドライバのLGPL版のクローンとかないのかね <>
NAME IS NULL<><>2012/06/02(土) 07:42:44.90 ID:Nc/647wC<> ブラウザゲームなどにおけるフラグ管理テーブルの設計について質問です
1ユーザーにつき、boolean型のデータを200〜300程度格納したいとします
その場合どのような設計が望ましいでしょうか(殆どが参照クエリであるとします)
1. (user_id,flag_no,flag_value)といったカラムで行数を積んでいく
2. (user_id,flag1,flag2,....)といったカラムで非正規化
1だとレコード数が膨大になりそうで、2だと二進十進変換してintで纏めればカラム数も
あまり増えないのではないかと思うのですが色々とまずい気がします <>
NAME IS NULL<>sage<>2012/06/02(土) 07:46:53.34 ID:???<> 全部同じテーブルじゃないとイカンのか?
ネトゲだったら倉庫、バッグ、装備って分ければいいかなーと思うけど
そんでレコードの容量は1つ7KBぐらいならギリギリだと思う <>
573<><>2012/06/02(土) 08:22:04.80 ID:Nc/647wC<> >>574
別々のテーブルに分けた上での一つのテーブルになっています <>
NAME IS NULL<>sage<>2012/06/02(土) 09:21:18.60 ID:???<> >>573
「あるユーザのフラグ何番を調べる」という処理がすべてであって、
「フラグ何番が立っているユーザ一覧を出す」という処理が決してないなら、
(user_id INT PRIMARY KEY, flags VARCHAR(200)) にして
SELECT SUBSTRING(flags, 35, 1) FROM user_flag WHERE user_id = 500;
もありかな〜と思った。
DB設計のお作法的には良くないんだけど、今回だけ特別に。 <>
NAME IS NULL<><>2012/06/02(土) 18:37:06.06 ID:y6vM1GM3<> MySQL verchar型ってあるじゃないですか。
入る文字数を1〜255の間で決めれるじゃないですか?
郵便番号だろうと、名前だろうと、キャッチコピーだろうと
全部255じゃだめなんですか?
今の時代サーバーも高性能、高容量になってるだろうから
1も255も変わらなさそうなんですが。 <>
NAME IS NULL<>sage<>2012/06/02(土) 18:51:18.67 ID:???<> >>577
通常なら、全部255で問題ない
1億レコード作る気ならちょっと考えるけど <>
NAME IS NULL<><>2012/06/02(土) 19:03:58.14 ID:y6vM1GM3<> >>578
きゃあああああああああ <>
NAME IS NULL<>sage<>2012/06/02(土) 19:07:58.03 ID:???<> >>577
「実践ハイパフォーマンスMySQL 第2版」P.89のコラムを参照 <>
NAME IS NULL<>sage<>2012/06/02(土) 21:43:52.73 ID:???<> MySQLのVARCHAR(255)には、InnoDBでutf8の場合に
ユニークインデックスを作れる最大長っていう意味もある。
MySQL 5.5のutf8mb4だとこの最大長が191になっているので、
最近は自分で何か作るときは191にしてる。 <>
NAME IS NULL<>sage<>2012/06/02(土) 21:57:23.22 ID:???<> ヘェーヘェーヘェーヘェーヘェー <>
NAME IS NULL<><>2012/06/04(月) 23:49:38.26 ID:xJFIjG+I<> レプリケーションのスレーブサーバは、複数の別個のサービスのマスターのスレーブとして使えるんですか?
例えば、example1.comとexample2.comがあって、全く別のサービスだけどスレーブは一つにまとめたいということです
バージョンは5.5.25を使っています
それぞれのサービスでデータベース名を違うものをつけていれば大丈夫なんでしょうか <>
NAME IS NULL<>sage<>2012/06/05(火) 02:33:09.58 ID:???<> >>583
機能としてはないけど無理やりやっている人はいる。
http://www.slideshare.net/do_aki/20110809-my-sql-casual-talks-vol2
普通はスレーブ一台でもmysqldをポート3306、3307、
datadirを/var/lib/mysql1、/var/lib/mysql2と分けて
複数動かすんじゃないかと思う。 <>
NAME IS NULL<>sage<>2012/06/05(火) 02:38:35.91 ID:???<> >>583
Masterサーバ1台、Slaveサーバ1台で、その中で
論理データベース2つという事なら可能(負荷/遅延など考慮せず)
Masterサーバが2台、Slaveサーバが1台の場合は
mysql_multi とか使わないとできないんじゃないかな。
うちでは、4台ぐらいの Masterサーバを1台のデータバックアップ用
スレーブに放り込んでるが、mysql_multi を使ってる。
また、MySQLクラスタならマルチソース・レプリケーションが
できるらしいというのは先日の MySQL Webセミナーで聞いた。 <>
585<>sage<>2012/06/05(火) 02:46:25.34 ID:???<> かぶった(´・ω・`)
そういえば、「MySQLレプリケーション:実践テクニック」で
584 さんが紹介されてる資料みたいな方法でのマルチソース
レプリケーションについて紹介があった。
ただ、同じ論理データベースを作ってしまったりといったトラブルが怖いな...
<>
NAME IS NULL<>sage<>2012/06/05(火) 04:55:30.25 ID:???<> 複合主キーでインクリメントするために
MyISAMってやつでやってるんですけど
量多くなってきたら遅くなったりしますか? <>
NAME IS NULL<>sage<>2012/06/05(火) 08:51:28.90 ID:???<> >>587
量が増えたら遅くなるよ <>
NAME IS NULL<>sage<>2012/06/05(火) 16:26:22.39 ID:???<> >>587
量が増えても速度に影響は無い <>
NAME IS NULL<><>2012/06/05(火) 18:36:24.35 ID:L8yyqDFy<> SELECT a.%(score_col)s AS a_score, b.%(score_col)s AS b_score
FROM %(table)s a, %(table)s b
WHERE a.%(col1)s = %(a_value)s AND a.%(col2)s = b.%(col2)s
AND b.%(col1)s = %(b_value)s
これをmysqlに直したい。
mysqlで2つの値をひとつのテーブルから取得したいのですが、
どのようにしたらいいのでしょうか?
mysql table 2つ取得でぐぐってもでできません。
ヒントください。
<>
583<>sage<>2012/06/05(火) 19:38:01.62 ID:???<> >>584,585
ありがとうございました
いろんなやり方があるんですね、ちょっとずつ勉強していきます <>
590です。<><>2012/06/05(火) 21:16:08.01 ID:L8yyqDFy<> http://www.ueblog.org/blog/entry/collective_2_1/
のdef sim_distanceの関数部分です。
よろしくお願いします。
<>
NAME IS NULL<>sage<>2012/06/05(火) 21:25:39.41 ID:???<> >>590
そのまま書き下したらいいように見えるけど、何か問題あるんだろうか。
「SQL 自己結合」でぐぐってみてはいかが <>
NAME IS NULL<><>2012/06/05(火) 22:21:39.56 ID:y12/UfnF<> 内部結合のあるSELECTでLOCK IN SHARE MODEやFOR UPDATEを指定した時、両方のテーブルの該当行にロックがかかるのでしょうか。
例えばこのようなSQLのとき:
SELECT author.id FROM posts p INNER JOIN authors a ON a.id = p.author_id WHERE p.id = ? FOR UPDATE;
ロックは以下の順番でかかるでしょうか。
(1) p.idの行にロック
(2) 次にauthorsの該当行にロック
実行計画による?
<>
NAME IS NULL<>sage<>2012/06/05(火) 22:54:29.90 ID:???<> >>594
試したら両方のテーブルの該当行にロックがかかった。
順番は、
SELECT sleep(1), author.id FROM posts p ...
という感じでゆっくりロックしつつ別のセッションからいろいろ突っついてみると、
アクセスした順番にロックがかかっているように見える。よって実行計画による。
オプティマイザの機嫌次第でデッドロックが起きるねこれは
<>
NAME IS NULL<>sage<>2012/06/06(水) 00:30:04.47 ID:???<> >>595
検証していただき、ありがとうございます!
どうやら本番のコードでは避けた方が無難のようですね。
大変助かりました。 <>
NAME IS NULL<><>2012/06/06(水) 01:27:39.26 ID:V1og8Iw1<> テーブルというのはどういう基準で分けるんでしょうか?
例えば2chを例にすると、
カテゴリ>板>スレッド>レス
とそれぞれ内包される関係になると思います(toroなどの鯖は今はおいておきます)
それぞれ、
カテゴリ、板
板、スレッド
スレッド、レス
というテーブルを作ったほうがいいのでしょうか
それとも、
カテゴリ、板、スレッド
と3つ共存するようなテーブルを作ってしまってもいいのでしょうか <>
NAME IS NULL<>sage<>2012/06/06(水) 01:33:02.79 ID:???<> テーブル→多くて数十個まで
板毎にテーブル-------レス情報
レス情報
レス情報
板毎にスレッドテーブル-----スレタイ
スレタイ
スレタイ
俺だったらこうする <>
NAME IS NULL<><>2012/06/06(水) 09:06:13.96 ID:emn2VUKP<> -----------------------------------------
メインテーブル
-----------------------------------------
ユニークID
スレッドID → スレッドテーブルとリレーション
板ID → 板テーブルとリレーション
レス番号
書き込み日時
あぼーんフラグ
名前
Email
書き込み内容
ホスト
-----------------------------------------
板テーブル
-----------------------------------------
板ID
板名
-----------------------------------------
スレッドテーブル
-----------------------------------------
スレッドID
スレッド名 <>
NAME IS NULL<><>2012/06/06(水) 11:20:49.18 ID:V1og8Iw1<> >>598-599
ありがとうございます! <>
NAME IS NULL<><>2012/06/06(水) 16:53:18.10 ID:V1og8Iw1<> 主キーであるidカラムに、デフォルトで
CURRENT_TIMESTAMPをint型で入れたいのですがうまくいきません
どうしたらいいんでしょうか
http://www.dotup.org/uploda/www.dotup.org3063320.jpg
http://www.dotup.org/uploda/www.dotup.org3063324.jpg
nullに関するエラーが出たのでオンオフしてみましたが、結果は同じでした <>
NAME IS NULL<>sage<>2012/06/06(水) 19:55:23.17 ID:???<> CURRENT_TIMESTAMP を int型にしたいって、、一体なにをしたいんだ? <>
NAME IS NULL<>sage<>2012/06/06(水) 20:00:44.61 ID:???<> わけわからんなw
エスパーするとunixタイムスタンプにしたいとか? <>
NAME IS NULL<><>2012/06/06(水) 20:07:33.77 ID:V1og8Iw1<> >>602-603
全然分かってなくてすいません
unix時間をIDにしたいのです
2chのスレ番号みたいな感じです
http://toro.2ch.net/test/read.cgi/db/1322402682/
でいうと1322402682です <>
NAME IS NULL<>sage<>2012/06/06(水) 20:49:31.48 ID:???<> まず、current_timestampが返す型はtimestamp型だ
この関数はデフォルト値には使えるが当然カラムがなかなか無茶苦茶な発想に見えるのだが
timestamp型じゃないとダメ。
なのでここでまず無理
逆に言えば通常の関数はデフォルト値には使えない。
デフォルト値はあきらめたとしてさらにintにしたいんだろ?
unixタイムスタンプというのは一秒単位なわけで、
current_timestampよりはかなり精度が落ちる
ということは情報を切り捨てなけりばならないか、datetimeのnow関数を元の値にして unix_timestamp関数で更新時に埋め込んだとする。
しか主キーと言うことは当然ユニークでなければならないが、一秒単位でかぶらないという保証はあるの?
ていうか、かぶったらエラーにしたいってこと?
なかなか無茶苦茶な発想に見えるのだが、
なぜシーケンスじゃダメ?
なぜ主キーじゃないとダメ?
なぜunixタイムスタンプ? <>
NAME IS NULL<>sage<>2012/06/06(水) 21:35:42.75 ID:???<> >>601
試行錯誤した結果、
create table t (c1 timestamp primary key default current_timestamp);
なら作れる。
でもみんなが言うように、普通は
create table t (id int primary key auto_increment, updated_at timestamp);
create index t_ix1 on t (updated_at);
ってやると思う。 <>
NAME IS NULL<><>2012/06/06(水) 22:52:30.85 ID:V1og8Iw1<> >>605
ありがとうございます。
想像以上にややこしいようで、すいませんでした
まずは、慣れ親しんだ2chモドキを作ってみたいというのが大元でした
大昔に2chブラウザも作ったことがあるので、ちょっとぐらいは理解しているというのもあり、
またゴールがみえているのでとりあえず真似して作ってみたいと思いました。
>なぜシーケンスじゃダメ?
これもすいません、質問の意味があまりわかっていないです。
しかし、主キーにせざるを得ない状況、というの物はありません。
>なぜ主キーじゃないとダメ?
>なぜunixタイムスタンプ?
時間は必ず加算され続けるので、一意にならない
仮になったとしても、それはそれで得るものがあるかなと思いました
スレ番号がunix時間とのことだったので調べたところ、
intにすればそこそこ
真似してみようと思ったのですが、
もしかして主キーはunix時間じゃないのでしょうか <>
NAME IS NULL<><>2012/06/06(水) 22:58:24.18 ID:V1og8Iw1<> すいません、かきこんでしまいました・・・
>なぜunixタイムスタンプ?
時間は必ず加算され続けるので、一意にならない
仮になったとしても、それはそれで得るものがあるかなと思いました
後は書き込み時間と主キーが同じなら、
書き込み時間をカラムとして保存するよりもデータ圧縮にもなるかな?と思ったのです
スレ番号がunix時間とのことだったので調べたところ、
intにすればそこそこ早いというので試してみたかったというのもあります
後は2chを全体的に真似してみようと思ったのですが、
もしかして主キーはunix時間じゃないのでしょうか
やはり主キーは普通に1から順にして、auto_incrementにすべきでしょうか <>
NAME IS NULL<><>2012/06/06(水) 23:23:01.43 ID:LDzCDyQv<> 質問です
あるテーブルにPHPで作ったアプリケーションから単純なselectを実行してるんですがエラーになります
同じselect文をphpMyAdminのクエリ機能でクエリするとエラーにならず結果(該当レコードなし)が返ります
PHPアプリでのエラー
object(Zend_Db_Statement_Exception)#169 (8) { ["_previous":"Zend_Exception":private]=> NULL ["message":protected]=>
string(96) "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'sample.'api_twitter'' doesn't exist"
ターミナルから直接mysqlのテーブル一覧を見ると、該当テーブルは存在しています
mysql> show tables;
+-----------------------+
| Tables_in_sample |
+-----------------------+
| api_twitter |
どんな原因が考えたら良いんでしょうか。すみませんがよろしくお願いします <>
609<>sage<>2012/06/07(木) 00:44:06.79 ID:???<> ごめんなさい、自己解決しました
PHPの問題でした <>
NAME IS NULL<>sage<>2012/06/07(木) 08:41:17.02 ID:???<> >>608
普通主キーは安定したものにする
レコードが特定出来るように
2chはファイルで管理してるからキーも何も <>
NAME IS NULL<>sage<>2012/06/07(木) 13:52:07.12 ID:???<> CSVを定期的にMySQLへインポートしているのですが、次のようにしています。
作業用テーブル作成 → 作業用テーブルにガリガリINSERT → 運用中のテーブルをリネームor削除 → 作業用テーブルを本運用テーブル名にリネーム
この際、当然ながら 0.001秒くらいテーブルが存在しなくなる時間が存在しており、ごく稀にこの空白時間にひっかかる事があります。
シームレスにテーブルを入れ替えることってできるでしょうか? <>
NAME IS NULL<>sage<>2012/06/07(木) 14:46:56.98 ID:???<> rename table A to B, C to A
で出来るみたいだけど <>
NAME IS NULL<>sage<>2012/06/07(木) 15:28:28.12 ID:???<> なんでcsvを直接本運用テーブルに入れないの? <>
NAME IS NULL<>sage<>2012/06/07(木) 20:52:30.00 ID:???<> >612
CSVファイルとインポート先テーブルの列構造が同じなら、
-----
1.空のテーブルをCSVエンジンで作成
2.インポートしたいCSVファイルを出来たhoge.CSVに上書き
3.FLASH TABLE;
4.ALTER DATABASE hoge ENGINE=InnoDB;
5.RENAME TABLE target_db TO sute_db, hoge TO target_db;
6.DROP TABLE sute_db;
-----
みたくすると、多分一番速くてリソースも使わない <>
615<>sage<>2012/06/07(木) 20:53:41.79 ID:???<> 間違った
>4.ALTER DATABASE hoge ENGINE=InnoDB;
ではなく
ALTER TABLE hoge ENGINE=InnoDB; <>
NAME IS NULL<>sage<>2012/06/08(金) 11:19:01.25 ID:???<> インポートしたいCSVファイルをCSVエンジンでいきなりテーブルAとする。
挿入先テーブルをMとして、
INSERT INTO M (中略) SELECT (中略) FROM A (後略)
で、なんかマズい? <>
NAME IS NULL<><>2012/06/08(金) 19:25:46.83 ID:v3PjVOwl<> あるでデータがCSVで落とせるのですが、
時間がないので、
本来リレーションさせる系のデータも
そのまま生でvarchar型等で挿入してしまっても
大丈夫ですよね??
いちおー落ち着いたら、前データを数字に置換し
リレーション型にしようかと思ってます。 <>
NAME IS NULL<>sage<>2012/06/08(金) 19:38:41.51 ID:???<> 後からマイグレーションするの?
自分でケツ拭くつもりなら、まぁいいんじゃない
時間がなくてもER図くらいは描いといたほうがいいと思うけどね <>
NAME IS NULL<>sage<>2012/06/09(土) 06:12:23.48 ID:???<> PHP Error(USER): [DB Error] : message="DB Error: unknown error" info="INSERT INTO
`M_user`(`regist_datetime`,`update_datetime`,`user_mailaddress`,`user_type`,`user_password`,`user_status`,`user_ua`,`user_device`)
VALUES(NOW(),NOW(),'k7decdd2a735yf7@softbank.ne.jp','NO','1234',1,'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko)
Chrome/19.0.1084.52 Safari/536.5','PC'); [nativecode=1213 ** Deadlock found when trying to get lock; try restarting transaction]" in
/home/prj/101/contents/private/lib/magicwork/DBO.php on line 227
ユニクロのDBエラーw
http://www.uniqlo-cool.com/ <>
NAME IS NULL<>sage<>2012/06/09(土) 07:54:56.29 ID:???<> >620
メアドぐらいマスクしろよ…
INSERTでデッドロックってどうやったらかかるんだ?
トリガで何かやってんのかね? <>
612<>sage<>2012/06/09(土) 11:12:39.85 ID:???<> CSVをPHPで選別・加工しまくって入れてるので。カラムもレコードもまるで違います。
(元のCSVが2GB、そこから作るInnoDBが100MBなレベル)
あと、削除分もあるので運用中のテーブルにREPLACEするだけではだめなんです。
(テーブルに更新用フラグ作って、立ってないレコードを一括DELETEとかでもできるでしょうけど)
また運用テーブルをリネームしてどけることで、一世代分のバックアップもかねてます。
>>613 の方法が一番ベターみたいですね。さっそく試してみます、ありがとうございます。 <>
NAME IS NULL<>sage<>2012/06/09(土) 15:28:03.44 ID:???<> 一番ベターって何? <>
NAME IS NULL<>sage<>2012/06/09(土) 18:15:08.08 ID:???<> the betterest <>
NAME IS NULL<>sage<>2012/06/09(土) 18:17:54.54 ID:???<> Better than the Best! <>
NAME IS NULL<>sage<>2012/06/10(日) 10:14:31.71 ID:???<> god better best
って先週学校でやった <>
NAME IS NULL<>sage<>2012/06/10(日) 18:15:07.19 ID:???<> Godじゃあしゃーなしだ。 <>
NAME IS NULL<>sage<>2012/06/10(日) 19:57:52.49 ID:???<> good goodder gooddestと習ったが <>
NAME IS NULL<>sage<>2012/06/10(日) 20:49:26.40 ID:???<> God Godder Goddest <>
NAME IS NULL<><>2012/06/10(日) 21:30:31.13 ID:Y4HpMp2i<> substrまたはsubstring関数で文字列を切り抜くと、文字列末が文字化けします。
どうすればいい? <>
NAME IS NULL<>sage<>2012/06/11(月) 08:29:12.26 ID:???<> >>630
クライアントとサーバの文字コードの違いかな
試してないんで全く分からずに書いてるけど、
クライアントとサーバの文字コードを一緒にしてみるとか。
それが無理なら、クライアント側でサーバの文字コードを認識するような工夫がいるんだと思う。
SQL文でPHPのmb_substrみたいなのがあればいいんだろうけど、知らないんでごめん
<>
NAME IS NULL<>630<>2012/06/11(月) 12:04:35.44 ID:???<> さんきゅ!
いろいろためしてみるー <>
NAME IS NULL<><>2012/06/11(月) 19:14:49.39 ID:LWqiz9+D<> 基本的なことですいません、教えてください
社員のデータベースを作り、色々なことに使おうと思うのですが
東京だけselectで抜き出し、社員番号を1から順に振り直す、というようなことはできますか?
社員番号 支店 名前
1 東京 山田
2 大阪 田中
3 東京 山本
4 東京 佐々木
5 大阪 神埼 <>
NAME IS NULL<><>2012/06/11(月) 19:16:30.74 ID:LWqiz9+D<> 用途は社員旅行等、他愛のないものなのですが
歯抜けだと不便なので補完したいのです。
それとも表計算ソフトなどで加工したほうが早いでしょうか <>
NAME IS NULL<>sage<>2012/06/11(月) 19:18:22.07 ID:???<> 1 東京 山田
2 東京 山本
3 東京 佐々木
4 大阪 田中
5 大阪 神埼
こうしたいこと? <>
NAME IS NULL<><>2012/06/11(月) 19:20:58.90 ID:LWqiz9+D<> こんな感じです。
1 東京 山田
2 東京 山本
3 東京 佐々木
1 大阪 田中
2 大阪 神埼 <>
NAME IS NULL<>sage<>2012/06/11(月) 21:21:24.96 ID:???<> テーブルの中身を更新したいのか、表示のときだけ連番を振りたいかによって異なる。
表示のときだけ連番を振るのはこんな感じ。
mysql> set @id = 0;
mysql> select @id := @id + 1, job, ename from emp where job = 'salesman' order by ename;
+----------------+----------+--------+
| @id := @id + 1 | job | ename |
+----------------+----------+--------+
| 1 | salesman | allen |
| 2 | salesman | martin |
| 3 | salesman | turner |
| 4 | salesman | ward |
+----------------+----------+--------+
<>
NAME IS NULL<>sage<>2012/06/11(月) 21:33:56.93 ID:???<> クエリ一本でお望みの結果いけるぜ
window関数案件だが、mysqlはwindow関数無いからどうしてもループが多くなって、たくさんの行の解析には向かないけどな。
お家帰ったら書き込むから待っとれ <>
NAME IS NULL<><>2012/06/11(月) 21:36:25.98 ID:LWqiz9+D<> >>637
ありがとうございます!
>>638
ワクワクテカテカであります <>
NAME IS NULL<>sage<>2012/06/11(月) 22:12:22.76 ID:???<> 帰ったぜ。
empid | br_name | name
-------+---------+--------
0 | 東京 | 山田
1 | 東京 | 山本
2 | 東京 | 佐々木
3 | 大阪 | 田中
4 | 大阪 | 神崎
とする。
で、求めたい支店毎の社員idをbr_empidとする。
select
empid
,br_name
,name
,(
select
count(*)
from
emp b
where
b.br_name = a.br_name
and b.empid <= a.empid
) as br_empid
from
emp a
order by
br_name
,br_empid
,empid
な感じで、相関クエリにしちゃえばOK。
意外と簡単。
order byとかは好きにしてくれ。
<>
NAME IS NULL<><>2012/06/13(水) 17:58:30.86 ID:exJuEynU<> Perlを長年やってきたのですがphpに乗っかろうと思い、MySQLの入門書を二冊ほど読んでphpと連動して使うようになったのですが
POSTされてきた文字列をINSERTするにあたって、ただ入れるだけの場合
$_POST['name']をmysql_real_escape_stringでエスケープするのみで
INSERT INTO `table` SET `id` = '.$_POST['name'].'
とクォートでくくるだけでセキュリティ上本当に大丈夫なんでしょうか?
htmlに関してのエスケープは入れるときではなく取り出す度にやろうと思いまして <>
NAME IS NULL<>sage<>2012/06/13(水) 23:23:01.19 ID:???<> >>641
「安全なSQLの呼び出し方」を読もう。
http://www.ipa.go.jp/security/vuln/websecurity.html <>
NAME IS NULL<>sage<>2012/06/17(日) 09:34:18.86 ID:???<> よろしくお願いします。 centOS6、mysql5.5.25です
現在初めてレプリケーションを実装して動かしているんですが
スレーブに対して実行してるselectが凄く遅くて困っています
マスタ(=アプリケーションサーバ)に同じことをする場合に比べて4倍くらい時間がかかっています
両方とも同じローカルネットワークにあり(マスタ:192.168.0.11、スレーブ:192.168.0.12)、
物理的な距離の問題?などないはずですが、マスタサーバで
ping 192.168.0.11 と ping 192.168.0.12 したとき、後者は前者の4,5倍の時間がかかっています
これはどうしようもないんでしょうか? 解決方法などあればご意見お願いします
また、実際にどこかのレンタルサーバを借りて同じことをした場合、もっと時間がかかるんでしょうか <>
643<><>2012/06/17(日) 09:35:18.95 ID:MPnMohdg<> ごめんなさい、あげさせてください <>
NAME IS NULL<>sage<>2012/06/17(日) 10:22:19.10 ID:???<> pingで違うって自分で書いてるんだから、MySQLと全然関係ないやん。 <>
NAME IS NULL<>sage<>2012/06/17(日) 10:32:48.87 ID:???<> そうだね、あってんじゃん <>
NAME IS NULL<><>2012/06/17(日) 11:41:35.45 ID:3UmA6AnU<> 実はディスクがRAID1 <>
643<><>2012/06/17(日) 11:57:18.75 ID:MPnMohdg<> >>645
どうもありがとうございます、すみませんがもう少し聞かせてください
きっとここにいる人は今回の例のように「レプリケーションを組んでselect系の処理はスレーブに任せる」
という作業はしたことある人が多いと思うんですが、
その時、別端末のスレーブへの問い合わせがマスタ(兼アプリケーション)への問い合わせより
全然遅いというのはざらにあることなんでしょうか?
僕のネットワークやサーバの設定が特別に酷くてこんなに差が出てるのか、
端末をまたぐ以上不可避の問題なのか知りたいです
mysqlに直接関係なくて申し訳ありません
レプリケーションの設定マニュアルやクエリ振り分けのハウツー解説サイトは見たものの
実装後のこういう問題については見つけられず、スレーブ対象で
たった10行のテーブルから1行selectする処理で5秒かかっていて困っています <>
NAME IS NULL<>sage<>2012/06/17(日) 12:50:45.62 ID:???<> エスパーするとskip-name-resolve <>
643<>sage<>2012/06/17(日) 13:57:47.92 ID:???<> >>649
ありがとうございます! 解決しました! <>
NAME IS NULL<>sage<>2012/06/17(日) 14:08:19.49 ID:???<> やっぱDNSか <>
NAME IS NULL<>sage<>2012/06/17(日) 15:38:45.99 ID:???<> たまにはエスパーしてみるもんだな <>
NAME IS NULL<>sage<>2012/06/17(日) 16:22:04.23 ID:???<> PHPでMySQLから文字取得して表示するときに文字化けします。
全部SJISに設定しているはずですが、実際にはUTF-8で出力されちゃいます。
MySQLから取得した文字以外は正常にSJISで表示できてます。
Linux fedora15
MySQL 5.5.23
PHP 5.3.13
MySQLは
character_set_filesysytem=binary
character_set_system=utf8
以外全部sjisで、my.cnfでもsjisにしています。
PHPはmbstring.internal_encording等SJISにしてます。 <>
NAME IS NULL<>sage<>2012/06/17(日) 17:39:51.69 ID:???<> クライアント(PHP)側の文字コードをMySQLに教えてあげればいいはずですが >>653
http://nonn-et-twk.net/twk/why-set-names-in-php-is-bad
http://www.google.co.jp/#hl=ja&gs_nf=1&cp=13&gs_id=ai&xhr=t&q=php+set+names&pf=p&safe=off&sclient=psy-ab&oq=php+set+names&aq=0&aqi=g2g-K6&aql=&gs_l=&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=f2c9c37eed7aa0d7&biw=1220&bih=698 <>
NAME IS NULL<>sage<>2012/06/17(日) 17:46:05.57 ID:???<> >>654
mysql_set_charset()もPHPに記述しましたがダメでした・・・ <>
NAME IS NULL<><>2012/06/17(日) 17:54:27.51 ID:2N1SRC0A<> 質問させてください。
MySQL+PHPで1週間のスケジュール表を作っています。
ユーザーのテーブルは既に作成済みでuseridが割り振られています。
スケジュールのテーブルはどのように作ったら良いでしょうか?
<>
NAME IS NULL<>sage<>2012/06/17(日) 18:59:22.01 ID:???<> php-mbstringをインストールしていなかったのでインストールしました。
でもやっぱり文字化けするので、
MySQLから取得する毎にmb_convert_encorfing("$ros[""]", "sjis", "auto")で正しく表示されました。
でも根本的に解決できてない… <>
NAME IS NULL<>sage<>2012/06/17(日) 20:31:11.82 ID:???<> DB設計のスレって即死したまま? <>
653<>sage<>2012/06/17(日) 21:39:31.58 ID:???<> 解決しました。
全ての環境をSJISに設定する前にDBに登録していた文字列がUTF8だったために文字化けしていました。
でもMySQLの環境をSJISにしちゃうとLinuxの端末はUTF-8ですしいろいろやっかいなので、
PHP側でいちいちmb_convert_encortingかけてやったほうがよさそうですね。
これだからケータイサイトは…
どうもお騒がせしまいた。 <>
NAME IS NULL<>sage<>2012/06/17(日) 23:56:48.20 ID:???<> ケータイ側に出すとこ、〜から受取るとこで変換するのが定石だと思ってたぜ、俺。 <>
NAME IS NULL<><>2012/06/18(月) 00:36:47.04 ID:xQyQkINj<> id | date1 | date2 | mesg1 | mesg2
----------------------------------
01 | 06-19 | 06-20 | xxxxx | yyyyy
02 | 06-18 | 06-19 | aaaaa | bbbbb
このようなテーブルがあります。
date(1,2)の06-19がdate1ならmesg1を
date(1,2)の06-19がdate2ならmesg2を
取り出してmesgでソートしたい。
つまりこの場合id02を先頭に持ってきたい。
WHERE (date1 = '06-19) OR (date2 = '06-19)
で06-19を取り出してどうやってORDER BYすると良いでしょうか?
下らない質問ですがよろしくお願いします。 <>
NAME IS NULL<>sage<>2012/06/18(月) 00:45:08.15 ID:???<> >>659
skip-character-set-client-handshake入ってない?
入りと出でキャラクタセットが異なるならこのパラメータは外す必要がある <>
NAME IS NULL<>sage<>2012/06/18(月) 20:59:55.77 ID:???<> >>661
マルチ <>
NAME IS NULL<>sage<>2012/06/18(月) 21:01:43.96 ID:???<> >>663 ごめん勘違いだった <>
NAME IS NULL<>sage<>2012/06/18(月) 23:55:04.38 ID:???<> ごめんで済むとかないわ
とりあえず脱いでもらおうか <>
NAME IS NULL<>sage<>2012/06/19(火) 08:52:22.71 ID:???<> 昨日からずっと靴下だけなんだがどうすれば <>
NAME IS NULL<><>2012/06/19(火) 11:54:41.64 ID:dMnsFLWZ<> 会員登録機能付きポータルサイトを作成してるんですが、
ポータルサイトのデータのテーブルは、あれとこれとリレーションして・・・
とつながっていくんですが、
会員登録情報のテーブルがどことも繋がらず孤立してます。
こういうものですか? <>
NAME IS NULL<>sage<>2012/06/19(火) 12:49:06.19 ID:???<> >>667
じゃあ会員登録要らないじゃん。
個人情報集めたいだけ?
だれがなにしたとかのビッグデータが最近のはやりだろうがー <>
NAME IS NULL<><>2012/06/19(火) 13:36:55.85 ID:lfWzwZwu<> >>667
分析や広告に利用する
パスワードリマインダーとかにも
使わないなら無くていいかと <>
NAME IS NULL<>sage<>2012/06/19(火) 13:57:59.13 ID:???<> ログインのためだけに使うなら孤立して当然じゃないの <>
NAME IS NULL<><>2012/06/21(木) 05:57:06.76 ID:GhITmyrm<> 質問です。
スペックが低めのvpsでwebアプリのバックエンドとしてmysql動かしたいんだけど
レコード数が7000万くらいあってindexもつけてるので、insertに時間がかかりすぎる、一日経っても終わらない感じ
んで僕のローカルPCでやると数時間で済むから、
ローカルでやってからmysqldumpしてそれをvpsに送ってロードしようと思った
でもmysqldumpってインデックスは保存してくれない?みたいで、ダンプファイルからのロードもなかなか終わらない感じがした
mysqldumpのダンプファイルにインデックスまで保存する方法はありますか?
又は他の方法があれば教えてください。
いろいろググってみたけれども普段簡単なselect文くらいしか使わないにわかだからさっぱりだった
mysqldumpに--skip-disable-keysをつけるとダンプファイルをロードした後にindexつけてくれるよ!ってあったけど
ロード中につけるのと後につけるのとでそれぞれ何が嬉しいのかもさっぱりわからなかった
ちなみにお仕事じゃなくて個人の趣味でやっとります <>
NAME IS NULL<>sage<>2012/06/21(木) 13:35:39.37 ID:???<> かいけつしました。
http://d.hatena.ne.jp/ichii386/20070924/1190610994
ここを参考にしました
<>
NAME IS NULL<><>2012/06/21(木) 13:36:31.21 ID:GhITmyrm<> 671=672 <>
NAME IS NULL<><>2012/06/22(金) 11:48:12.85 ID:pbtRwu58<> MySQL.com のアカウントを削除することは可能でしょうか?
インストールの際にアカウントを作成する必要がないということを後から知りまして、
不要なアカウントが増えたことに気分が悪い状態です <>
NAME IS NULL<><>2012/06/22(金) 23:04:13.99 ID:Cn9YFSwo<> 行数と列数は固定値ではなく随時追加削除が可能な2次元の表があります
行や列に位置情報は持たせず1件でも更新があれば
クライアントで現在の表のデータをまとめDBで全件更新するシステムを考えてます
1件でも行や列に作用があったら表の全データをDBに送り
一度表に関連する行と列を全てdeleteしinsertしなおすという手法を考えてます
当然行や列が増えるとやばそうなことになるのですが
こういうシステムってありだと思いますか?
さすがに列値の更新と行の削除ならそこまでしなくても大丈夫ですが <>
NAME IS NULL<>sage<>2012/06/23(土) 02:06:17.77 ID:???<> RDBで、カラム数可変ってのはどうなんだろな。
やり始めの頃に「欲しいな」と思ったことは無くは無いけど。
つか、毎度毎度全書き換えするんだったら、
全書き換えの際の元になるファイルをそのまま使えばいいじゃん。
どうしてもDBも絡ませたいなら、キー情報とそのファイル内への
ポインタ情報だけDBに持たせとくとか。 <>
NAME IS NULL<>sage<>2012/06/23(土) 03:05:34.62 ID:???<> おっしゃるとおりなのですが表としてのみつかうわけではないので
表を作ってしまうというのはできず・・・
かといって全更新でないと色々と実装が大変で困ったものです <>
NAME IS NULL<>sage<>2012/06/23(土) 06:50:56.75 ID:???<> >>675
MySQLをやめて最近の列指向DBの採用だな <>
NAME IS NULL<><>2012/06/23(土) 11:47:15.78 ID:EwT5t8nA<> UNIQUE制約つけると自動でインデックスが作成される的なことを吹きこまれて???状態だったのですが
一意を保証するUNIQUE制約と
CREATE INDEXのUNIQUEインデックスって別物ですよね?
UNIQUE制約つけてる場所にCREATE INDEXでインデックス貼っても無駄にならないですよね? <>
NAME IS NULL<>sage<>2012/06/23(土) 18:31:44.94 ID:???<> ユニーク制約かけてるカラムに、さらにcreate indexでユニークのインデックス作るの?
無駄だと思うよ。
ユニーク制約かけた時点で自動的にユニーク用のインデックスが作られるわな。 <>
NAME IS NULL<>sage<>2012/06/23(土) 20:24:27.51 ID:???<> >>680
ありがとうございます
UNIQUE制約つけるとインデックスも作成されるという
吹き込まれたことは正しいことだったんですね <>
NAME IS NULL<><>2012/06/23(土) 21:19:18.43 ID:VC/yQrwj<> >吹き込まれたことは正しいことだったんですね
吹き込んだ奴が常日頃信用されていない事がよく分かるレス <>
NAME IS NULL<>sage<>2012/06/23(土) 21:54:32.57 ID:???<> あほかい
自分で確認くらい出来るだろうに <>
674<><>2012/06/24(日) 02:07:06.96 ID:8bK9xUPQ<> 精神が侵されるぅううううううううううううううううううううう!!!!! <>
NAME IS NULL<>sage<>2012/06/26(火) 11:07:08.36 ID:???<> いええええええええええええええええええい!!!!!! <>
NAME IS NULL<><>2012/06/30(土) 03:38:07.08 ID:U8O6meg/<> var5.5でレプリケーションの勉強をしてるんですが、マスタの内容がスレーブに反映されないエラーが起きました
当初事態を把握できず、5回ほどinsertを繰り返してスレーブのログを見たり show slave status \G;して
Slave_SQL_RunningがNOになってるのに気づいたのでした
それで、SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;したものの回復せず、次に
my.cnfにslave-skip-errors=1062と記述し、サービスを再起動してそのあとに実行したinsetは反映されました(Slave_SQL_Runningも正常になった)
ここで質問なのですが、
「SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;を5回繰り返す」にせよ「my.cnfにslave-skip-errors=1062と記述して再起動」にせよ
最初のエラーが発生したあとのSQLのリクエストはすべて無視されてしまうんですよね?
(マスタで5回insertしたのに、スレーブにはその分のデータがなかった)
そうだとすると、とりあえず動くようにするというだけで全然レプリケーションの意味がない気がします
エラー発生後のリクエストを順に実行して整合性を保つ方法ってないんでしょうか?
どうやったら良いんでしょうか、ご意見お願いします <>
NAME IS NULL<>sage<>2012/06/30(土) 04:16:07.51 ID:???<> masterのMySQL止めてデータをslaveに移してから
レプリケーション再開したら直るけど、master
動かしながらやる方法は知らない <>
NAME IS NULL<>sage<>2012/06/30(土) 05:57:48.25 ID:???<> >>686
折を見てスレーブ再構築するしかないよ。
あとbinlog_format = mixed試してみて。 <>
NAME IS NULL<><>2012/06/30(土) 09:58:23.14 ID:OoZcXmth<> 世の中のマスターってそんなに簡単に止められるものなの?
うちのマスターは夜中でも止められない。
マスター止めるかお前が辞めるか好きな方選べみたいなノリすらある。 <>
NAME IS NULL<>sage<>2012/06/30(土) 11:36:18.22 ID:???<> MySQLのバックアップ方法で質問ですが、現在はAutoMySQLBackupを使って一端固めて
それを外部からrsync使ってバックアップしていますが、もう少し効率的なバックアップ方
法ってありますでしょうか?
ちなみに、これとは別にリプリケーションによる障害対策は行っています。 <>
NAME IS NULL<>sage<>2012/06/30(土) 14:40:58.44 ID:???<> >>689
スレーブ再構築はマスタとめなくてもできるよ
InnoDBしか使っていなければ <>
NAME IS NULL<>sage<>2012/06/30(土) 14:42:42.65 ID:???<> >>690
LVMスナップショットでやる方法もあるけど、
実績重視で特に変更しなくてもいいと思う <>
NAME IS NULL<><>2012/06/30(土) 17:22:03.72 ID:k0CJivDe<> BOOLEAN MODEでの後方一致検索のやりかたを教えてください。
たとえば、hogeを検索するのに、
select word from wordList WHERE MATCH (word) AGAINST ('hog*' IN BOOLEAN MODE);
だと検索にかかるのですが、
select word from wordList WHERE MATCH (word) AGAINST ('*oge' IN BOOLEAN MODE);
だと検索に失敗します。
最終的にLIKEと同じような使いかたができることを確認したいのですが。。
select word from wordList WHERE MATCH (word) AGAINST ('*og*' IN BOOLEAN MODE);
<>
NAME IS NULL<>sage<>2012/06/30(土) 20:28:35.53 ID:???<> >690
スレーブを止めて好きな方法でバックアップする。
STOP SLAVEでレプリケーションだけとめてmysqldumpでもいいし、
サービス自体とめてファイル単位のバックアップソフトでもいい
マスタからバックアップを取りたいなら、--master-dataオプション付でmysqldump
#こっちは>689にもいえるかな
オプションでつける数字は
・バイナリログ使って最新まで復旧させたい:1
・別のデータベース名でリストアするかもorレプリケーションできなくていい:2
で設定しておけば、まず大丈夫 <>
694<>sage<>2012/06/30(土) 20:33:49.79 ID:???<> あ、後半のmaster-dataは全テーブルがInnoDBの場合限定ね <>
NAME IS NULL<>sage<>2012/06/30(土) 21:38:24.80 ID:???<> >>868
slave-skip-errorsは
"このエラーでレプリケーションに失敗しても、その行を無視してレプリケーションを続行"だから、
その設定なら1062(一意制約違反)以外のエラーならスキップされない。
あと、レプリケーションが止まるのは"何度リトライしても絶対に反映できないエラー"の時で、
ロックのタイムアウトとかは勝手にリトライするから大丈夫。
後から来たデータが正しいか前からあったデータが正しいかは基本的に判断できないけど、
常に前からあったデータが正しいと仮定して動作させるのがslave-skip-errorの動作。 <>
NAME IS NULL<>sage<>2012/06/30(土) 21:42:11.51 ID:???<> >>693
後方一致は指定できない。
セパレートされた単語でしかHITさせないのがmatch .. against。 <>
NAME IS NULL<>sage<>2012/07/01(日) 02:44:10.54 ID:???<> >>692
>>694
なるほど、ありがとうございました。
リプリケーションのDBはスレーブに関しても止めたくないので、現状で
このままで行こうかと思います。
とはいえ、そろそろDB自体がかなり大きくなっているので、杉のステージ
にする必要が出てきたような気もします。 <>
NAME IS NULL<>sage<>2012/07/01(日) 02:44:44.80 ID:???<> >杉のステージ
>次のステージ
失礼しました。 <>
693<>sage<>2012/07/01(日) 11:52:46.76 ID:???<> >>697
>セパレートされた単語でしかHITさせないのがmatch .. against。
ありがとうございます。
LIKEと同じ使いかたが出来ないと分かりました。
しかしセパレートされた単語の後方一致も不可となると、
ひどく使いにくい気がするのですけれども、そこは(何らかの方法で)セパレートを増やすしかないですか。
<>
NAME IS NULL<>sage<>2012/07/02(月) 14:35:12.28 ID:???<> >>700
日本語だと単語境界が上手く判定しづらいってことで、
2文字ずつにトークナイズするのが主流っぽい。
プラグインを入れられる環境ならmroongaを使えば、特にSQLをいじらずにその辺を上手くやってくれるらしい。
ただしよく落ちると知り合いが嘆いてる。
SQLを書き換えても良いなら"MySQL 転置インデックス"でググるとヒントがあるかも。
ただしすごく重いと知り合いは嘆いてる。
俺はどっちも試してない。。(´・ω・`) ごめんよ。 <>
NAME IS NULL<>sage<>2012/07/03(火) 21:32:54.68 ID:???<> >>701
ありがとうございます。参考になりました。 <>
NAME IS NULL<><>2012/07/03(火) 21:55:19.40 ID:yHAOcDp7<> 以下のようにitem_id=3と2のときの上に来るように、
ソートに例外条件を追加したいのですが、
条件数が増えたときに、もっと簡単に記述する方法はないでしょうか?
SELECT item_id, use_count FROM countTable order by
(CASE WHEN item_id = 3 THEN 1 ELSE 0 END) DESC,
(CASE WHEN item_id = 2 THEN 1 ELSE 0 END) DESC, use_count DESC
item_id use_count
3 5
2 7
1 12
4 10
一般的に、条件数が十個くらいなら、こういう書き方してもそれほど負荷にはならないものなのでしょうか? <>
703<>sage<>2012/07/03(火) 22:08:02.90 ID:???<> すみません。それと、item_id = 3, 2はこの順番になるようにしたいです。
(CASE WHEN item_id = 3 or item_id = 2 THEN 1 ELSE 0 END) DESC
と書ければすこしはマシになるのですが。 <>
NAME IS NULL<>sage<>2012/07/04(水) 10:02:33.52 ID:???<> >>703
並べ替え用の条件テーブルを作ってJOINするのが一番綺麗かも。
CREATE TABLE sortPri ( item_id INT, order_pri INT, PRIMARY KEY (item_id));
SELECT * FROM sortPri;
+---------+-----------+
| item_id | order_pri |
+---------+-----------+
| 2 | 100 |
| 3 | 200 |
+---------+-----------+
で、こうJOIN。
SELECT countTable.item_id,countTable.use_count
FROM countTable LEFT JOIN sortPri USING(item_id)
ORDER BY sortPri.pri DESC;
ちなみにORDER BY カラム位置 の構文は、今後廃止される可能性があるってなってるから
CASE .. WHENでやるにしてもNULL ELSE item_idのが良いかと思う。
ttp://dev.mysql.com/doc/refman/5.1/ja/select.html <>
NAME IS NULL<>sage<>2012/07/04(水) 14:51:26.36 ID:???<> >>705
ありがとうございました。
ORDER BY sortPri.pri DESC, use_count DESCでうまく行きました。 <>
NAME IS NULL<>sage<>2012/07/10(火) 20:59:30.35 ID:???<> ?のバージョンで統計情報の収集を行い、その後、統計情報が正しく実行出来たか確認する方法を教えて下さい。
なお、アナライズ実行時の返り値以外の方法でお願いします <>
NAME IS NULL<>sage<>2012/07/10(火) 21:01:42.71 ID:???<> 5.1のバージョンです↑
<>
NAME IS NULL<>sage<>2012/07/10(火) 22:51:42.31 ID:???<> 多分ない
まず、各コネクションは独立して、不可侵なことが保証されているので、
統計情報の更新を実行したコネクション以外状況は判断できない。
後から確認したいなら、どこかにログを残しておくぐらいかな。
まぁ、統計情報更新クエリがDB障害によりエラーになった場合は
MySQLログに出力される可能性はあるので、ログを監視すれば
分かるかもしれないが、そういう時は統計情報以前にDBがおかしい。
質問の趣旨が「統計情報が不正確でオプティマイザが正常に判断できない」
というものなら、「そういうものです」。
統計情報はMySQLに限らずほとんどのRDBMSがサンプリングで行うので、
サンプルで取り上げられたデータの偏りで決まってしまう。
普通は保存データ量が増えるに従いデータの中身も程よく分散してくるので、
オプティマイザも正しく判断するようになります。
全データを網羅して統計情報を構築するRDBMSってあるのかな? <>
NAME IS NULL<>sage<>2012/07/13(金) 21:59:15.34 ID:???<> ゴキ光線は風前の灯やな( ´Д`)y━・~~ <>
NAME IS NULL<>sage<>2012/07/14(土) 17:10:18.97 ID:???<> 管理ツールのお勧めってありますか?
adminer あたりにしようかと思ってますが <>
NAME IS NULL<>sage<>2012/07/14(土) 23:49:25.21 ID:???<> >>711
ゴキブリってどや <>
NAME IS NULL<><>2012/07/15(日) 01:42:22.33 ID:RrRsvsQU<> ttp://jul.2chan.net/img/9/src/1342280425177.png
ttp://multip.net/view/giZtiUaM5q
大津イジメ自殺のアレで、
小網武里のイジメ証拠動画がアップきた!!!
撮影者は不明。
つか、これ傷害罪確定だろ。
こんなこと毎日されたら、そりゃ自殺するな。
なお、画像なんかは拡散OKっす。 <>
NAME IS NULL<>sage<>2012/07/16(月) 16:59:31.68 ID:???<> table(
uid int unique,
tid int
)
SELECT * FROM table;
でリクエストした時、例えばリクエスト結果の中に tid=AAA が何番目にあるかを
知る方法ってあるんでしょうか? <>
NAME IS NULL<><>2012/07/17(火) 16:07:49.87 ID:/0OPFvGM<> コマンドプロンプトから varchar(10)に'あ'をinsertしたら正しくない文字ですとでてしまいます
'a'ならちゃんと格納できます
日本語が格納できないようなのですが原因は何が考えられるでしょうか? <>
NAME IS NULL<>sage<>2012/07/17(火) 16:22:35.05 ID:???<> OS,バージョンとかデータベースやテーブルの日本語の設定はどうなっているかとか情報を全然出さずに <>
NAME IS NULL<>sage<>2012/07/17(火) 16:38:02.59 ID:???<> ゴキ光線のお小言が始まるでぇ〜( ´Д`)y━・~~ <>
NAME IS NULL<>sage<>2012/07/17(火) 16:41:43.32 ID:???<> すみません自己解決しました
コマンドプロンプトから格納に指定した文字列はutf-8とは違う文字コードだったのが原因のようです
mysqlの方で扱う文字をcp932に変更したら格納できました <>
NAME IS NULL<>sage<>2012/07/17(火) 16:55:32.35 ID:???<> >>714
結果セット内の順番を知りたいというのはアプローチが誤っている
なぜ知りたいのか、その目的を書くべき
>>718
クライアント側の文字コードを変更する方法がある
mysql> set character set cp932; <>
NAME IS NULL<>sage<>2012/07/17(火) 22:53:28.49 ID:???<> >>714
ごめん、下策しか思いつかなかった。
SET @a:=0; SELECT * FROM (SELECT @a:=@a+1 AS rownum,`table`.* FROM `table`) AS dummy WHERE tid = ..;
1. tableを2回フルスキャンするからすごく重い
2. テンポラリテーブルを使うので、max_heap_table_sizeとtmp_table_sizeをそれなりの値にしないとMyISAMに変換されて更に重い
3. tidにINDEXが貼ってあってもサブクエリ化するので利かなくなる <>
NAME IS NULL<>sage<>2012/07/18(水) 02:08:46.73 ID:???<> >>719
MySQL の勉強を兼ねて Twitter のようなものを作っているのですが、レス先の前後 (実際にはレスされた一覧の表示は
30件ずつ表示してて、それらはページ単位で扱っています) を表示したいと考えています。
1つの発言に数千、数万のレスが付く可能性も現実としてありえるということを考えた場合に、
プログラム側で無駄なループを省きたいため、指定したカラム中の値が一致した行が結果の中の何番目に
あるのかと言うのを知れたらなと。考えていました。
>>720
勉強しはじめたばかりなのでパッと見理解出来ないので、じっくり解読してみます。
ありがとうございます。
<>
NAME IS NULL<>sage<>2012/07/18(水) 13:00:29.89 ID:???<> >>721
日時カラムを持って、日時でソートすればええんでわ。 <>
NAME IS NULL<>sage<>2012/07/18(水) 14:10:49.29 ID:???<> 入門書を読みながら、XAMPPでMySQLをはじめたのですが、
テーブルにレコードを追加するSQL文(INSERT INTO〜)を実行しても「返り値が空でした。」となってしまい、レコードが追加されません。
どのような原因が考えられますでしょうか? <>
723<>sage<>2012/07/18(水) 14:18:43.79 ID:???<> 連投すみません。以下のような文です。
INSERT INTO anketo (nickname,email,goiken) VALUES ("名前","Eメール","ご意見") <>
NAME IS NULL<>sage<>2012/07/18(水) 16:15:22.78 ID:???<> それはMySQLのコンソールで直やってみたのか、それともPHP経由とかのどっち?
MySQLのコンソールで直やってみて駄目っていうなら入力間違いだし、直でならOKっていうなら
PHPとかの設定間違いなんだろうし <>
NAME IS NULL<>sage<>2012/07/18(水) 16:43:29.10 ID:???<> >>721
結果セット内での位置がわかったところで
結局は一度全部取得しなきゃならないわけで、
取得するに主キーをハッシュキーにしたハッシュテーブルを一緒に組み立てて
逆引き出来るようにしたらいいじゃないかな <>
NAME IS NULL<>sage<>2012/07/18(水) 16:44:15.65 ID:???<> - 取得するに主キーを
+ 取得する際に主キーを <>
NAME IS NULL<><>2012/07/18(水) 18:56:14.76 ID:J6edWvlF<> mysql内で変数が使えると聞いたのでさっそくつかってみたのですが、
SELECT
@num1:=5
@num2:=7
@num1 + @num2 as answer
とすると ちゃんと
[answer] => 12
となるのですが、
@num1:=5
@num2:=`hoge_column`
@num1 + @num2 as answer
と、カラム指定をすると、挙動がおかしくなります。
何が原因と考えられるでしょうか?
<>
NAME IS NULL<>sage<>2012/07/18(水) 19:33:17.61 ID:???<> アドバイスもらいたいなら、どう「おかしく」なったのかちゃんと書こう <>
714<>sage<>2012/07/18(水) 22:00:43.87 ID:???<> >>726
こうやってスレを見てると、ループで回すのが普通って感じがしてきました。
質問を重ねて申し訳無いのですが、
select * from table where tid='AAA';
としようとする時、tid='AAA' を含む、tid='AAA' の前後 10 件を取得する。
と言ったのは、どう書けば良いのでしょうか?
<>
714<>sage<>2012/07/18(水) 22:42:04.31 ID:???<> ググッてたら、order を使えば前後が取得出来そうですね
SQL って発想力必要だなぁ <>
NAME IS NULL<>sage<>2012/07/21(土) 11:20:13.40 ID:???<> date型に紀元前の日付入力するにはどうしたらいい? <>
723<>sage<>2012/07/21(土) 15:52:25.48 ID:???<> >>725
遅レスすみません。自己解決しました。
SQLに直だったのですが、入力するフォームが違っていたようです。
SERECTなどの形式がボタンを押すだけで出てくるフォームがあったので、
そこかと思っていたのですが、違いました。なぜそこではダメだったのかは未だ謎です。 <>
NAME IS NULL<><>2012/07/22(日) 02:35:20.93 ID:GFxzwA7B<> LAMPにてWEBシステムを構築しています。
・centos5
・mysql(5.0.95)
・apache(2.2.3)
・PHP(5.2.17)
phpからPDOを使用し、各種クエリーを発行しているのですが、
ある一定時間経っても終了しない場合、なんらかの処置をしたいと考えています。
そこで、クエリータイムアウト的な機能を調べてみたのですが、どうにも見つけることができませんでした。
自前で「processlist」を参照し、killするしかないのでしょうか? <>
NAME IS NULL<>sage<>2012/07/22(日) 06:53:11.91 ID:???<> 非同期で SQL を発行しない限り、実行時間は PHP > MySQL である。
PHP の時間時間の制限を php.ini に書けば良い。
ただし Apach のタイムアウトもあるから、気を付けて。
<>
NAME IS NULL<>734<>2012/07/23(月) 02:07:52.47 ID:???<> >>735
ご回答頂きまして、ありがとうございます。
私も当初、ご教授頂いた方法を検討していました。具体的には、
max_execution_time(もしくは、set_time_limit関数)
へ値を設定する方法です。しかしながら、
リファレンスには、
> このスクリプト自体の実行時間にのみ影響を与えます。
> system() を用いたシステムコール、ストリーム操作、 データベースクエリ等のスクリプト実行以外で
> 発生する処理にかかった時間は スクリプトが実行される最大時間を定義する際には含まれません。
とあり、実際、動作を確認したところ、クエリー発行後、上記変数に設定した秒数を経過してもスクリプトは停止しませんでした。
また、apacheについてですが、具体的には、
TimeOutディレクティブ
へ値を設定する方法だと思うのですが、こちらは、socketに対するもので、処理自体が停止するものではないようです。 <>
NAME IS NULL<>sage<>2012/07/24(火) 22:35:48.73 ID:???<> >>734
PHPはまったく知らんで言うが、
alarmは使えないの?
Perlだったらきっとそうするところ。
<>
734<><>2012/07/24(火) 23:34:46.67 ID:BXivuFmq<> >>737
ご回答頂きまして、ありがとうございます。
調べてみましたがphpでは、「alarm」のようなタイマー(スケジューラー)関数は無いようです。 <>
NAME IS NULL<><>2012/07/25(水) 11:33:40.80 ID:jKWHyDhx<> 以下のように、空文字列のはずのフィールドがNULLと表示されてしまいます。
別のサーバで試すと空文字列として表示されるので、どこか設定
があると思うのですが、どこを見ればいいでしょうか?
バージョン5.0.22です。
CREATE TABLE `n` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into n (name) values ('');
insert into n (name) values (NULL);
[test]> select * from n;
+----+------+
| id | name |
+----+------+
| 1 | NULL |
| 2 | NULL |
+----+------+
2 rows in set (0.00 sec)
[test]> select * from n where name='';
+----+------+
| id | name |
+----+------+
| 1 | NULL |
+----+------+
1 row in set (0.01 sec)
[test]> select * from n where name is null;
+----+------+
| id | name |
+----+------+
| 2 | NULL |
+----+------+
1 row in set (0.00 sec) <>
NAME IS NULL<><>2012/07/26(木) 01:22:36.00 ID:AwMJ+F5s<> START TRANSACTION
LOCK TABLE テーブル名 WRITE
〜 SELECT, DELETE, INSERT の混ざった処理 〜
UNLOCK TABLES
COMMIT
という流れでSQL文を実行しているのですが、
テーブルロックをかけなかった場合は DELETE が一瞬で終わるのに、
かけた場合では50ミリ秒ほどかかってしまいます。
これは何故なのでしょうか?
MySQLで、InnoDBです。 <>
NAME IS NULL<><>2012/07/26(木) 10:16:25.40 ID:PX3MqUQ9<> Postgresだと
SELECT id FROM (VALUES (1),(2),(3)) AS hoge(id);
というSQLが可能ですが(多分標準SQL)
これをMySQLで実現するには、テンポラリテーブル作るしかないのでしょうか? <>
NAME IS NULL<>sage<>2012/07/26(木) 11:16:24.09 ID:???<> >>739
5.0.96と5.5.25では再現しなかった。
sql_modeかなと思ったんだけど、いくつか試しても見当たらない。。
別のサーバってバージョンとかmy.cnf同じ?
>>740
試したけど有意な差は出なかった。。
始める前に
SET PROFILING=1;
DELETEした直後に
SHOW PROFILE;
で、どこで時間がかかったかざっと見られる。
別の話だけど、LOCK TABLESかけるとトランザクションは暗黙のCOMMITされるから
completion_typeを1に設定してないとROLLBACK利かなくなるよ。
>>741
テンポラリテーブルかFROM句サブクエリかな。。 <>
741<><>2012/07/26(木) 11:58:12.64 ID:PX3MqUQ9<> >>742
解答ありがとうございます。
サブクエリで複数行の一時テーブル的なのって作れるんでしょうか?
上記の例で言うと
ID
1
2
3
といった形になるのですが。 <>
740<><>2012/07/26(木) 14:51:31.46 ID:AwMJ+F5s<> >>742
レスありがとうございます。
ご推察の通り、原因はテーブルロック時に行われる暗黙のCOMMITにありました。
自動コミット機能をオフにすることで、高速に動作させることが出来ました。
ありがとうございました本当に助かりました! <>
NAME IS NULL<>sage<>2012/07/26(木) 14:57:15.58 ID:???<> >>743
SELECT id FROM (
SELECT NAME_CONST('id',1) UNION SELECT 2 UNION SELECT 3
) AS duumy;
になっちゃうと思う。
美しくなくてごめん。。 <>
NAME IS NULL<>sage<>2012/07/26(木) 14:58:45.74 ID:???<> >>744
おまけのつもりだったんだけど、助けになれたなら良かった! <>
741<><>2012/07/26(木) 16:29:18.45 ID:PX3MqUQ9<> >>745
UNIONでって事ですね。
理解しました。
20個行とかになってしまうので、ちょっと厳しいですね。
テンポラリで対応する事にします。
ありがとうございました。
<>
NAME IS NULL<><>2012/08/01(水) 16:12:07.08 ID:UWVp+x7J<> id , reg_gmt , res_gmt , title と言うカラムがあります。
res_gmtが空白に一致するもので、reg_gmtで昇順ソートしたものを取得するにはどのようにしたら良いですか? <>
NAME IS NULL<>sage<>2012/08/01(水) 22:38:19.27 ID:???<> tritonnとphp、IISを使用した検索システムがあります。
タスクを使用して朝と昼にoracleのテーブルを基にmysqlにテーブルを作成する運用をしています。
テーブル作成直後は検索効率が落ちるため、select * from db1をぶちこんで全てのレコードを
テーブルにキャッシュさせるようにしたいのですが、タスクスケジューラやbat処理では
自動でキャッシュされなくて困っています。
現状batファイルと同じ内容を記述したphpを実行させるボタンをページに作成しておき、
クリックしてキャッシュさせています。
違いといえばcmdが絡むので、shiftjisを経由していることくらいなのですが、
select文実行前にはutf8を使用するようには記述しています。
ご助言をいただけると助かります。 <>
749<><>2012/08/01(水) 22:42:42.81 ID:JN6avP4B<> sage消し忘れました。 <>
NAME IS NULL<>sage<>2012/08/01(水) 23:47:26.04 ID:???<> >>748
SELECT .. FROM .. WHERE res_gmt = '' ORDER BY reg_gmt; ってことで良い?
それとも、基本はres_gmtでソートするけど、空白の行だけ代わりにreg_gmtを使ってソート?
>>749
Trittonってことは本質MyISAMエンジン、で合ってるっけ?
MyISAMのデータのキャッシュはOSのファイルシステムにお任せなので、
キャッシュされてるかされてないかを探るのは大変だと思う。
クエリキャッシュのことじゃないよね?
何を以て`phpから叩くとキャッシュされる'けど`batからだとキャッシュされない'って思ったか教えてもらえると助かる。
あと、文字コードはデータキャッシュ関連の動作には関係しないのでそこはOKかと。
今思い付いたんだけど、batから叩くときのデフォルトデータベース指定してる?
(SELECT文そのものが転けてないかなって思った。指定してたらごめん) <>
749<><>2012/08/02(木) 06:44:47.62 ID:C7npLqI0<> >>751
MyISAMであってます。
クエリキャッシュのことではない、はずです。
(完全にシステムを把握していないので、確認不足です)
phpにはMySqlConnection()使ってdbと接続情報を関数定義した後、
接続にutf8を使うようにセットし、その後select * from db1文を
セットするまでの記述をしています。
Web上ではjavascriptを使ってこのphpを実行し、終了したらajax処理で
画面更新しています。
batはphpの実行ファイルのパスを記述して、直後にこのphpのパスを記述しています。
batではこけてるので、このphpのコピーをphp.exeに関連付けてタスクスケジューラに
いれてますが、それもこけています。
<>
749<><>2012/08/02(木) 07:54:51.84 ID:7tofjJgZ<> >>751
携帯から追記します。
前レスの内容から、同じ処理を別の手段で実行しているにも関わらず
batではこけるということで、batではうまくいかない、と思っています。
しかし、oracleからmysqlのテーブルを作成するまでをbatで処理しており、
そちらもphpを実行する内容ですが、正常に終了しているので、
batを開始してphpを実行し、select文を発行してキャッシュさせよう、
というところでつまっています。 <>
NAME IS NULL<>sage<>2012/08/02(木) 13:51:17.17 ID:???<> >>753
ということは、batで叩いたときにはキャッシュできないというより
SELECT自体が失敗してるってことかな?
phpファイルの読み取り/実行権限
- IIS経由だとIISワーカーグループ(だっけ?)だけど、batだとそのユーザーになる
bat実行時にそもそも何かエラー吐いてないか
- pauseとかでキャッチしてみる
辺りはどう? <>
749<><>2012/08/02(木) 21:05:39.37 ID:7tofjJgZ<> >>753
false時にメッセージを返すようにしても、メッセージは返らなかったので、成功しているようです。
ついでにselect文発行後に待機時間を設定したところ、検索速度が向上したため待機した場合はキャッシュされているようです。
ただ、その後、30分や1時間あけて検索を行うと初回のみ検索が遅くなる場合があるようです。
検証回数が少ないので、なにが影響しているはわかっていません。
今のところ、batだとselect文発行からキャッシュまでの処理が完了する前にプロセスが終了しているので
キャッシュされていない、ようにみえますが、通常の動作なのかも不明です <>
NAME IS NULL<>sage<>2012/08/02(木) 22:12:14.00 ID:???<> 「キャッシュされない」
「こける」
「成功している」
全部同じ現象を指しているのか??? <>
NAME IS NULL<>sage<>2012/08/03(金) 00:01:13.01 ID:???<> >>755
そっかー。疑って失礼。。
↓明日時間が取れたら試してみる。
Sennaは用意出来ないから純MyISAMでだけど。。
読み込みの動作自体、キャッシュに載せてからそれをユーザー空間にコピーしてるっぽいから、
キャッシュに載り切る前にbatが終わるっていうのは考えにくいかなぁ、と思ってる。
ttp://msdn.microsoft.com/en-us/library/windows/desktop/aa364218(v=vs.85).aspx
あとNTFSだったらCopyOnWriteで書き込むから、
インポートした時にキャッシュされてもおかしくない気がするよなぁ。。
時間が経った後に初回だけ遅いっていうのは、キャッシュからこぼれたからだと思う。
2回目以降に速度が改善してるならなお。
ただし、2回目が全く同じクエリだったならクエリキャッシュって可能性のが強いか。。 <>
749<><>2012/08/03(金) 06:47:48.08 ID:nVSxR0GP<> >>757
前任者はOralceのバッファキャッシュみたいなことを常にするようにしたい、らしかったそうです。
私が現在クエリキャッシュと今行っているselect文のキャッシュの違いについて
完全に把握していないのですが、
クエリキャッシュは同一の問い合わせがあった場合、前回の結果をそのまま返す機能で、
select文のキャッシュはディスクではなく、メモリ上のキャッシュで処理を行う、
という認識でよいでしょうか。
>> ただし、2回目が全く同じクエリだったならクエリキャッシュって可能性のが強いか。。
この認識であれば、2回目の検索では異なる条件のクエリを実行していますので、
クエリキャッシュではないと思われます。
1.select文を発行しない→15秒かかる
2.→select文発行後検索を行う→0.1秒かかる
3.→→再度同じ条件の検索を行う→0.001秒かかる
というように違いがあり、1.の自動化を目的としています。
>>↓明日時間が取れたら試してみる。
お手数おかけしますが、非常に助かります。ありがとうございます。
<>
NAME IS NULL<><>2012/08/03(金) 14:28:26.15 ID:XR0LUV2I<> 今日より、5日前より以降にアップデートされた
データのみ抽出 をしたくて
WHERE
`up_date` > 'current_timestamp + interval -5 day'
と書いたのですが 1件も出て来ません。
なぜでしょうか <>
759<><>2012/08/03(金) 14:34:49.10 ID:XR0LUV2I<> ADDDATE(now(), INTERVAL -5 DAY)
にしたらうまくいきました。
<>
NAME IS NULL<><>2012/08/03(金) 14:56:50.40 ID:XR0LUV2I<> sql って WHERE文に、
何もなくてもとりあえず実行できるようにできないものですか?
WHERE
$変数
みたいなことをやってあらゆる条件文を足せるようにしてるのですが
全く条件がない場合 WHERE のみになっていまうので
エラーになってしまうのです。 <>
NAME IS NULL<>sage<>2012/08/03(金) 15:37:50.32 ID:???<> >>758
ごめん、今日がっつりやる時間取れそうにない_| ̄|○
クエリキャッシュは認識の通り。
Oracleのバッファキャッシュに相当するものはMyISAMエンジンには無くてOSに全任せ。
OSがファイルキャッシュを持っていればそこから読むし、無ければDISKから読んでOSからmysqldに返す。
(なもんで、mysqldから見るとDISKから読んでるのかOSのキャッシュから読んでるのか判らない)
OS任せの部分だから、これをちょっと改変してキャッシュの載り具合を比較するしかないかなと思ってた。
ttp://gallery.technet.microsoft.com/scriptcenter/50efb1d2-3c1c-4765-b91d-120c162b90f1/
>>761
WHERE句を自動生成する様な場合、
$a = "WHERE 1=1";
foreach (..) {
$a .= "AND .. ";
}
ってやるケースがある。
これならforeachで1個も回らなくてもWHERE 1=1になって常にtrueだから。 <>
NAME IS NULL<>sage<>2012/08/03(金) 23:14:29.18 ID:???<> 質問です。
MySQLで小数点を使う場合に、下記の3つの選択肢があります。
1)floatを使う
2)doubleを使う
3)decimalを使う。
体重を管理するソフトを作ってまして、この際、体重の値を格納するカラムに使う型は、
何にするべきでしょうか?(小数点は2ケタで考えています)
また、それぞれどの場面で、どの型を使うという考え方がありましたら教えてください。
<>
NAME IS NULL<>sage<>2012/08/04(土) 13:44:48.07 ID:???<> 4)100倍して、整数型に入れる <>
NAME IS NULL<>sage<>2012/08/05(日) 00:03:51.57 ID:???<> >>763
体重ならどれでも良いと思う。俺ならDECIMAL。
どの型を選ぶかの目安は、
0) 1レコードあたり数byte無駄に使うのが許せる?
⇒許せる .. decimal型
⇒許せない .. 1)へ
1) 1/100兆〜/100程度まで誤差が出ても許せる?
⇒許せる .. 2)へ
⇒許せない .. decimal型
2) 格納する値は小数点以下含めて7桁以内、または15桁以内で収まる?
⇒7桁以内に収まる .. single型
⇒15桁以内に収まる .. double型
⇒15桁では収まらない .. decimal型
かなと。
アプリの側で10^3倍して整数型に入れるのも勿論アリ。
ただ、アプリ側の人が(コードのメンテ含め)面倒で間違えやすくなると思うし、
DECIMALは多少データサイズが不利(数バイト単位)だけど、
数千万レコードでミリ秒単位のレスポンスを争うわけじゃなければ問題にならないと思うから
そんな環境でなければDECIMAL型で良いと思う。 <>
NAME IS NULL<>sage<>2012/08/05(日) 00:05:32.01 ID:???<> あ、ごめん、singleじゃなくてfloatだ。。。 <>
NAME IS NULL<><>2012/08/05(日) 00:58:10.06 ID:ys5zxbE7<> >>763
体重ならグラム管理にして抽出SQLか表示側で調整したほうがよくね
>>764の通りだが <>
NAME IS NULL<><>2012/08/06(月) 10:20:08.08 ID:MtYz/kb4<> mysqldump -u root -p DB名 テーブル名
とすれば特定のテーブルのみダンプ出来ますが、
逆に「特定のテーブルのみ除外」するにはどう書けばいいのでしょうか?
MySQL5.1.54を使用しています。 <>
NAME IS NULL<>sage<>2012/08/06(月) 11:11:00.76 ID:???<> >>768
--ignore-tableオプション。
ttp://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html <>
NAME IS NULL<><>2012/08/06(月) 13:21:54.95 ID:MtYz/kb4<> >>769
希望通りできました。ありがとうございました。 <>
NAME IS NULL<><>2012/08/06(月) 22:53:06.69 ID:FO8S+xhX<> 質問です。mysql5.5.25を使ってます
ファックスの番号を入れるカラム fax1,fax2,fax3があって、すべて
tinyint(4) /default NULL/NULL YES の構造になっているんですが、
フォームの入力で該当テキストエリアが空欄の状態でinsert / updateしようとすると0が入ってしまいます
これはこういう仕様なんでしょうか?
空欄の状態でinsert/updateした場合にNULLにしたいと思っているんですがどうしたら良いでしょうか
よろしくお願いします <>
771<>sage<>2012/08/06(月) 23:05:18.80 ID:???<> すみません、全然正確じゃありませんでした
・空欄でinsertすると0が入る
・空欄でupdateしようとすると変更が反映されない(他のカラムも。update全体が無効のようです)
どうしたら良いのでしょうか <>
NAME IS NULL<><>2012/08/06(月) 23:30:53.09 ID:Kjs7fwLl<> mysqldump(1) && restoreについて質問です
# mysql -u root < dump.sql
すると、既存のDBやテーブルは1回全部消されてから、書き込まれるのでしょうか?
それとも、既存のDBやテーブルを残して、新しいものだけ追記されるのでしょうか?
それとも、既存のDBに「foo」、「bar」があり、dumpファイルには「foo」だけ
があった場合、リストアすると、「foo」だけになるのでしょうか? <>
NAME IS NULL<>sage<>2012/08/06(月) 23:38:11.28 ID:???<> 自分で実際にdumpとってエディタで見てみたらよろしいやん
DROP TABLE IF EXISTS `xxxx`;
CREATE TABLE `xxxxi` ( 〜 ) 〜
となってるから <>
NAME IS NULL<>sage<>2012/08/07(火) 11:02:08.57 ID:???<> >>772
INSERT文でカラム指定してる?
あと電話番号を数値は無理が無い?
0で始まるときは桁数で判断して埋めてるの? <>
NAME IS NULL<>sage<>2012/08/07(火) 11:14:01.06 ID:???<> >>772
・空欄でinsertすると0が入る
テキストボックスが空欄の場合、0をセットするようにコーディングしているからでは。
・空欄でupdateしようとすると
エラーが出ていないのであれば、抽出しているレコードが、更新したいレコードと違う。
別のレコードを更新しているからでは。 <>
NAME IS NULL<>sage<>2012/08/07(火) 14:46:52.86 ID:???<> >>758
ごめん、やっとやってみたけど、俺のところでは再現しなかった。
IISから/batから同じphpスクリプト(SELECT * FROM t1だけ)を呼ぶと、
どっちの場合もちゃんとキャッシュに載る。
キャッシュ周りのヒット率とか見ながらやっても、ちゃんとヒットしてるっぽい。
役立たずでごめん(´・ω・`) <>
NAME IS NULL<>sage<>2012/08/07(火) 15:13:20.05 ID:???<> >>771
フォーム空っぽの時のINSERTで、fax1 = ''ってしてるんじゃない?
整数型に空白文字列を突っ込もうとすると、NULLじゃなくて0になるよ。
UPDATEはぱっと思い付かない。。 <>
NAME IS NULL<>sage<>2012/08/07(火) 20:47:00.09 ID:???<> >>772
perl なら undef を $fax に入れればよいかと。 <>
NAME IS NULL<>sage<>2012/08/07(火) 23:25:46.46 ID:???<> >>765
型を決める優先順位としては、
精度(許容誤差)→有効桁→容量の
ほうがいいんでは?
絶対精度が必要なら、選択肢は
ひとつしかないんだから。
<>
NAME IS NULL<>sage<>2012/08/07(火) 23:30:23.61 ID:???<> >>771
そのINSERTとUPDATEは、同じ接続?
別の接続で、それぞれのSQL_MODEが
異なってたりはしない?
<>
NAME IS NULL<><>2012/08/07(火) 23:51:44.88 ID:24CtAp1+<> レプリケーションについて質問です。
参照系の負荷が増えてきた場合、スレーブを増やして負荷分散していくと思いますが
どういう情報を見て「そろそろ増やすか」という判断をするのでしょう。
これが閾値に達したとか具体的な判断材料がありましたら、教えていただけないでしょうか?
<>
NAME IS NULL<>sage<>2012/08/08(水) 13:11:22.72 ID:???<> >>780
仰る通り。
誤差が許容できてかつ容量も気にしないんだったらDECIMALを推奨したくて、
あんな変な0)になった。。 <>
NAME IS NULL<><>2012/08/08(水) 13:14:17.93 ID:h4MbiXpm<> >>782
iowaitが頻繁になったら <>
NAME IS NULL<><>2012/08/08(水) 15:36:14.33 ID:sIm+wbEE<> DATETIMEの値からの現在までの経過秒数はどのようにすれば出せるのでしょうか。 <>
NAME IS NULL<>sage<>2012/08/08(水) 16:05:48.91 ID:???<> UNIX_TIMESTAMP で秒数だして引き算するとか <>
785<><>2012/08/08(水) 16:25:14.22 ID:sIm+wbEE<> ありがとうございます <>
749<><>2012/08/08(水) 20:58:51.97 ID:Apjd5TM1<> >>777
お助けいただきありがとうございます。
通常select文発行するだけで、メモリにキャッシュされるということがわかっただけで
十分切り分けが行えると思います。
まだ原因はわかっておらず、待機時間を設定して回避してますが、
メモリの動作とにらめっこしながら確認していきたいと思います。
<>
748<><>2012/08/10(金) 10:30:49.14 ID:pvTRtdDK<> >>751
いけました、ありがとうございます
もういっこ教えてください
id , reg_gmt , res_gmt , title と言うカラムがあります。
res_gmtに格納された数値が10以上のもののみで、reg_gmtで昇順ソートしたものを取得するにはどのようにしたら良いですか? <>
NAME IS NULL<>sage<>2012/08/10(金) 11:13:08.40 ID:???<> where res_gmt >= 10
order by reg_gmt; <>
NAME IS NULL<>sage<>2012/08/10(金) 11:36:58.28 ID:???<> こりゃひどいw
教科書超初級レベルそのまんま、かつどっちも同じとも言える問題をまた丸投げか。
>>748 の時点なら、これまで全くSQLに縁が無かった人が事情でどうしても
即席に何とかしなきゃいけない事情でもあったか? と思えなくもないが、
>>789 からすると、この十日ほどの間自分じゃ何も学んでないってことだな。 <>
NAME IS NULL<>sage<>2012/08/10(金) 11:48:54.20 ID:???<> スレの趣旨としてあってるのに文句言うほうがスレチ。 <>
NAME IS NULL<><>2012/08/10(金) 12:01:01.14 ID:pvTRtdDK<> >>790
完璧でした、ありがとうございます <>
790<>sage<>2012/08/10(金) 20:03:12.89 ID:???<> 完璧と言われても嬉しくないw
何か引っ掛けがあって間違いでもあったかと思ってたけど w
>>792
MySQLの質問じゃなくてSQL質疑応答スレの方だろ、これ <>
NAME IS NULL<>sage<>2012/08/10(金) 23:13:47.16 ID:???<> そっちでもヌルーされるレベルじゃね <>
NAME IS NULL<><>2012/08/12(日) 14:10:19.57 ID:dvN7Vk7t<> simplepieでrssを読み込みデータベースに書き込んでいるのですが質問したいです。
テーブル1にはrss収集する対象のサイトの情報を、
テーブル2にはパースしたrssの情報を書き込んでいて、
テーブル1のカラムはサイトid、サイトタイトル、サイトアドレス、rssのアドレス
テーブル2のカラムは記事id、記事タイトル、記事アドレス、記事の日時
です。
現状ではsimplepieでテーブル1のrssアドレスを読み込み、
各記事の情報をテーブル2にinsertしてるのですが
この時にテーブル1のサイトidもテーブル2に挿入したいのですが
どのようにすればいいでしょうか。
simplepie使ってるかたいらっしゃれば教えてください。 <>
NAME IS NULL<>sage<>2012/08/13(月) 21:12:23.15 ID:???<> >>796
どのようにって、当然にテーブル2は、
・サイトID(テーブル1の)
・記事ID
・記事URL
・etc
になるんじゃないの?
そうしなければどのサイトの記事なのかわからないでしょう。
いちいち、記事URLを解析して、サイトURLと照合してなんてやらない限り。
それよりはサイトIDカラムを設けるのが、テーブル1とのリレーションの点からも
素直だと思うが。 <>
NAME IS NULL<><>2012/08/13(月) 21:48:07.57 ID:hCv+mjeX<> 酔っ払った勢いで聞かせてください。
InnoDBで作ったDBを別のサーバーに移すのって、mysqldumpした
データを食わせるしか方法ないんですか?
MyISAMだとディレクトリまるごとコピって適当にあれこれすればなんとか
なったのに、InnoDBのデータ移転は時間かかって発狂しそうです。
なんか早く移す鳳凰ないっすかね? <>
NAME IS NULL<>sage<>2012/08/13(月) 21:57:41.67 ID:???<> サービス停めて、myqlのデータディレクトリごと(ibdataとか全部)コピーすればいけるんじゃね?
俺はmsqldumpをそのままパイプでつないでリストアしている <>
796<><>2012/08/13(月) 23:37:14.09 ID:pOLbPoto<> >>797
おっしゃる通りで、テーブル2には一応サイトidカラムは設けています。
が、テーブル2に挿入時にテーブル1のサイトidをどうやって取得するかが思いつきませんでした。
悩んだ末結局1記事ごとにfeed配信元サイトurlを取得して、テーブル1からサイトidを
whereでurl照合してselectして挿入することにしました。これで問題ないんでしょうか? <>
NAME IS NULL<>sage<>2012/08/14(火) 01:24:02.46 ID:???<> >>800
いや、あのさ、
>現状ではsimplepieでテーブル1のrssアドレスを読み込み、
この時点でサイトIDも得られるやん。
テーブル1からRSSのURL読み込むときに、ついでにサイトIDも得ておいたら済むっしょ。
それをホスト言語(この場合はPHPやわね)の側で覚えておいたら、
テーブル2に書き込むときは、覚えておいたそれを書くだけやと思うんやわ。 <>
NAME IS NULL<>sage<>2012/08/14(火) 01:50:07.05 ID:???<> 具体的にどう記述すればサイトID得られるのかわからないんじゃないかな>>800の人は <>
NAME IS NULL<>sage<>2012/08/14(火) 08:56:07.54 ID:???<> なんか、一応IDは付けたけどキーが何か理解してないって感じだな。 <>
NAME IS NULL<><>2012/08/14(火) 20:52:36.63 ID:esze3jrn<> 数MBの画像を投稿してもらうのに、保存先をMySQLのBLOBデータにしようかと思っているのですが、
素のファイルを公開フォルダに置くのに比べると、入出力の処理はどのくらい重くなりますか?
不向きでしょうか? <>
NAME IS NULL<>sage<>2012/08/15(水) 11:18:04.36 ID:???<> オープンソースのECシステムをいじってたら、
テーブルのID値をauto incrementせずに、わざわざ1行・1カラムの別のテーブルに持ってて
そこから値を取り出してinsertして1加算していたんだけど、
これはなんでこういう実装になっているのでしょうか? <>
NAME IS NULL<><>2012/08/15(水) 12:45:14.02 ID:ve1P3DnP<> >>805
自分で番号を管理したいから <>
NAME IS NULL<>sage<>2012/08/15(水) 12:56:36.07 ID:???<> >>806
だからそれはなんで? <>
NAME IS NULL<>sage<>2012/08/15(水) 13:36:13.21 ID:???<> 作者に聞けよ。
つか、普通に考えたら移植性のためだろ。 <>
NAME IS NULL<>sage<>2012/08/15(水) 13:37:58.74 ID:???<> 質問を変えます。別テーブルで管理することによって、何のメリットがあるのでしょうか。
ちなみにID番号を引っ張り出すテーブルでは、auto incrementが使われていて、1ずつ増えます。
そのシステムのスレで聞いてもわからなかったので、一般的な回答があればお聞きしたいです。 <>
NAME IS NULL<><>2012/08/15(水) 13:52:53.93 ID:ve1P3DnP<> トランザクションテーブルにTRUNCATEやALTER TABLEは発行したくない
速度的な問題も
http://kur.jp/2009/12/27/mysql-auto-increment/
まあ、負荷の少ないアップデート1回で
次の番号コントロールするための場合が多いかな
重複エラーやロールバックや再起動でずれることもあるし <>
NAME IS NULL<>sage<>2012/08/15(水) 20:31:05.25 ID:???<> >>804
ファイルのほうがいいって教えてgooにかいてあったよ <>
NAME IS NULL<>sage<>2012/08/15(水) 21:54:03.80 ID:???<> >809
オートナンバーはレコードが保存されるまで発番されない
よって、
1.ユーザーがアプリの新規登録ボタンを押し、入力画面を開く
2.ユーザーが色々情報を入力する
3.ユーザーが保存ボタンを押す
4.新規にレコードが作成され、番号が発行される
という流れになる。
別テーブルで管理をすれば、
1.ユーザーがアプリの新規登録ボタンを押す
2.番号管理テーブルから発番し、入力画面を開く
3.ユーザーが色々情報を入力する(この時点で番号は分かっている)
4.ユーザーが保存ボタンを押す
となる。
ECシステムだと店舗と顧客の関係だろうから、顧客からの問い合わせを受けている時点で
案件を示す番号がわかっているには重要。
※「次回問い合わせる際はこの番号をお伝えください」と顧客に伝えるため
そのため後者のような仕組みをとることはある。
…が、単なる連番なら詐称が簡単に出来るので、連番にはせずチェックディジットを含めた番号にすると思う。 <>
NAME IS NULL<>sage<>2012/08/15(水) 22:52:56.13 ID:???<> どもです。
>>808
移植性というとMySQL以外のDB、auto incrementがないDBを考慮してるんですかね。
でもid取得用テーブルの方でauto increment使ってるのでそれは違うか…。
>>810
運用中にTRUNCATEやALTER TABLEが発行されることはないはずです。
レコード追加の頻度などからも、速度のためというわけではない感じがします。
>>812
ユーザーアクションで追加されるもの以外に、管理者が商品やカスタムページを追加する用のテーブルなど
全部がそうなっているので、ユーザー向けの理由ではなさそうです。
やっぱり作者(企業)に直接聞かないと意図不明すね。聞いたら教えてくれるのかな…。 <>
804<>sage<>2012/08/16(木) 14:21:04.67 ID:???<> >>811
自分でも調べてみました。DBにはバイナリの代わりにパスを保存するほうが無難なようですね。
ありがとうございました。
<>
NAME IS NULL<>sage<>2012/08/16(木) 14:26:23.30 ID:???<> >>813
insertしたレコードのIDを取得する方法を 作者が分からなかったのでそういう実装にした みたいな
後ろ向きな理由の気がします。 <>
NAME IS NULL<>sage<>2012/08/16(木) 23:15:09.58 ID:???<> >>813
それ、本体のテーブルがInnoDBで番号用のテーブルがMyISAMだったりする? <>
NAME IS NULL<>sage<>2012/08/17(金) 01:13:07.71 ID:???<> >>816
いえ、全部InnoDBです。
>>815
なるほど… <>
NAME IS NULL<><>2012/08/17(金) 14:47:50.86 ID:1eWs/aiB<> 1分刻みの為替のデータをDBで管理しています。
ここから例えば5分おきのデータを一発で取得できるクエリーを書くことは可能でしょうか。 <>
NAME IS NULL<>sage<>2012/08/18(土) 16:55:17.15 ID:???<> >>794
>完璧と言われても嬉しくないw
>何か引っ掛けがあって間違いでもあったかと思ってたけど w
<>
NAME IS NULL<>sage<>2012/08/19(日) 10:34:31.48 ID:???<> >>818
時刻を秒の部分落として秒か分になおして
5分で割り切れるやつを取りだすとかでいいんじゃないかな。 <>
NAME IS NULL<><>2012/08/19(日) 17:36:27.61 ID:xwtWSsyk<> urlというカラムがあったとして
レコードhttp://hoge.aiueo.jpを探す場合select * from hoge where url like "http://hoge%"で抽出できるのはわかるのですが
レコードhttp://hogeというのがあったとしてレコードに"http://hoge.aiueo"と部分一致するものを抽出するにはどうすればいいですか?
最初の例の逆?という意味です。 <>
NAME IS NULL<>sage<>2012/08/19(日) 22:22:48.32 ID:???<> 二行目が何を言ってるのか自体解らんでワロタ <>
NAME IS NULL<>sage<>2012/08/19(日) 23:04:48.72 ID:???<> >>821
SELECT * FROM hoge WHERE LOCATE( url, 'http://hoge.aiueo' )=1
でどうでしょう? <>
NAME IS NULL<>sage<>2012/08/19(日) 23:46:58.58 ID:???<> >>822
すいませんもっと整理してわかりやすくいうべきでした
>>823
それでできました!助かりましたありがとう <>
NAME IS NULL<>sage<>2012/08/21(火) 20:46:59.02 ID:???<> 5.6っていつGAになるの? <>
NAME IS NULL<>sage<>2012/08/21(火) 21:29:04.86 ID:???<> ギャラクシー・エンジェル? <>
NAME IS NULL<>sage<>2012/08/22(水) 00:41:51.54 ID:???<>
二行目が何を言ってるのか自体解らんで <>
NAME IS NULL<>sage<>2012/08/22(水) 11:48:32.54 ID:???<> >>817
それ、メインのデータテーブルのIDは全て数字でしたかの?
だったら、データテーブルのIDをauto_incrementにしたいんだけど
プリフィックスとしてアルファベットつけたかったとか。
もしくはkeyの構造のためとかそっちの可能性はないかな。
結構、後ろ向きな理由のほうが臭いけど。 <>
NAME IS NULL<><>2012/08/22(水) 20:05:59.62 ID:cD/ZrOuD<> 2ちゃんねるはInnoDBなん? MyISAMなん? どちらでもないなん? <>
NAME IS NULL<>sage<>2012/08/22(水) 22:09:09.82 ID:???<> 単なるテキストファイルじゃなかったかな。 <>
NAME IS NULL<>sage<>2012/08/23(木) 15:43:12.19 ID:???<> 以前mysqlをかじって、最近また勉強しようと思ってるんですが、
当時買った入門書やリファレンスが4基準です。今は5ですよね。
4と5ってどれくらい違うのでしょうか?
4の時の本は役に立ちませんか? <>
829<>sage<>2012/08/23(木) 20:20:01.30 ID:???<> >>830
ありがぽん <>
NAME IS NULL<>sage<>2012/08/23(木) 21:16:48.13 ID:???<> >>831
4勉強して差分を後でウェブで調べたほうがらく
しばらく使わない → 新しい本をかじる
のループはものすごい無駄。 <>
NAME IS NULL<>sage<>2012/08/24(金) 09:23:17.34 ID:???<> 単なるテキストファイルじゃなかったか
<>
NAME IS NULL<>sage<>2012/08/24(金) 11:11:32.31 ID:???<> バックエンド変更したって話も聞かないしね。 <>
1/2<><>2012/08/24(金) 23:47:58.90 ID:8YwZVdoT<> mysql 5.5.19
master_tbl マスター
scode ←商品コード
sname
last_insertDate
〜
data_tbl データテーブル
scode ←商品コード
inputdate
value1
〜
(http://uni.2ch.net/test/read.cgi/operatex/1345250215/43代行) <>
2/2<><>2012/08/24(金) 23:49:15.89 ID:8YwZVdoT<> 1日1回データをdata_tblに追加します。んで各scode毎に最新追加日付を
master_tblのlast_insertDateにセットしているんですが(アプリで)、これ
トリガーで出来ますか?出来たら、教えて欲しいんですがm(__)m
最新日付は作業日の日付とは限らず入力時の最新日付です
例えば 2012/08/24に入れるけどscode XXXのデータのinputdateの最新日付は
2012/08/20で、セットするのはその2012/08/20を入れると言うことです
(http://uni.2ch.net/test/read.cgi/operatex/1345250215/44代行) <>
NAME IS NULL<>sage<>2012/08/25(土) 00:17:08.84 ID:???<> >>837
アプリ側でやったほうがいいんではないでしょうか <>
2/2 <>sage<>2012/08/25(土) 08:48:05.96 ID:???<> >>838
ありがとう。やっぱりアプリ側でになりますかね
(http://uni.2ch.net/test/read.cgi/operatex/1345250215/60代行) <>
NAME IS NULL<><>2012/08/27(月) 01:39:20.21 ID:SNjxWl2b<> ユーザーIDといえば採番ですが、パラメータにユーザーIDをくっつけると
いるのか、いないのかすぐバレるので文字列にしてみたのですが、
やっぱり何十万件とかたまってくると遅くなるから連番にしたほうがいいのでしょうか。 <>
NAME IS NULL<>sage<>2012/08/27(月) 10:42:03.95 ID:???<> 気にしないでよし
どうしても気になるならidと文字列の対応表も作っておけばいい <>
NAME IS NULL<>sage<>2012/08/27(月) 16:55:26.11 ID:???<> >>841
やっぱりそうっすよね。
ありがとん。 <>
NAME IS NULL<>sage<>2012/08/29(水) 22:40:01.27 ID:???<> なんや、なんや( ´Д`)y━・~~
こっちはえろー盛り上がってますやん(爆笑)
最近三ヶ月のレスの消費率グンと上がってるのはなんでなん?( ´Д`)y━・~~ <>
NAME IS NULL<><>2012/09/04(火) 07:18:47.24 ID:Fu96Qm7I<> 1分刻みの為替データから10分毎の最大最小値を求めるSQLを書いています。
これを期間指定して(例えば、今年の頭から8ヶ月分の10分毎のデータを)一発のSQLで取得したいのですが可能でしょうか。
参考までに一回分の最大最小取得のSQLを書いておきます。
select max( high_price ) max_price, min( low_price ) min_price from currency_exchange_table
where currency_pair = 'USD/JPY' and
exchange_date between '2012-7-2 12:00:00 +0900' and '2012-7-2 12:09:00 +0900'; <>
NAME IS NULL<>sage<>2012/09/04(火) 10:05:32.70 ID:???<> 10分ごとを同じ数字になるように、例えば時刻データを秒になおして100で割れば
100秒ごとの数値が同じになる。
それをGROUP BY して集計関数で出せばいい。 <>
NAME IS NULL<>845<>2012/09/04(火) 19:06:48.85 ID:???<> さんくす。 <>
NAME IS NULL<>sage<>2012/09/05(水) 08:32:23.86 ID:???<> PHPからデータベースを操作しています
0.CREATE文でテーブルを作成
1.INSERT文でレコードを挿入
これらをmysqli_multi_queryで1度に実行しました
さらに、
2.INSERT文でレコードを挿入する
3.INSERT文でレコードを挿入する
4.INSERT文でレコードを挿入する...
というような感じで続いて行きます
さてテーブルを確認すると、
挿入されたレコードの順番(AUTO_INCREMENT設定したIDの順番)が、
2→1→3→4...
となっていました
はじめにCREATE文だけを行い、実行後にmysqli_closeしてから同様の作業を続けた場合には、
1→2→3→4...という並びになりました
なぜだい?
MySQL v5.5.20
PHP v5.3.10 <>
847<><>2012/09/05(水) 08:33:05.74 ID:j3gp/4Dx<> 失礼 <>
NAME IS NULL<>sage<>2012/09/05(水) 09:16:55.73 ID:???<> 並び順は保証されないんじゃなかったか?
order byで指定しろよ <>
忍法帖【Lv=40,xxxPT】(-1+0:8) <>sage<>2012/09/05(水) 09:40:25.66 ID:???<> IDの順番をコントロールしたいなら、insert時にSQL文で番号指定すればいいよ <>
NAME IS NULL<>sage<>2012/09/05(水) 10:17:08.05 ID:???<> 単にユニークなのを保証するだけだし
順番が必要なら別に項目作った方が・・・
Closeじゃなくてトランザクションで挟んでもよさそう。 <>
847<><>2012/09/05(水) 10:51:22.00 ID:XUXixlkH<> レスありがとうございます
実際上はorder byで指定して使っているので動作に問題はないのですが、
前掲の例の 2→1→3→4... の順に必ず並ぶため、
何かそうなるような仕様・法則があるのかと思い質問しました <>
NAME IS NULL<><>2012/09/06(木) 04:58:02.61 ID:rA2q8u++<> 現在は数千くらいのデータ量なんですが この先、数万→数十万は行きそうなので
ちゃんとインデックスを作っておこうと思いました。
DBにあんま詳しくないもんでよく分からないんですが
例えば特定のフィールドでLIKEで部分一致させるような場合
インデックスの種類はどのようなものが良いんでしょうか?
例えば、対象フィールドに PRIMARY として作っておくだけでも全然効果あるんでしょうか?
初歩的な質問ですみません。 <>
853<>sage<>2012/09/06(木) 06:05:50.08 ID:???<> あぁ…部分一致だとFULLTEXTになるんですか…
しかも色々と面倒そうですね…
やっぱあらかじめ自分で検索用単語データを別途作っておいた方が良いのかなぁ。 <>
853<>sage<>2012/09/06(木) 06:18:30.89 ID:???<> う〜ん。よくわかんないけど…
何か検索された場合
単語とヒットしたデータの位置を格納したテーブルをまず検索する
そこでヒットしなければ改めて大元のデータ全部を検索する
ヒットしたら前述の単語とヒットしたデータの位置を格納するテーブルに
その情報を追加して行く…
みたいなのが一番効率と労力の軽減のバランスが良い気がするんですが。
FULLTEXTのインデックス化ってどんくらい使えるものなんでしょうか? <>
853<>sage<>2012/09/06(木) 07:45:15.16 ID:???<> いやいやダメだ汗
ヒット数が多すぎるとデータ書き込みのコストがバカにならない…
検索する機会が少ないと問題ない気がするけど
一分に一回とかされたらもうダメ… <>
NAME IS NULL<>sage<>2012/09/06(木) 10:43:53.48 ID:???<> どこの図書館のシステム作ってるんだよw <>
NAME IS NULL<>sage<>2012/09/06(木) 14:11:08.92 ID:???<> >>853
今のところ、MySQLでは部分検索は前方一致しかINDEXが使えないので注意。
LIKE 'hoge%'の形ね。
LIKE '%hoge'やLIKE '%hoge%'だとINDEXはあっても使えない。
あと、FULLTEXT INDEXは今のところ日本語の検索には向かない。
あれは格納されているデータが半角スペースで単語に区切られている(=英文)と想定して
部分一致検索にINDEXを使える、というもの。
日本語でFULLTEXT INDEXを使える様にするにはmroongaとかがあるよ。
>>855で言っているやり方は転置インデックスと呼ばれるやり方で、
"MySQL 転置インデックス フルテキストインデックス"とかでググるとちらほら情報が出てくる。
がんばって。 <>
853<>sage<>2012/09/06(木) 15:06:21.07 ID:???<> >>858
うー なかなか部分一致を効率よくするには大変そうですね…
とりあえず言われた通り色々ググってがんがってみます。 <>
NAME IS NULL<>sage<>2012/09/06(木) 22:42:49.23 ID:???<> 基本的な話しで恐縮ですが
テーブルの件数が多くなってパフォーマンスが落ちた場合
エンジンがInnodbなら、InnodbBufferPoolをでっかくすると思うんだけど
エンジンがMyisamの場合、どこをいじればいいの? <>
NAME IS NULL<><>2012/09/06(木) 22:43:20.27 ID:kD3/4Jx+<> mysql のチューニングの話しなんだけど
テーブルの件数が多くなってパフォーマンスが落ちた場合
エンジンがInnodbなら、InnodbBufferPoolをでっかくすると思うんだけど
エンジンがMyisamの場合、どこをいじればいいの? <>
NAME IS NULL<><>2012/09/06(木) 22:54:19.34 ID:2PuTMH3G<> postgres で
select birth_day + interval ’10 seconds';
を応用して
select birth_day + interval cast( a.n text ) || ' seconds' from ( select 10 as n ) as a;
に類することをしたいのだけど、シンタックスエラーになってしまいます。
不可能なんでしょうか <>
NAME IS NULL<>sage<>2012/09/06(木) 22:58:59.00 ID:???<> cast( a.n text ) は cast( a.n as text ) のタイポっす。
失礼。 <>
NAME IS NULL<><>2012/09/07(金) 00:55:49.17 ID:8LvMxkPp<> uga- <>
NAME IS NULL<>sage<>2012/09/07(金) 00:59:50.81 ID:???<> to_timestamp
で自己解決しました。 <>
NAME IS NULL<>sage<>2012/09/07(金) 09:51:06.43 ID:???<> >>861
INDEX部分のキャッシュはkey_buffer_size、
データ部分のキャッシュはOS任せだから、
INDEXサイズと相談してkey_buffer_sizeを増やして、
それ以外は逆になるべくfreeにしてやるとOSのキャッシュが動きやすくなる。
レコードサイズが膨大になってるって話なら、パーティショニング。 <>
NAME IS NULL<>sage<>2012/09/07(金) 15:32:24.31 ID:???<> >>866
ありがとう!
参考にしてやってみます! <>
NAME IS NULL<><>2012/09/07(金) 23:44:39.10 ID:Bf7kLZHy<> 最近MySQLに触り始めて、Statusをずっと見ているのですが
+------------------------+---------+
| Variable_name | Value |
+------------------------+---------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 3823 |
| Key_blocks_used | 39552 |
| Key_read_requests | 5222058 |
| Key_reads | 48824 |
| Key_write_requests | 594596 |
| Key_writes | 47872 |
+------------------------+---------+
こんな感じで、Key_blocks_usedの値がいつまで経っても増え続けます。
key_buffer_sizeを増やしていけば、いつかこの数字が動かなくなる時が来るのでしょうか?
Key_blocks_unusedが0になると重さ的にまずくなりますか? 512MBしかメモリを積んでいないPCなので、あまりkey_buffer_sizeを増やしたくはないのですが・・・
あとKey_writesの値が大きいのが気になります。これはどういうチューニングで数値を抑えられるのでしょうか。 <>
NAME IS NULL<><>2012/09/08(土) 13:30:42.68 ID:4J27k5Sp<> mysqlの REPLACE文 を使って
カラム1とカラム2だけを更新しようとしました。
更新前 → 更新する値 → 更新後
カラム1 A → B → B
カラム2 A → C → C
カラム3 C → 未 → C
理想としてはこんな感じです。
ところが REPLACE文とは、一旦対象のレコードをデリートしてから
書き込むそうで
カラム1 A → del → B → B
カラム2 A → del → C → C
カラム3 C → del → 未 → NULL
になってしまいました。
このデリートのロジックなくす方法はないですか?
素直にUPDATEでやれって感じですか?
<>
NAME IS NULL<><>2012/09/08(土) 14:09:35.71 ID:4J27k5Sp<> 解決しました
DUPLICATE KEY UPDATE <>
NAME IS NULL<>sage<>2012/09/10(月) 09:15:02.86 ID:???<> genre_tbl
genre_id nt(5) PK
genre_kind varchar(30)
genre_idの99990,99999は特別な項目として予約
genre_idの99990,99999以外で使用している最大値を返す関数を作ろうとしています
select max(genre_id) from genre_tbl where genre_id not in (99990,99999);
で127が返ってきてるんで、これを
delimiter //
create function
sf_return_max_genre_id()
returns int
begin
return (select max(genre_id) from genre_tbl where genre_id not in (99990,99999) );
end //
delimiter ;
としたんですが、
+--------------------------+
| sf_return_max_genre_id() |
+--------------------------+
| 127 |
| 127 |
〜と複数の行が返ってきてます。ストアドファンクションって戻り値は一つだけではないんですか?
<>
NAME IS NULL<>sage<>2012/09/10(月) 09:52:58.78 ID:???<> >>868
Key_blocks_usedはMyISAMのインデックスがメモリに載ると増える。
上限は当然Key_buffer_sizeで、
Key_buffer_sizeがインデックスサイズの合計より十分大きければそこで止まる。
Key_blocks_unusedが0になっても、
よく使うインデックスがメモリに載ってればそこまで壊滅的なことにはならない。
頻繁にインデックスアクセスするテーブルのMYIファイルの大きさと比べて、
少なくともその分はkey_buffer_sizeを確保した方が良いかと思う。
(Key_blocks_*の単位はブロック(デフォルト1024byteだったかな?)なのでよしなに変換)
あと、Key_writesを減らすんだったらインデックスの数を減らすとかする。
でも、ちゃんと必要なインデックスで、更新もかかってるんだったら、
Key_writesが増えるのは当たり前なのでそんなに気にするところないと思う。 <>
NAME IS NULL<>sage<>2012/09/10(月) 09:55:06.21 ID:???<> >>871
それ、SELECT sf_return_max_genre_id() FROM genre_tblってやってない?
FROM指定すると、genre_tblの件数と同じだけ結果が返ってくるよ。
SELECT '0'だと1行だけ返ってくるけど、SELECT '0' FROM ..ってやると
テーブルの行数だけ返ってくるのと一緒。 <>
NAME IS NULL<>sage<>2012/09/10(月) 09:59:37.13 ID:???<> >>873
あぁっやってましたorz
そうだったんだ。ありがとうございます!
<>
NAME IS NULL<>sage<>2012/09/10(月) 10:51:44.63 ID:???<> >>872
なるほど、ちょっと確認してみます
ありがとうございました <>
NAME IS NULL<><>2012/09/10(月) 18:55:30.39 ID:77QNIoWN<> MySQLのステータス、Key_blocksとかConnectionsとかを見てると
一日一回くらいの割合で、数値がリセットされているのですが
これは正常な動作なのでしょうか、それとも知らない間に落ちてたりして勝手に再起動してたりするのでしょうか? <>
NAME IS NULL<>sage<>2012/09/11(火) 09:50:07.29 ID:???<> >>876
Uptimeも巻き戻ってる?
Uptimeはmysqldが起動してからの秒数だから、
これも巻き戻ってるなら再起動してると思うけど。
Key_blocks_*は何もしなくてもキーキャッシュの破棄とかで減ったりすることもあるから
何とも言えないけど。 <>
NAME IS NULL<><>2012/09/11(火) 13:20:29.74 ID:uyhjbDfL<> >>876
今確認すると、確かに起動時間が自分の認識よりずっと少ないです
落ちても勝手に再起動してくれるようになっているのでしょうか?
その前に落ちている原因を探る方が先ですが・・・ <>
NAME IS NULL<><>2012/09/11(火) 13:29:56.34 ID:uyhjbDfL<> ログを見ると、restartがかかっているところで
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help diagnose
the problem, but since we have already crashed, something is definitely wrong
and this may fail.
と書いてありました。ライブラリの破損がどうとか書いてありますが
具体的にどれを指しているのかが分からないとなんとも・・・ <>
NAME IS NULL<><>2012/09/11(火) 13:31:22.02 ID:uyhjbDfL<> 連投すみません、
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = 321135 K
bytes of memory
Hope that's ok; if not, decrease some variables in the equation.
つまりこれはメモリが足りないから落ちてるという事でしょうか <>
NAME IS NULL<>sage<>2012/09/11(火) 13:47:09.02 ID:???<> >>880
This could be because you hit a bug..と
It is possible that mysqld could use up to..はmysqldがクラッシュした時の常套句。
本当にバグでもバグじゃなくても、メモリに問題があってもなくても出る。
大事なのは一番先頭とバックトレース。
先頭に近い方に、"mysqld got signal xx"って書いてない?
「それより更に手前の、タイムスタンプがついてなかったりするところ」と、
/usr/sbin/mysqld(handle_segfault..)とか書いてある辺りを見て、
その周りのメッセージで検索してみて。
あと、mysqld_safeを使ってる環境であれば、
mysqldがいなくなるとmysqld_safeが勝手に再起動してくれる。
がんがれ。 <>
NAME IS NULL<><>2012/09/11(火) 14:29:31.30 ID:uyhjbDfL<> >>881
レスありがとうございます。ログを見ると、「mysqld restarted」から始まって
「InnoDB: Starting crash recovery.」・・・でリカバリが走って、その後
mysqld: Table 'general_log' is marked as crashed and should be repaired
mysqld: Table 'slow_log' is marked as crashed and should be repaired
となっていました。この二つのTableをチェックすると、確かに「error」とか「Table 'general.log' doesn't exist」とか出ていて
テーブルの修復も実行はされるものの何も変化が無いのですが、終了と起動は何事も無く行えます。
そしてその後、
SCHEDULER: Suspending operations
mysqld got signal 11;
>>880
>>879
となっていました。エラーで勝手に落ちる事もそうですが、それより寧ろTableが修復出来ない事と
errorになっていても普通に動いてる事の方が気になってしまいます。 <>
NAME IS NULL<><>2012/09/11(火) 14:47:00.64 ID:kpt7HVTE<> すみません、ID変わりました
二つのTableはPhpMyAdminから操作すると何かおかしかったんですが、コンソールからやるとエラーが出なくなりました。
あとは「mysqld got signal 11;」のあとすぐに「This could be because you hit a bug〜」で
その後メモリが何とかと出てくるので、やはりメモリが原因でしょうか <>
NAME IS NULL<>sage<>2012/09/11(火) 14:51:59.88 ID:???<> >>882
んー。
バックトレースの先頭に出てる関数の名前を適度にトリムして検索すると
バグなら見付かるかも知れない。
たとえば_Z26mysql_execute_commandP1THD+0x37b8
⇒mysql_execute_command、で検索。
壊れてるテーブルがgeneral_logとslow_logの2つだけなら動作には問題ないから普通に上がって動く。
ただし、ジェネラルログとスロウログは少なくともテーブルには吐けてない。
/var/lib/mysql/mysql/general_log.*とかslow_log.*は無事?
dでもなく大きくなったりしてない?
(それぞれ3つずつあるのが正しい状態)
あと、mysqlデータベースのgeneral_logとかDROP TABLEした?
それか、5.1未満(5.0, 4.1, 4.0, ..)から5.1以降にアップデートする時に
まるまるデータベースディレクトリコピーしてきたとか。 <>
NAME IS NULL<>sage<>2012/09/11(火) 14:55:50.28 ID:???<> >>883
あ、行き違った。
signal 11は確かにSIGSEGVだけど、
This could be because you hit a bug..と
It is possible that mysqld could use up to..は何が原因でもほぼ出るから
あんまり参考にはならないけれど。
メモリ関連で言うと、32bit Linuxで2GBの壁超えてたりとかする? <>
NAME IS NULL<><>2012/09/11(火) 15:32:27.66 ID:kpt7HVTE<> >>885
FreeBSDでメモリは512MBです
色々あるMySQLの使用メモリの計算式で計算してみても、現在の設定だと
300MBとか430MBとか必要になるので、これが一番怪しいかなと <>
NAME IS NULL<>sage<>2012/09/11(火) 15:45:24.91 ID:???<> >>886
そうかー。。
ちなみに、俺の手元の環境は2GB Memory CentOS 6.2だけど、
VIRTに5GB/RSS 1.7Gくらい食わせても落ちたことはないなぁ。
(当然そこまでやるとswapはひどいけど)
役に立てなくてごめんー。 <>
NAME IS NULL<><>2012/09/11(火) 15:52:18.70 ID:kpt7HVTE<> ありがとうございました
メモリの設定を見直して様子を見てみます <>
NAME IS NULL<><>2012/09/11(火) 21:00:43.24 ID:1DTwZYME<> 5.5.11ではよくあるバグらしいよ。
うちもSIGSEGV食らって困りまくって、結局バージョン上げた。普通に治った。 <>
NAME IS NULL<><>2012/09/12(水) 08:17:03.96 ID:uxFpUlnF<> 適切なインデックスが設定されてるとして
億レベルのレコードがあるテーブルを
複数のテーブルに分ける(例えば1千万レコードずつ)のって検索速度的に意味ある? <>
NAME IS NULL<>sage<>2012/09/12(水) 10:46:52.69 ID:???<> >>890
あるよ。
パーティショニングの方が良いと思うけど。 <>
NAME IS NULL<><>2012/09/12(水) 21:04:21.11 ID:yH/B7Dad<> サーバー山ほど用意して、Spiderでパーティショニングですよ! <>
NAME IS NULL<>sage<>2012/09/12(水) 21:19:58.85 ID:???<> >>891
横からで申し訳ないが、どのへんに効果があるのだろうか?
テーブルロックの影響範囲?(でも、ロックしたい時困りそう)
index 肥大化軽減?
ログテーブルなどは過去のデータを消しやすいように日付での
レンジパーティショニングしてるどそれ以外に
どういうメリットがあるか知りたいです。 <>
NAME IS NULL<>sage<>2012/09/12(水) 22:55:31.63 ID:???<> 上で早さだと言ってるじゃないかw <>
NAME IS NULL<>sage<>2012/09/13(木) 03:06:42.03 ID:???<> テーブル分割だと、連続していて欲しいデータが分断されちゃわない? <>
忍法帖【Lv=40,xxxPT】(-1+0:8) <>sage<>2012/09/13(木) 10:04:02.62 ID:???<> 連続していて欲しいデータって、例えばどういうものかな? <>
NAME IS NULL<><>2012/09/14(金) 02:59:55.66 ID:Bxso9aq/<> PHPMyAdminで見ると、データベースサーバは「FreeBSD mysql-server-5.1.11」となっているのですが
ウェブサーバは「libmysql - 5.0.81」となっています。
どうしてこうなったのかは自分でもよく分からないのですが、libmysqlを5.1.11にするにはどうすればいいでしょうか?
事情でMySQLを5.5などにアップデート出来ないので、libmysqlのバージョンの方を合わせたいのですが・・・ <>
NAME IS NULL<><>2012/09/14(金) 16:52:54.52 ID:R26sG2cm<> PhpMyAdminの状態から見るステータスと
show statusで見るステータスと数値が全然違うんですが
どっちを信用すればいいんでしょうか <>
NAME IS NULL<>sage<>2012/09/14(金) 17:55:48.87 ID:???<> エンジンにmroongaを使った場合、optimize tableやanalyze tableに対応してないみたいで
mroongaの公式ページにもそのあたりの情報が乗ってないんだけど、やらなくていい仕組みになってるのかな
それとも、専用のメンテコマンドがあるんでしょうか。 <>
NAME IS NULL<><>2012/09/16(日) 10:19:20.16 ID:KcVHyoKg<> 質問させてください。
100万行程のCSVファイルをMySQLへ毎日流しこむ作業があります。
LOAD DATA INFILE構文を使おうと考えていますが、このCSVファイルは毎日少しずつ追加・編集されます。
既にあるDB内のデータと、CSVファイルを比較して
DBに無いデータは追加、修正・変更されているデータは更新といったような動きはできますでしょうか。
MySQLは5.5、サーバーはさくらのレンタルサーバ・スタンダードプランを利用しています。 <>
NAME IS NULL<>sage<>2012/09/16(日) 11:24:08.08 ID:???<> >>900
http://dev.mysql.com/doc/refman/5.1/ja/load-data.html
もし REPLACEを指定すると、インプット行は既存行を置き換えます。
言い換えると、主キーや固有インデックスに対して同じ値を持つ、既存行
であるという事です。詳しくは 「REPLACE 構文」 を参照してください。
もし IGNORE を指定すると、 固有キー値上の、既存行を複製するインプット行はスキップされます。
もしどちらのオプションも指定しなければ、その動作は LOCALキーワードが指定されたかどうかに
よって決まります。LOCALを利用すると、複製キー値が見つかった時点でエラーが発生し、テキスト
ファイルの残りは無視されます。LOCALを使用しなければ、デフォルトの動作は IGNOREが指定さ
れた時と同じです。これは、サーバは操作の最中にファイルの送信を中止する事ができないからです
<>
NAME IS NULL<>sage<>2012/09/19(水) 10:33:03.11 ID:???<> >>897
mysql接続用のモジュール(ウチの環境だと/usr/lib64/php/modules/mysql.so)が
libmysqlclient.so.16にリンクされてるからだと思う。
であれば、mysql.so/mysqli.so/pdo_mysql.so辺りの再コンパイル。
シンボリックリンクやリネームなんかで上手くいく場合もあるみたいだけど、
上手くいかなかった人も知ってるので個人的には再コンパイル推奨。
ttp://shimao-php-mysql.blogspot.jp/2008/05/mysql.html
>>898
言っているのがphpMyAdminの「状態」とかいうリンク先の情報と、
mysql> SHOW STATUS; の情報の違いであれば、
phpMyAdminから見ているのは"SHOW GLOBAL STATUS"の結果で
SHOW STATUSで表示されるのは"SHOW SESSION STATUS"の結果だから。
ttp://dev.mysql.com/doc/refman/5.1/ja/show-status.html <>
NAME IS NULL<><>2012/09/19(水) 13:07:48.20 ID:Tn05cz/z<> 基礎的な質問なのですが
レプリケーションはデータベース単位ではなくて
サーバー単位で設定されるのでしょうか?
つまり、レプリケーションの設定を行えば、
マスターにデータベースを新規作成すると
スレーブにも自動的にデータベースが作成されるのでしょうか? <>
NAME IS NULL<>sage<>2012/09/19(水) 14:00:47.68 ID:???<> >>903
デフォルトではそう。
オプションで
「あるDBのみレプリケーション」
「あるDBのみ除外」
「あるテーブルのみレプリケーション」
「あるテーブルのみ除外」
が設定できる。
ttp://dev.mysql.com/doc/refman/5.1/ja/replication-rules.html
そういえば5.5のマニュアル全然日本語化されないねぇ。 <>
903<><>2012/09/19(水) 16:07:30.79 ID:Tn05cz/z<> >>904
おお、これは
詳しい解説ありがとうございます <>
NAME IS NULL<>sage<>2012/09/20(木) 03:30:28.37 ID:???<> show tables; では確かに一覧の中に表示されるテーブルが、
select * from TABLENAME; では表示されません(Table 'database.TABLENAME' doesn't exist)。
原因は何が考えられるでしょうか。
具体的には…
データを同期させているノートPCとデスクトップPCでWordPressをいじってまして、当該テーブルは wp_* の各種テーブルです。
ノートPCでインストール・作成したWordPressが、同期したデスクトップPCではテーブルにアクセスできないために動きません。
両PCのDBはファイル単位(\xampp\mysql\data\database)で同期しています。
両PCから見える phpMyAdmin の表示は、当該データベースも特権ユーザー周りも同じに見えます。
WordPressのようなアプリケーションからではなく、自分で作成したテーブルは、両PCでこれまで問題なく動いてきました。
たぶんこれらの報告も同じ症状のように見えます。
http://okwave.jp/qa/q7544736.html?sort=datetime:ASC
http://hatomugi.sakura.ne.jp/forum/topic.php?id=108
http://aki.adam.ne.jp/bbs/question/detail.php?rt=683&id=683 <>
906<><>2012/09/20(木) 03:32:18.27 ID:heTxKW0o<> age忘れ申し訳ありません。 <>
NAME IS NULL<>sage<>2012/09/20(木) 11:01:30.26 ID:???<> innodb auto_incrementについて質問です。
create table testtbl(
id int(5) auto_increment not null primary key,namestr varchar(3) default null
);
insert into testtbl(namestr) values('rrr'),('ff');
mysql> select * from testtbl;
+----+---------+
| id | namestr |
+----+---------+
| 1 | rrr |
| 2 | ff |
+----+---------+
2 rows in set
としておいて、
begin;
delete from testtbl;
insert into testtbl(namestr) values('ffd'),('srr');
comitt;
select * from testtbl;
mysql> select * from testtbl;
+----+---------+
| id | namestr |
+----+---------+
| 3 | ffd |
| 4 | srr |
+----+---------+
2 rows in set
idが3,4になりますが、これ、1からスタートさせることは出来ないのですか?
<>
906<><>2012/09/20(木) 11:24:24.34 ID:heTxKW0o<> 原因がわかりました。端的には「InnoDBでテーブルが作成されていたこと」が原因です。
これまでファイルコピーだけで便利に同期できていたのが、MyISAMのおかげだったとは知りませんでした。
MyISAMのテーブルの移動はもっと評価されるべき - (゚∀゚)o彡 sasata299's blog
http://blog.livedoor.jp/sasata299/archives/51345888.html
ファイルコピーしてもInnoDBだと別のPCで認識されないのは、どうしてでしょうか。
当該データベース・テーブルのファイルだけでなく、xamppのディレクトリ全体をコピーした上で、
MySQLの再起動も行ってなお認識しないのは、ちょっと不思議な気がします。
どのレベルの情報が同期されていないのでしょう。まさかWindowsのレジストリではないと思いますが。 <>
NAME IS NULL<>sage<>2012/09/20(木) 13:09:05.74 ID:???<> >>909
ibdata1コピーしてないんじゃないかなと思ったけど。
ibdata1は何も設定してなければ\xampp\mysql\data\ibdata1だと思うから、
\xampp\mysql\data\databaseだけをコピーしてるとコピーされないと思う。
InnoDBのテーブルは、データ実体がどこにあるか(ibdファイルなのかibdata1なのか)とか
ロールバックセグメントがどうだとか、InnoDBログファイルがどこまでチェックポイントされてるかとかを
ibdata1に書き込むから、ibdata1も一緒にコピーしないとテーブルとして機能しない。
あと、テーブルの移行先でibdata1を上書くときはくれぐれも気を付けて。 <>
NAME IS NULL<>sage<>2012/09/20(木) 13:12:30.89 ID:???<> >>908
ALTER TABLE testtbl AUTO_INCREMENT = 1;
ただしALTER TABLEは暗黙のコミットを引き起こすので注意。
ttp://dev.mysql.com/doc/refman/5.1/ja/implicit-commit.html
あと、必ず毎回空にするのであれば、
TRUNCATE testtblで中身をからっぽ&AUTO_INCREMENTを1に戻してくれる。 <>
NAME IS NULL<>sage<>2012/09/20(木) 13:34:50.97 ID:???<> >>904
>そういえば5.5のマニュアル全然日本語化されないねぇ。
オレはとっくにあきらめてる。orz
5.6では、正式リリースと同時とか
期待してるんだぜ。
<>
NAME IS NULL<>sage<>2012/09/20(木) 17:57:41.80 ID:???<> >>911
ありがとうございます。truncateでやることにします。 <>
NAME IS NULL<><>2012/09/20(木) 21:52:47.87 ID:vaj+9cSO<> ここのURLにPHPで書かれているutf8_ngramをストアドプロシージャとして書き換える事は可能でしょうか。
http://d.hatena.ne.jp/k_yamamot/20100811/1281512139 <>
NAME IS NULL<>sage<>2012/09/21(金) 10:33:51.71 ID:???<> >>914
ストアドファンクションでできるよ。
空白の制御とか細かいところ作ってないけど、
20文字くらいを処理させるのに大体1ミリ秒弱だった。 <>
NAME IS NULL<>sage<>2012/09/21(金) 13:57:17.82 ID:???<> > 20文字くらいを処理させるのに大体1ミリ秒弱
え、1000回試行した1回あたり平均値の話? <>
NAME IS NULL<>sage<>2012/09/21(金) 14:18:24.61 ID:???<> >>916
BENCHMARK関数使って10万回 * 3くらいやった平均。 <>
NAME IS NULL<>sage<>2012/09/21(金) 14:19:09.41 ID:???<> >>916
あ、INSERT部分じゃなくて文字列をパースして分かち書きにするところまで。。 <>
NAME IS NULL<><>2012/09/21(金) 15:30:38.31 ID:JY5vjra1<> 質問です。よろしくです。
10万件くらいレコード数があるものを
SELECT * FROM `shouhin` WHERE `check` = '1' ORDER BY `date` DESC LIMIT n*p, n
こんな感じで取り出してソートするとします。
n=1画面に表示する数 p=現在のページ数
checkには1か0しか入らない。
dateは 2012-09-21 12:00:14 みたいな形式。
(shouhinとdateにはインデックスを作っている)
もっと効率よい取り出し方はありますでしょうか? <>
NAME IS NULL<>sage<>2012/09/21(金) 16:17:31.91 ID:???<> >>919
(`check`,`date`)の複合インデックスが良いんじゃない? <>
NAME IS NULL<>sage<>2012/09/21(金) 16:42:30.26 ID:???<> >>920
レスありがとうございます。
他にも checkとpriceとか、checkとnoとか
色々な組み合わせで検索したりするんですが
それらも全部それぞれの組み合わせで
複合インデックスを作成しておいた方がいいという事でしょうか?
要するに、(`check`,`date`)、(`check`,`price`)、(`check`,`no`) とかで。
それとも全部纏めての複合インデックスの方がいいんでしょうか?
要するに、(`check`,`date`,`price`,`no`) とかで。
質問ばかりすみません。 <>
NAME IS NULL<>sage<>2012/09/21(金) 16:59:11.40 ID:???<> >>921
検索と更新の割合次第…としか言えないかなぁ。
インデックスは基本的に
・無駄なインデックスでも検索には基本的に影響が出ない
・有効なインデックスでも更新には常に影響が出る
ものだから、
更新が日に1回しかないのならがっつり作っちゃえば良いし、
更新が断続的に続くなら検索頻度が高い組み合わせだけで
複合インデックスを作った方が良い。
全部まとめて複合インデックスにするのは多分NG。
複合インデックスは順番どおりに使わないといけないってルールがあるから。
ttp://dev.mysql.com/doc/refman/5.1/ja/mysql-indexes.html
がんばれ。 <>
921<><>2012/09/21(金) 16:59:12.69 ID:JY5vjra1<> (`check`,`date`)の複合を新たに作って試してみました。
現在はデータ件数6000件くらいのせいかほんの少ししか変りませんでした。
CPUが1GHzのヘボマシンなんですが
最初→0.73sec
現在→0.68sec
とかでした。
あと、既に checkとdateは個別のインデックスがあるんですが
個別で検索することもあるのでこの個別のインデックスは残しておいた方がいいんでしょうか?
つまり
(`check`)←既にあったもの
(`date`)←既にあったもの
(`check`,`date`)←新しく作成したもの
上記みたいにそれぞれ別にしておいた方がいいのでしょうか?
それか>>921に書いたように全部一緒にするのはどうでしょうか? <>
NAME IS NULL<>sage<>2012/09/21(金) 17:08:52.46 ID:???<> >>923
`check`のカーディナリティが2だから、
複合インデックスにしてもORDER BY分しか速くならないからね。。
残しておくかどうかの基準は>>922といっしょ。
本気で見極めるなら、検索と更新のターンアラウンドタイムを取って確かめるしかない。 <>
921<>sage<>2012/09/21(金) 17:09:23.31 ID:???<> >>922
あっ、書いてる間にレスしてくれてたんですね(汗)
すみません。
そうですかー、全部纏めて作るのはNGなんですか。
そうなるとやっぱり組み合わせの分だけ作った方がいいような気がしますね。
データの追加とか更新はそこまで頻繁にはないので
検索重視のシステムを構築したいと思います。
ですのでやっぱりインデックスをがっつり作っておきたいと思います。
外部ページなんかも紹介してくださってありがとうございました。
非常に参考になりました。助かりました。どうもです。 <>
921<>sage<>2012/09/21(金) 17:12:52.67 ID:???<> おっと>>923の↓は
最初→0.73sec
現在→0.68sec
これの↓間違いでした… 一桁間違ってた。
最初→0.073sec
現在→0.068sec
>>924
レスありがとうございます。
カーディナリティですか?ちょっと勉強不足なんで調べてみますね。
更新頻度はあまり多くないので検索重視のシステムが作りたいと思っています。
自分でも色々調べてみますね。 <>
921<>sage<>2012/09/21(金) 17:15:24.69 ID:???<> あっカーディナリティっていうのは
checkには二通りの種類しかない=カーディナリティが2という事なんですかね。
確かにインデックス作ってもこれは効果が薄そうではありますね… う〜ん。 <>
921<><>2012/09/21(金) 19:23:06.79 ID:JY5vjra1<> いやいやいやいや!
劇的に速度改善されました!
一応テストだったんで↓の最後のLIMITを指定せず
SELECT * FROM `shouhin` WHERE `check` = '1' ORDER BY `date` DESC LIMIT n*p, n
こんな感じでクエリ出して、スクリプト側からレコードを移動させて取り出していたんですが
SELECT * FROM `shouhin` WHERE `check` = '1' ORDER BY `date`
それだと
最初→0.073sec
現在→0.068sec
だったんですね。
でもLIMITを指定してから実行してみたら…
最初→0.73sec
現在→0.0014sec
になってました!
ただより遠くのレコードを取り出そうとすると
(要するに、n*p が大きくなると)
現在→0.046sec
くらいになってしまいますね(n*pが4000くらいです)。
ただ最初のあたりのレコードを表示させてる分には
メチャクチャ速くなってビックリしました。
でも何で遠くのレコード表示には時間が掛かるんでしょうね? <>
921<>sage<>2012/09/21(金) 20:10:54.05 ID:???<> 訂正です… ↓また最初のやつ一桁間違ったw
最初→0.073sec
現在→0.0014sec
これは↑間違えてないです〜 <>
NAME IS NULL<>sage<>2012/09/22(土) 00:54:21.69 ID:???<> >>929
それは良かった!
LIMITで指定するのが遠くなると遅くなる訳は少し長くなるけど、
・複合インデックスを指定する前
⇒WHERE `check` = '1'で多分インデックスが使えない
(期待値的にインデックスを利かせるよりテーブルスキャンのが速いとオプティマイザが判断してると思う)
⇒20万行(レコード全部)テーブルからフェッチ。
⇒ORDER BYでもインデックスが使えない。
(`date`にインデックスが無いから)
⇒取り出した20万行をテンポラリファイルに全て詰め込んでfilesort。
⇒LIMITでテンポラリファイルの先頭からn*p行を取り出して、n行クライアントに返す。
結局、20万行スキャンしてる。
・複合インデックスを指定した後
⇒WHERE `check` = '1'でインデックスが利く。
⇒仮に10万行スキャンとする。
⇒ORDER BYでもインデックスが使える。
⇒10万行(=WHERE句でHITした行数)をメモリ上でソート。
⇒LIMITでメモリ上のソート結果の先頭からn*p行だけをテーブルからフェッチして、
n行をクライアントに返す。
n*pが小さければ小さい程実際にテーブルからフェッチする件数が減るから速い。
n*pがレコードの全件数に近くなれば近くなるほどテーブルからフェッチする件数が
全件スキャンに近くなるから差がほとんどなくなる。
て感じ。 <>
921<>sage<>2012/09/22(土) 15:29:08.86 ID:???<> やっと書き込めた!お礼遅くなりごめんなさいです!
>>930
非常に丁寧に細かい説明ありがとうございます。
やっぱり遠くにあるものを取り出す時は
処理コストが掛かるのはMySQLの仕様として仕方がないんですね。
安心しました。
とりあえずこの方向性でシステム調整して行こうと思います。
<>
NAME IS NULL<>sage<>2012/09/23(日) 16:15:23.04 ID:???<> 例えば曲テーブルとジャンルテーブルがあって
一つの曲は複数ジャンルをもてる場合
音楽テーブルは
music_tabe
id(pk)
として、ジャンルテーブルは
music_genre_table
music_id(fk)
genre_id(pk)
と
music_genre_table
id(pk) auto_inclement
music_id
genre_id
みたいに持つのはどっちがよいですか。
音楽IDとジャンルIDで一意に特定できるので、上でもいいかと思うのですが
検索とか考えると下のほうが早いのかもと考え始めたらよく解らなくなりました。 <>
NAME IS NULL<>sage<>2012/09/23(日) 16:28:09.62 ID:???<> 似たようなもん作っていて(音楽データではないけど)、下の作りでやってる <>
NAME IS NULL<>sage<>2012/09/23(日) 17:19:12.71 ID:???<> >>932
上は音楽IDとジャンルIDで一意、じゃなくてジャンルIDだけで一意だがそれでいいのか?
下は音楽IDとジャンルIDでも一意じゃないがそれでいいのか? <>
NAME IS NULL<><>2012/09/26(水) 02:42:34.22 ID:n63Twvlz<> ライセンスがよくわからんのだけど、
受託でWEBアプリケーションを納品するときって、ソース公開しないといけないの?
それとも、MySQLの派生物じゃないから公開義務は発生しないの?
<>
NAME IS NULL<>sage<>2012/09/26(水) 18:26:10.80 ID:???<> >>935
俺もそんなに詳しくはないけど、
MySQL(や、その他GPLが適用されたプログラム)に含まれる
ソースコードそのものを取り込んで(改変して)いなければGPLは適用されない。
WEBアプリケーションを外部からアクセス可能にするだけでは
「再頒布」に当たらない(GPLなソフトウェアからの出力、と看做されたと思う)ので
GPLv2の再頒布にかかる規定(ソースコードの公開etc.)に従う必要はない。
ただ、客先への納品は再頒布だから、
・GPLが適用される ⇒ 客先へのソースコード公開が必要
・GPLが適用されない ⇒ 客先との契約次第
になる。いずれも客先への公開の問題で、世間一般に公開する必要はないはず。 <>
NAME IS NULL<>sage<>2012/09/26(水) 19:24:05.06 ID:???<> >>935
「MySQLの派生物じゃない」部分だけ納品するのなら当然GPLに従う必要はない。 <>
NAME IS NULL<><>2012/09/30(日) 12:05:15.66 ID:SqWyzZVW<> 初心者の質問です。
以下のような連想配列があります。
$_SESSION["login"]=array(
"name" => $row["name"],
"ID" => $row["ID"]
);
これの$row["ID"]1つだけを取り出したいとき、
どのように指定したらいいですか?
$user_ID に代入するとして教えてください。
<>
NAME IS NULL<><>2012/09/30(日) 12:06:38.06 ID:SqWyzZVW<> 間違えました…ここmysqlの質問板でした。
上の質問はスルーしてください。 <>
NAME IS NULL<>sage<>2012/09/30(日) 15:18:51.96 ID:???<> >>936, 937
さんきゅ。
>> 937
つーことは、MySQLのインストール作業をこっちでやらなければOKという解釈でもいいのか。
<>
NAME IS NULL<><>2012/10/02(火) 14:36:06.88 ID:/3YxDOCL<> CREATE TABLE students (
name CHAR(32) NOT NULL,
PRIMARY KEY (name)
);
というテーブルがあって、name の頭文字を基準にパーティショニングしたい場合、
このテーブルに
pn INTEGER NOT NULL // パーティション番号
のようなフィールドを持たせ、
データを挿入する際は、アプリケーション側で name の頭文字を判別し、
パーティション番号と共に挿入するという方法は安易な考え過ぎますでしょうか?
より精錬された一般的な方法があればご教授下さい。 <>
NAME IS NULL<>sage<>2012/10/02(火) 15:56:42.19 ID:???<> >>941
どうしても頭文字を基準にパーティショニングする必要がある?
ただ(それなりに)均等に分散すれば良いなら、KEYパーティショニングがすっきりすると思うけど。
ttp://dev.mysql.com/doc/refman/5.1/ja/partitioning-key.html <>
NAME IS NULL<>sage<>2012/10/02(火) 20:16:39.40 ID:???<> rootで特定のデータベースに接続して、今現在どういうユーザーがそのデータベースに接続しているかって知る方法ありますか? <>
941<><>2012/10/02(火) 20:22:21.86 ID:/3YxDOCL<> >>942
パーティション関数に ASCII() を使えないということだけが問題だったので、
KEYパーティショニングで代用できそうです。ありがとうございました! <>
NAME IS NULL<>sage<>2012/10/02(火) 20:29:10.27 ID:???<> >>943
SHOW PROCESSLIST; <>
NAME IS NULL<>sage<>2012/10/02(火) 20:33:43.37 ID:???<> >>945
即レスtonですm(__)m <>
NAME IS NULL<>sage<>2012/10/07(日) 00:00:58.57 ID:???<> mysql 5.5.15
mysqldumpでバックアップする時に外部制約の関係上、テーブル単位でバックアップ
しています。
それでテーブル以外のもの、ストアドプロシージャなどは
mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt hogehoge --default-character-set=cp932 -u xxxx -p > G:\Data\MySQL\fff.sql
としているんですけど、viewの定義とかはここには出てきていません。
viewの定義をバックアップする方法、教えてください。
<>
NAME IS NULL<>sage<>2012/10/07(日) 22:48:59.87 ID:???<> >>947
--no-create-info外せば取れるよ。 <>
NAME IS NULL<>sage<>2012/10/07(日) 23:53:29.88 ID:???<> >>948
ありがとうございます
テーブル定義と一緒にビューの定義も取れました。
<>
NAME IS NULL<><>2012/10/10(水) 14:22:18.59 ID:dQ01q0rX<> LIKEで使える記号って % 以外に何があったっけか <>
NAME IS NULL<>sage<>2012/10/10(水) 15:07:22.57 ID:???<> アンダースコア"_"とエスケープのための"\" <>
NAME IS NULL<>sage<>2012/10/12(金) 01:19:35.74 ID:???<> >>951
ありがとう <>
NAME IS NULL<>sage<>2012/10/13(土) 01:13:59.81 ID:???<> ODBC Connector 5.1.11だとプロシージャにOUTの引数を設定するとエラーになるけど、これはバグなのかな…
5.2.2にあげたら起きなくなったんだけど。 <>
NAME IS NULL<><>2012/10/13(土) 19:36:00.68 ID:VrFqSmlP<> csvを標準入力からloadしたいんだけど、可能?
ファイルから入れる方法はありましたが、直接入れられる方が素敵です。
できなかったらcsvをinsert文に加工して入れようと思ってます。
mysql5.1 <>
NAME IS NULL<><>2012/10/14(日) 17:50:15.48 ID:SkZKtE+u<> mysql-binってレプリケーションを利用していなかったら削除していいんですか?
それともMySQLがクラッシュした時にここからリカバリしてるんでしょうか? <>
NAME IS NULL<><>2012/10/14(日) 21:07:11.70 ID:ZQIxLy7/<> 自然結合っていうのが具体的によく分からない。
RSの自然結合って例えばどういうことなのですか・ <>
NAME IS NULL<><>2012/10/14(日) 21:55:21.92 ID:i3Of/uN+<> 質問です
取引IDとかユーザIDとかを重複しない乱数で設定したく、乱数の一覧をまず用意しようと思います
で、5桁の16進数で乱数を作るとして乱数テーブルを3万行くらい作りたいんですがどうしたら良いでしょうか?
id, is_used
10001, 0
10002, 0
…
という形ですが、思いつくのはPHPで3万ループでinsertなんて方法だけです
もっと効率のいいやり方ありますか?どうしたら良いでしょうか <>
NAME IS NULL<>sage<>2012/10/14(日) 22:15:24.22 ID:???<> >>957
insert select.
create table selectもあったっけ。 <>
957<>sage<>2012/10/14(日) 22:41:15.41 ID:???<> >>958
ご意見ありがとうございます、しかし知識不足のためかよくわかりません
それはデータをinsertするときやテーブルを作るときに既にあるテーブルからselectした値を
まとめて挿入する方法ですよね?
自分がしたいのは、
1)テーブルを作る
2)それに3万行のデータ(5桁の16進数で10001から3万)を入れる
という効率的な方法です
insert selectやcreate table selectするのに必要なselect元のテーブルが存在してない状況です
(自分の最初の説明がわかりづらかったならすみません)
自分のアイディアじゃPHPで10001〜40000を16進数に変更、それをinsertしか思いつかないので
もっと良い方法ないかなぁと。よろしくお願いします <>
NAME IS NULL<>sage<>2012/10/15(月) 00:18:26.67 ID:???<> >>954
不可能。
でもINSERTに加工しなおさなくても、LOAD DATA [LOCAL] INFILEで入れた方が速いよ。
>>955
要らなければ消しても良い。
前のフルバックアップから、データ消失直前までのデータをリカバリする、なんて時に必要。
ただし、このリカバリは手動で実施。
あとは更新系のDMLが全部記録されるから、監査目的とか。
my.cnfにexpire_logs_days = 14とかやると、14日以上前のは勝手に消える様になるよ。
>>956
t1 NATURAL JOIN t2は
t1 LEFT JOIN t2 ON (t1.c1 = t2.c1 AND t2.c1 IS NOT NULL) AND (t1.c2 = t2.c2 AND t2.c2 IS NOT NULL) AND ..
と同義だったはず。
c1,c2..は、t1とt2で持っている同じ名前のカラム全てが列挙されるかたち。
>>959
乱数はどこかに行ったの?
10001〜40000が既に登録されてるテーブルを作って、
UPDATE t1 SET c1 = HEX(c1);
が楽なんじゃない? <>
NAME IS NULL<>sage<>2012/10/15(月) 00:23:18.57 ID:???<> >>956
あ、ごめん、NATURAL JOINは結合に使用したカラムは一度しか現れないのがLEFT JOINと違う。
t1(c1,c2,c3) と t2(c1,c3,c4) なら、
SELECT * FROM t1 NATURAL JOIN t2;
は、
SELECT t1.c1,t1.c2,t1.c3,t2.c4 FROM t1 LEFT JOIN t2 ON (t1.c1 = t2.c1 AND t2.c1 IS NOT NULL) AND (t1.c3 = t2.c3 AND t2.c3 IS NOT NULL);
と同じになると思う。 <>
NAME IS NULL<><>2012/10/15(月) 15:45:20.59 ID:ZaN3mqjF<> 先ほどからmysqlを学び始めました
ストレージエンジンという設定があることがわかったのですが、
InnoDBっていうのとMyISAMというのがあります。
トランザクション機能をサポートしているとかしてないとかの違いがあるのですが、
このトランザクション機能というのがいまいちよくわかりません。
わかるように教えてください。 <>
NAME IS NULL<>sage<>2012/10/15(月) 15:50:19.34 ID:???<> トランザクションは簡単に言えば複数のSQL操作で
途中キャンセルした場合に最初の操作時まで巻き戻せる機能。 <>
NAME IS NULL<><>2012/10/15(月) 15:53:35.63 ID:ZaN3mqjF<> >>963
なるほどありがとうございます。
それってコンソールから操作した場合の話ですよね?
PHPからコマンド実行した場合はどうなるんですか?その場合でもstart transactionとかcommitとか打たないとだめなんですか? <>
NAME IS NULL<>sage<>2012/10/15(月) 16:39:33.00 ID:???<> IPSて話題の森口見てこのスレの基地外おっさん思い出したよ
もういなくなったみたいだね
ああいう感じの人だったんだろうなぁ <>
NAME IS NULL<><>2012/10/15(月) 20:08:43.48 ID:ZaN3mqjF<> ユーザ作成するときに、identified by 'test'
って書くこの名前は何を意味していつ使うんですか? <>
NAME IS NULL<>sage<>2012/10/15(月) 21:10:00.01 ID:???<> >>964
php (mysqli,pdo_mysqlなど)からも同様。
ただし、使うライブラリによっては autocommit がデフォルトになってることもあると思う。
>>966
msyql に cli などでつないで、
help grant をみると幸せになれると思う。
<>
NAME IS NULL<><>2012/10/15(月) 21:44:52.05 ID:ZaN3mqjF<> >>967
なるほど
ありがとうございました!
今までずっとsqlite使ってたんですが、charとかtext型使ってたんで、
mysqlみたいにいちいち文字数やバイト数を指定するのに違和感を感じるんですが、
普通はちゃんと指定して作ってるんでしょうか?
それともmediumtextとかlongblobとか使ってるんでしょうか? <>
NAME IS NULL<><>2012/10/15(月) 21:49:17.29 ID:ZaN3mqjF<> 何度も質問で申し訳ないんですが、
identified by '文字列'
ここの文字列の部分はパスワードってことでいいですか?
でもたまにidentified by password '文字列'
の構文もあったんですが何が違うんでしょうか?
後者の方はユーザ作るときだけとかでしょうか? <>
957<>sage<>2012/10/15(月) 22:43:18.44 ID:???<> >>960
どうもありがとうございます、おかげで解決方法にたどり着きました <>
954<>sage<>2012/10/15(月) 22:59:52.78 ID:???<> >> 960
ありがとうございます。cronでshellを動かすので遅くていいのですが、できないならしょうがないですね。
>> 959
ごめんなさい、複数行の生成ができるのはpostgresでした。
# select generate_series(1,3);
generate_series
-----------------
1
2
3 <>
NAME IS NULL<>sage<>2012/10/16(火) 05:37:52.51 ID:???<> >>969
identified by 'foo'
の場合は、password('foo') (パスワード暗号化関数を実行)した結果が登録される。
identified by password 'foo'
の場合は、foo がそのまま登録される。
mysql はユーザー認証の際に、password('foo') した結果と、
mysql.user の password カラムで内容が一致するか確認するので、
前者は password: foo でログインできるが、後者はできない。
identified by password はどっか別の DB から mysql.user をみてコピーする際や、
手元で selelect password('foo') とかして履歴にパスワードの生文字列を
残したくない場合に使うぐらいなのかな?
つまり foo をパスワードとしたユーザーを登録したい場合は、
identified by 'foo'
または
identified by password '*F3A2A51A9B0F2BE2468926B4132313728C250DBF'
となる。
ちなみに、password 関数は MySQL 4.1 あたりで変更されてるので注意 <>
NAME IS NULL<><>2012/10/16(火) 07:40:45.08 ID:yFJZYlxr<> >>972
そんな仕組みがあったとは・・
勉強になりました
ありがとうございました! <>
NAME IS NULL<><>2012/10/17(水) 16:53:18.86 ID:ZQKaKcpQ<> MySQL5.5でutf8mb4を使いたいのですが、自作したPHPでpostして保存すると、
コマンドからもPHPMYADMINからも文字化けしてしまいます。
show variables like 'character_set%';をしても文字コードはあってると思うのですが。(以下がその結果です)
character_set_client | utf8mb4
character_set_connection | utf8mb4
character_set_database | utf8mb4
character_set_filesystem | binary
character_set_results | utf8mb4
character_set_server | utf8mb4
character_set_system | utf8
PHPでデータを読み込む場合は文字化けせず表示されています。
どうすれば解決するでしょうか?よろしくお願い致します。 <>
NAME IS NULL<><>2012/10/17(水) 17:00:03.95 ID:tlC3fdR4<> mysql5.5を使っています
show column from table を実行した時に成功する時と失敗する時があります
最初は対象テーブルに行(データ)がない時はエラーになるのかと思ったのですが、
データがあっても失敗するものもあります
どういう条件で失敗するのでしょうか? <>
974<>sage<>2012/10/17(水) 18:27:47.23 ID:???<> 再インストールで直りましたすみません。 <>
NAME IS NULL<>sage<>2012/10/17(水) 19:25:23.65 ID:???<> >>975
失敗したことがないからわからないのだが、
どういうエラーが出るのか教えて欲しい。
# show columns from table_name の typo だよね?
あと、
desc[describe] table_name;
や
select * from information_schema.columns where table_schema=db_name and table_name=table_name;
だとどうなるか。
可能性としてはテーブルの情報がおかしいからテーブル作りなおしたほうがいいんじゃないかなと思う <>
975<><>2012/10/17(水) 20:26:18.28 ID:tlC3fdR4<> >>977
ありがとうございます、typoしてましたすみません
desc order するとshow columnsと同じエラーが出ます
#1064 - You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use near 'order' at line 1
select * from information_schema.columns where table_schema=dekitala and table_name=order;
だと以下のエラーです
#1064 - You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near 'order LIMIT 0, 30' at line 1
対象のorderテーブルは以下のクエリで作りました。おかしいでしょうか
create table `order` (
id varchar(30) primary key not null,
sellerType varchar(20) not null,
sellerId int(11) not null,
buyerType varchar(20) not null,
buyerId int(11) not null,
is_used tinyint(1) not null,
seller_addressId int(11),
buyer_addressId int(11),
) <>
NAME IS NULL<>sage<>2012/10/17(水) 21:12:26.12 ID:???<> >>978
desc `order`; <>
975<>sage<>2012/10/17(水) 21:22:11.51 ID:???<> >>979
ありがとうございます
しかし、エラーです
>#1064 - You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use near 'desk `order`' at line 1
なんでだろう。。 <>
NAME IS NULL<>sage<>2012/10/17(水) 21:26:41.89 ID:???<> >>980
× 'desk `order`'
○ desc `order`; <>
975<>sage<>2012/10/17(水) 21:28:29.85 ID:???<> あっ!うまく行きました!
alter table `order` rename to `orderx`;
してテーブル名を変えたところ、
desc `orderx`; が正常にテーブル構造を返しました!
どういうことでしょうか?
と、思って調べたら、テーブルに利用禁止な予約語だったみたいです
お恥ずかしい、お騒がせしました。ありがとうございました <>
975<>sage<>2012/10/17(水) 21:37:48.16 ID:???<> すみません、やはりもう少しお願いします
deskの失敗するテーブル`color`を`colorx`に名前変更し、さらに`color`に名前変更したら
今度はdesk成功しました
どういうことなんでしょうか? 流れは以下のようになります
desc `color`; →失敗
>#1064 - You have an error in your SQL syntax; check the manual
>that corresponds to your MySQL server version for the right syntax to use near 'desk `color`' at line 1
//テーブル名変更
alter table `color` rename to `colorx`;
//desk
DESC `colorx` →成功
//テーブル名元に戻す
alter table `colorx` rename to `color`;
//color
DESC `color` →成功
<>
975<>sage<>2012/10/17(水) 21:40:17.10 ID:???<> >deskの失敗するテーブル
descでした、すみません <>
NAME IS NULL<><>2012/10/18(木) 01:14:18.91 ID:jxIImRzW<> >>974
接続時に文字コード指定が要る
http://www.artful.jp/blog/archives/2006/07/xamppmysqlphpmy.html
set namesとかでぐぐれ
「PHPでデータを読み込む場合」はなにで接続してるんだ <>