私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレMySQL 総合 Part14
mysql スレッド一覧へ / mysql とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ☆
レスフィルター : (試験中)
なんでもかんでもRDBMS使おうとすんなよ。
sennaの結果をキーにしてレス番引くハッシュDB+共有メモリだ、この野郎。
sennaの結果をキーにしてレス番引くハッシュDB+共有メモリだ、この野郎。
> update文やdelete文を実行する際に、
> whereで該当した行だけがロックがかかるのでしょうか?
NO
そのSQLを実行するために「InnoDBが触った行がすべて」ロックされる。
索引の効かないSQL、例えば
UPDATE AAA SET BBB = CCC WHERE DDD LIKE '%ABC%';
こんなのを実行すると全行ロックされる。
> 他のセッションからselectやupdateが実行された場合、
> whereに該当するデータを対象としている場合は、ロックにより待たされるけど、
> whereに該当するデータではない場合には、そのまま待たされずに実行されるということでしょうか?
MVCCだからそもそもSELECTは待たされない。
前述した仕組みにより
UPDATEは他の更新SQLのWHERE句と重なっていなくても待たされることがある。
> whereで該当した行だけがロックがかかるのでしょうか?
NO
そのSQLを実行するために「InnoDBが触った行がすべて」ロックされる。
索引の効かないSQL、例えば
UPDATE AAA SET BBB = CCC WHERE DDD LIKE '%ABC%';
こんなのを実行すると全行ロックされる。
> 他のセッションからselectやupdateが実行された場合、
> whereに該当するデータを対象としている場合は、ロックにより待たされるけど、
> whereに該当するデータではない場合には、そのまま待たされずに実行されるということでしょうか?
MVCCだからそもそもSELECTは待たされない。
前述した仕組みにより
UPDATEは他の更新SQLのWHERE句と重なっていなくても待たされることがある。
皆様、たくさんのご意見ありがとうございますm(_ _)m
>>444さん
datのみということでしょうか?
ファイルをごちゃごちゃいじるのが苦手なのでレス編集・レス削除・レス検索の実装を考えるとどうもうまくいく絵が想像できないでいます…
ちょっとdatのみの場合の設計も考えてみます。
>>445さん
datとDBにする場合はDBを検索専用に考えてます。
なのでdatのみだと検索が大変そうなのでレスデータをDBにいれておけば検索も簡単にできるかも と思いました。
>>452さん
貴重なご意見ありがとうございます。
無知すぎてどういう意味か理解できません。調べます。
>>453さん
ハウジングです。
>>444さん
datのみということでしょうか?
ファイルをごちゃごちゃいじるのが苦手なのでレス編集・レス削除・レス検索の実装を考えるとどうもうまくいく絵が想像できないでいます…
ちょっとdatのみの場合の設計も考えてみます。
>>445さん
datとDBにする場合はDBを検索専用に考えてます。
なのでdatのみだと検索が大変そうなのでレスデータをDBにいれておけば検索も簡単にできるかも と思いました。
>>452さん
貴重なご意見ありがとうございます。
無知すぎてどういう意味か理解できません。調べます。
>>453さん
ハウジングです。
テーブル構造はそのままです。
同じDB内ならテーブル名を変更すればいいだけだけど
そんな感じで名前そのままでDBだけ変更できないかなって思って
同じDB内ならテーブル名を変更すればいいだけだけど
そんな感じで名前そのままでDBだけ変更できないかなって思って
>>460
それって単に新規テーブル作成するだけじゃないのか?
それって単に新規テーブル作成するだけじゃないのか?
とりあえずmysqldumpは分かったんですが
このコマンドってどうやって使うんですか?
mysql >
って書き方じゃないからPHPのクエリ送る関数では無理ですよね?
となるとプロンプト画面からだけなんですか?
めんどくさい…。
このコマンドってどうやって使うんですか?
mysql >
って書き方じゃないからPHPのクエリ送る関数では無理ですよね?
となるとプロンプト画面からだけなんですか?
めんどくさい…。
LOAD DATA INFILEやINTO OUTFILEに日本語のファイル名が使えないのですが、
これは仕様なのでしょうか。
これは仕様なのでしょうか。
自己解決しました。
> 「chcp 65001」でUTF-8
これ、自分もいつかどこかで聞いたことあるけど、UTF-8にならなかった。(XPsp2 and sp3)
そん時MSのKBとかでも探してみたんだけど、結局ようわからんかった。
つうことで>>469
chcp 437 とかで、ISO-8859-1(Latin1)とかにすることは可能。
どうしてもUTF-8のまま扱いたかったら、コマンドから、>(リダイレクト)で出力を
ファイルに書き出せばいいんでない。
これ、自分もいつかどこかで聞いたことあるけど、UTF-8にならなかった。(XPsp2 and sp3)
そん時MSのKBとかでも探してみたんだけど、結局ようわからんかった。
つうことで>>469
chcp 437 とかで、ISO-8859-1(Latin1)とかにすることは可能。
どうしてもUTF-8のまま扱いたかったら、コマンドから、>(リダイレクト)で出力を
ファイルに書き出せばいいんでない。
失礼。>>471書き込んでからもっかいググってみたら、
どうやらコマンドでchcp65001入れるだけでなくて、
プロパティから「フォント設定」も変更しないといけないらしい。
つうことでやってみたら、コマンドプロンプトがUTF-8にナッタヨ!でも一部の文字が化ける。
(しかも一度画面を切り替えるなりして、Window再描画したら直るし。意味分からん)
とゆうこで471は忘れて下さい。あんまやるとスレ違いにもなっちゃうので。
スレ汚し失礼しました。
どうやらコマンドでchcp65001入れるだけでなくて、
プロパティから「フォント設定」も変更しないといけないらしい。
つうことでやってみたら、コマンドプロンプトがUTF-8にナッタヨ!でも一部の文字が化ける。
(しかも一度画面を切り替えるなりして、Window再描画したら直るし。意味分からん)
とゆうこで471は忘れて下さい。あんまやるとスレ違いにもなっちゃうので。
スレ汚し失礼しました。
・クエリキャッシュの有無
・SQLの複雑さ
・バッファキャッシュへのヒット率
・ネットワーク経由かどうか
といった要因で性能は1~2桁変わるから、
人の聞いても意味ないよ。
意味ないことを示すために手元のノートPC(Core2Duo 2.0GHz)で
8735.9 query/s 出してみた。
・SQLの複雑さ
・バッファキャッシュへのヒット率
・ネットワーク経由かどうか
といった要因で性能は1~2桁変わるから、
人の聞いても意味ないよ。
意味ないことを示すために手元のノートPC(Core2Duo 2.0GHz)で
8735.9 query/s 出してみた。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class BenchTest {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/scott", "root", "xxxx");
Statement stmt = conn.createStatement();
long time = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
doTrans(stmt);
}
time = System.currentTimeMillis() - time;
System.out.println(time / 1000.0);
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
static void doTrans(Statement stmt) throws SQLException {
ResultSet rs = stmt.executeQuery("select 1");
while (rs.next()) {
//
}
rs.close();
}
}
これで11.447秒
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class BenchTest {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/scott", "root", "xxxx");
Statement stmt = conn.createStatement();
long time = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
doTrans(stmt);
}
time = System.currentTimeMillis() - time;
System.out.println(time / 1000.0);
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
static void doTrans(Statement stmt) throws SQLException {
ResultSet rs = stmt.executeQuery("select 1");
while (rs.next()) {
//
}
rs.close();
}
}
これで11.447秒
テーブルhogeのaとbというフィールドに複合インデックス作って以下のようなクエリを
実行しているのですが、インデックスを使用してくれません。
select * from hoge where (a, b) in ((1,2), (3,4), (5,6), ... );
インデックスを使用して効率的に上記のような文を実行させる方法はありますか?
実行しているのですが、インデックスを使用してくれません。
select * from hoge where (a, b) in ((1,2), (3,4), (5,6), ... );
インデックスを使用して効率的に上記のような文を実行させる方法はありますか?
http://www.century21macao.jp/jp/property-for-investment/villa-de-mor/tower1.html?gclid=CL3-sKu07pUCFQ5aegodaDQ7eA
このページ見ると、
Warning: mysql_result() [function.mysql-result]:
Unable to jump to row 0 on MySQL result index 6
in /home/century/public_html/mainpages.php on line 42
こんなエラーばっかしなんだけど、
どうしてかな?
このページ見ると、
Warning: mysql_result() [function.mysql-result]:
Unable to jump to row 0 on MySQL result index 6
in /home/century/public_html/mainpages.php on line 42
こんなエラーばっかしなんだけど、
どうしてかな?
データをUTF-8で入れているのですが、すべてのデータをujis(euc-jp)に変えることは可能でしょうか?
今、考えつく方法はmysqldumpしてエディタで文字コードを変えていれるくらいです
コマンドでできる等ありましたらご教示お願いします
今、考えつく方法はmysqldumpしてエディタで文字コードを変えていれるくらいです
コマンドでできる等ありましたらご教示お願いします
>>484
データ消しちゃってて、0件の時どうするか書いてないんじゃないのw
データ消しちゃってて、0件の時どうするか書いてないんじゃないのw
>>483
レスありがとうございます。
トリガですか。ひとつのテーブルに一個しかDefualtでCURRENT_TIMESAMP入れられないの地味に面倒ですね。
せっかくトランザクションがあるのに・・・
登録日時はデフォを0にして、ホスト言語でやるか、トリガ導入するか検討してみます。
すいません。もう一点。
実はポスグレからの移行なのですが、文字列を入れるカラムをポスグレのときは、
長さを考えずに全部TEXTにしていたのですが、MySQLだと、
TEXTにするとインデックス作るのに長さを指定しなきゃならないみたいなので
最大文字数を想定できるところはVARCHAR(L)でやろうかと持ってます。
ただ、慣れないので色々迷ってまして、
この数字って、255以下の時と256以上の時で最低の容量が違うだけで、
実は10とか100にするのと255にするのはあまり変わらなかったりするのでしょうか?
なるべく、小さめに設定した方がいいにか、
それこそ、ざっくり255 or 65535でやっちゃって良いのか、
はたまた、いっそのこと全部TEXTでやっちゃうのか。インデックス作るのに長さ指定するのはそんなに面倒じゃないし。
先輩方よろしくお願いいたします。
レスありがとうございます。
トリガですか。ひとつのテーブルに一個しかDefualtでCURRENT_TIMESAMP入れられないの地味に面倒ですね。
せっかくトランザクションがあるのに・・・
登録日時はデフォを0にして、ホスト言語でやるか、トリガ導入するか検討してみます。
すいません。もう一点。
実はポスグレからの移行なのですが、文字列を入れるカラムをポスグレのときは、
長さを考えずに全部TEXTにしていたのですが、MySQLだと、
TEXTにするとインデックス作るのに長さを指定しなきゃならないみたいなので
最大文字数を想定できるところはVARCHAR(L)でやろうかと持ってます。
ただ、慣れないので色々迷ってまして、
この数字って、255以下の時と256以上の時で最低の容量が違うだけで、
実は10とか100にするのと255にするのはあまり変わらなかったりするのでしょうか?
なるべく、小さめに設定した方がいいにか、
それこそ、ざっくり255 or 65535でやっちゃって良いのか、
はたまた、いっそのこと全部TEXTでやっちゃうのか。インデックス作るのに長さ指定するのはそんなに面倒じゃないし。
先輩方よろしくお願いいたします。
今はじめて、>>1のAAが絵に見えた。
VARCHARとTEXTの違いを整理・共通点すると
○両方とも可変長である
○単位
VARCHAR
文字単位(マルチバイト文字は2文字にカウント。文字コードにより変わる)
TEXT バイト単位(文字コードにより変わる)
○容量
VARCHAR
○両方とも可変長である
○単位
VARCHAR
文字単位(マルチバイト文字は2文字にカウント。文字コードにより変わる)
TEXT バイト単位(文字コードにより変わる)
○容量
VARCHAR
うぎゃ、なんかよくわらんが、スペースおしたら書き込んだ、すんません。
VARCHARとTEXTの違いを整理・共通点すると(ちなみに5.0.45です)
○両方とも可変長である
○単位
VARCHAR
文字単位(マルチバイト文字は2文字にカウント。文字コードにより変わる)
TEXT
バイト単位(文字コードにより変わる)
○容量
VARCHAR
0~255文字までなら+1バイト、それ以上は+2バイト
TEXT
TINY、MEDIUMなど、最大容量によって+1~+4バイト
○インデックス
VARCHAR
プリフィックス長を指定して、部分インデックスを作ることも出来る
TEXT
必ずプリフィックス長を指定する。
こんな感じでしょうか?
プリフィックス長を指定したインデックスの挙動をいまいち理解してないのですが
UNIQUEなどには出来ないってことですよね?
主キーやUNIQUEならVARCHARで、それ以外はINDEXはって検索にバリバリ使うなら
、少しVARCHARオススメで、あとはそれほど変わらないって事でしょうか?
VARCHARとTEXTの違いを整理・共通点すると(ちなみに5.0.45です)
○両方とも可変長である
○単位
VARCHAR
文字単位(マルチバイト文字は2文字にカウント。文字コードにより変わる)
TEXT
バイト単位(文字コードにより変わる)
○容量
VARCHAR
0~255文字までなら+1バイト、それ以上は+2バイト
TEXT
TINY、MEDIUMなど、最大容量によって+1~+4バイト
○インデックス
VARCHAR
プリフィックス長を指定して、部分インデックスを作ることも出来る
TEXT
必ずプリフィックス長を指定する。
こんな感じでしょうか?
プリフィックス長を指定したインデックスの挙動をいまいち理解してないのですが
UNIQUEなどには出来ないってことですよね?
主キーやUNIQUEならVARCHARで、それ以外はINDEXはって検索にバリバリ使うなら
、少しVARCHARオススメで、あとはそれほど変わらないって事でしょうか?
Debian (Linux)上にmysql 5.0.32-7 をインストールしています。
mysqlの設定ファイル my.cnf に
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake
を追記し、新規にデータベースを作成したりテーブルを作成した場合は文字化けしないのですが
WindowsXPにインストールしたmysqlのデータを
mysqldump -u root -p[rootのパスワード] [DB名] > db.sql
等とエクスポートしたファイルをLinuxのシェルで
mysql -u root -p[rootのパスワード] [DB名] < db.sql
すると show full columns from [テーブル名] 等とすると
[レコード名] | varchar(30) | sjis_japanese_ci
と表示され、utf8になってない事が分かります。コレをutf8にすれば文字化けしないはずなのですが
(新規に作成したテーブルだとutf8になっていますので) どうすれば変更できますか?
alter table [テーブル名] default character set=utf8
を実行してコマンドは成功したみたいなのですが、実際に確認してみても変わりません。
alter table [テーブル名] default character set=utf8;
Query OK, 10 rows affected (0.01 sec)
Records: 10 Duplicates: 0 Warnings: 0
↑成功しているように見えるのに変化しません・・・。どうすればいいんでしょうか?
mysqlの設定ファイル my.cnf に
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake
を追記し、新規にデータベースを作成したりテーブルを作成した場合は文字化けしないのですが
WindowsXPにインストールしたmysqlのデータを
mysqldump -u root -p[rootのパスワード] [DB名] > db.sql
等とエクスポートしたファイルをLinuxのシェルで
mysql -u root -p[rootのパスワード] [DB名] < db.sql
すると show full columns from [テーブル名] 等とすると
[レコード名] | varchar(30) | sjis_japanese_ci
と表示され、utf8になってない事が分かります。コレをutf8にすれば文字化けしないはずなのですが
(新規に作成したテーブルだとutf8になっていますので) どうすれば変更できますか?
alter table [テーブル名] default character set=utf8
を実行してコマンドは成功したみたいなのですが、実際に確認してみても変わりません。
alter table [テーブル名] default character set=utf8;
Query OK, 10 rows affected (0.01 sec)
Records: 10 Duplicates: 0 Warnings: 0
↑成功しているように見えるのに変化しません・・・。どうすればいいんでしょうか?
レプリケーションで2つの同期するテーブル構成を少し変えたいのですが可能でしょうか?
以下のような構成にしてDB2(スレーブ)はselect専用にしたいです。
update,insertはDB1(マスター)で更新というかたちです。
DB1
-------------------------
seq title body body2 date
primary key seq
-------------------------
DB2
-------------------------
seq title body body2 date
primary key seq,
index title,
fulltext body,body2
-------------------------
以下のような構成にしてDB2(スレーブ)はselect専用にしたいです。
update,insertはDB1(マスター)で更新というかたちです。
DB1
-------------------------
seq title body body2 date
primary key seq
-------------------------
DB2
-------------------------
seq title body body2 date
primary key seq,
index title,
fulltext body,body2
-------------------------
レプリケーションでマスターとスレーブの同期をとるためのコマンドLOAD DATA FROM MASTER
があったけど、今使えないっつうか、廃止予定らしい。
レプリケーションで新しくスレーブ足してマスタースレーブのデータの同期を取るのはどうすりゃいいの?
一旦マスターとめてデータのバックアップをスレーブでリストしないとだめ?
それともマスター動かしたまま、とりあえずバックアップとってスレーブでリストア、
あとはレプリケーションうごかすと、バイナリログでそのうちマスターとスレーブが同期する?
難しくてわかんないよぉ
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
みんなの評価 : ☆類似してるかもしれないスレッド
- MySQL 総合 Part12 (1001) - [94%] - 2008/1/30 17:34 ○
- MySQL 総合 Part13 (996) - [94%] - 2008/6/10 21:02 ☆
- MySQL 総合 Part24 (1010) - [94%] - 2015/2/14 4:46
- MySQL 総合 Part15 (1001) - [94%] - 2009/4/20 12:15 ☆
- MySQL 総合 Part17 (1001) - [94%] - 2010/6/10 20:47 ○
- MySQL 総合 Part18 (986) - [94%] - 2011/1/17 15:46
- MySQL 総合 Part19 (982) - [94%] - 2011/6/9 2:33
- MySQL 総合 Part26 (860) - [89%] - 2023/2/2 9:30
- MySQL 総合 Part20 (995) - [89%] - 2011/10/17 4:48
- MySQL 総合 Part21 (1001) - [89%] - 2011/12/25 22:16
- MySQL 総合 Part22 (1001) - [89%] - 2012/7/10 16:45
- MySQL 総合 Part23 (992) - [89%] - 2013/8/11 17:00
- MySQL 総合 Part25 (947) - [89%] - 2017/6/18 6:30
- MySQL vs PostgreSQL Part2 (941) - [31%] - 2022/5/26 1:30 ○
トップメニューへ / →のくす牧場書庫について