タグ付けされた質問 「mysql」

MySQLのすべてのバージョン(Microsoft SQL Serverではありません)。質問に関連する場合は、mysql-5.7のようなバージョン固有のタグも追加してください。

4
全文検索の結果、「FULLTEXT初期化」に費やされる時間が長くなります
現在、Stack Overflowのコメントのデータダンプに対していくつかのクエリを実行しようとしています。スキーマは次のようになります。 CREATE TABLE `socomments` ( `Id` int(11) NOT NULL, `PostId` int(11) NOT NULL, `Score` int(11) DEFAULT NULL, `Text` varchar(600) NOT NULL, `CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `UserId` int(11) NOT NULL, PRIMARY KEY (`Id`), KEY `idx_socomments_PostId` (`PostId`), KEY `CreationDate` (`CreationDate`), FULLTEXT KEY `Text` (`Text`) ) ENGINE=InnoDB …

3
2つの異なるテーブルからテーブルに値を挿入する方法は?
私は3つのテーブルを持っています students table ------------------------------------ id(PK, A_I) | student_name | nationality teachers table ------------------------------------ id(PK, A_I) | teacher_name | email classroom table ---------------------- id(PK, A_I) | date | teacher_id(FK to teachers.id) | student_id(FK to students.id) 教師の名前(davidたとえば)とstudent_id(たとえば)が与えられ、テーブルに基づいてテーブル7に挿入するように要求された場合、次のようにします。teacher_idclassroomidteachers insert into classroom (date, teacher_id, student_id) select '2014-07-08', id, 7 from teachers where teacher_name = …

1
バラクーダと圧縮の利点
私はMySQLのファイル形式AntelopeとBarracudaについて少し前に読んでいますが、BarracudaとCompressionを利用することで利益が得られるのではないかと考えています。 私のサーバーはMySQLのデフォルトであるため、現在Antelopeを使用しています。 私が持っている大規模なデータベースのために、メモリに関する問題が何度もありました。私のデータベースは毎日増加しています。 http://www.mysqlperformanceblog.com/2008/04/23/real-life-use-case-for-barracuda-innodb-file-format/のような圧縮は、少数の人々に利益をもたらしているようです 。 私はメモリとディスク容量が低くなることを理解していますが、これを理解しているかどうかはわかりません(記事から引用): 「トップに応じて〜5%のCPU負荷(80〜100%からほとんどI / Oを待っています) 0.01主キーによる平均検索時間(変換前の1〜20秒) データが圧縮されている場合、サーバーは元のデータを再度取得するために圧縮を解除する必要があるため、これらの2つのことは改善されないと考えました。 これは、読み取り/書き込み集中型のアプリケーションで役立ちますか?Barracuda and Compressionに変更することをお勧めしますか? バラクーダの問題を知っていますか? 次の質問の答えはいくつかの問題を指摘しているようですが、2011年からですので、今では修正されていると思います:https : //serverfault.com/questions/258022/mysql-innodb-how-to-switch -to-barracuda-format

3
MySQLインスタンスが「同期インデックスを実行中」にストールする
問題 InnoDBテーブルを持つデータベースを実行する(ほとんどの場合)MySQL 5.6.20のインスタンスは、すべてのINSERT、UPDATE、およびDELETEクエリが「クエリ終了」状態のままで、1〜4分間、すべての更新操作に対して時々ストールします。これは明らかに最も不幸なことです。MySQLのスロークエリログは、非常に些細なクエリでさえ、異常なクエリ時間を記録しています。何百ものものが、失速が解決された時点に対応する同じタイムスタンプで記録されます。 # Query_time: 101.743589 Lock_time: 0.000437 Rows_sent: 0 Rows_examined: 0 SET timestamp=1409573952; INSERT INTO sessions (redirect_login2, data, hostname, fk_users_primary, fk_users, id_sessions, timestamp) VALUES (NULL, NULL, '192.168.10.151', NULL, 'anonymous', '64ef367018099de4d4183ffa3bc0848a', '1409573850'); デバイス統計は増加していますが、この時間枠ではI / Oの負荷は過剰ではありません(この場合、上記のステートメントのタイムスタンプによると、更新は14:17:30から14:19:12に失速しました)。 # sar -d [...] 02:15:01 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util …

2
Windows7の起動時にMySQLサービスの開始を無効にする方法は?
デスクトップ(Windows 7 SP1)をオンにすると、多くの場合、2 GBまたは3 GBのメモリが既にMySQLプロセスによって占有されていることがわかります。データベースが実際にいくつかのクエリを実行する場合、データベースに必要なメモリの量は気にしませんが、それがアプリであればまだ起動していません。さらに言えば、ローカル環境でいくつかのWebアプリを開発するときに、MySQLの禁止をほとんど使用しません。 だから、この大食いを止めることは可能ですか?を介してスタートアップグループからMySQLを削除しようとしましmsconfigたが、その名前を見つけることができませんでした。 追加情報があります。 mysql Ver 14.14 Distrib 5.6.15, for Win64 (x86_64) MySQL Server 5.6 MySQL Workbench 6.0
12 mysql  windows 

2
600GBテーブルのインデックス付きキーデータ型をINTからBIGINTに変更する最速の方法
600GB MySQLテーブルでデータ型をINTからBIGINTに変更する必要があります。列には一意のインデックスがあります。私は無署名のINTで良いかもしれませんが、それを変更するか、BIGINTを変更することはほとんど同じ痛みだと思います。テーブルのエンジンはInnoDBです。簡単になるもの: 他の机 構造のコピーと INSERT INTO (SELECT *) テーブルのダンプとダンプファイルテーブル定義の変更 他に何か? 更新:要求どおり、MySQLバージョン5.5.15、外部キーなし、テーブル作成: CREATE TABLE `tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `created_at` datetime NOT NULL, `tid` bigint(20) NOT NULL, `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `f` tinyint(1) NOT NULL, `i_id` bigint(20) NOT NULL, `ir_id` …

1
CREATE TABLE…AS SELECTの主キーの自動インクリメント
を介して複雑な選択クエリを使用してテーブルを作成しましたCREATE TABLE ... AS SELECT...。このクエリに自動インクリメントの主キーを追加するにはどうすればよいですか? 例えば: create table `user_mv` select `user`.`firstname` as `firstname`, `user`.`lastname` as `lastname`, `user`.`lang` as `lang`, `user`.`name` as `user_name`, `group`.`name` as `group_name` from `user` inner join `user_groups` on (`user`.`user_id`=`user_groups`.`user_id`) left join `group` on (`group`.`group_id`=`user_groups`.`group_id`) where `user`.`lang`=`group`.`lang` このクエリは、含まれているテーブルを作成しfirstname、lastname、lang、username、group_nameコラム。id自動インクリメントの主キーである列も必要です。 このクエリを変更してこれを行う方法はありますか?このクエリを実行した後にテーブルを変更することでそれができることはわかっていますが、create tableステートメントで直接これを行う方法がある場合は、その方法を知りたいです。


6
MySQLの大きなテーブルに列を追加する方法
私はPHP開発者なので、厳しくしないでください。約5.5GBの大きなテーブルがあります。私たちのPMは、新しい機能を実行するために新しいコラムを作成することにしました。テーブルはInnoDBなので、私が試したのは: 画面ロックでテーブルを変更します。約30時間かかりました。だから止めました。最初にすべてのトランザクションを終了しなかったためにミスをしましたが、2回目はマルチロックではありませんでした。ステータスはでしたcopy to tmp table。 このテーブルにもパーティションを適用する必要があるため、ダンプを作成し、名前を変更して、同じ名前と新しい構造のテーブルを作成することにしました。しかし、ダンプは厳密なコピーを作成しています(少なくとも他の何かは見つかりませんでした)。そこで、新しい列をダンプしsedてクエリを追加しました。しかし、いくつかの奇妙なエラーが始まりました。文字セットが原因だと思います。utf-8およびfileのテーブルは、後にus-asciiになりましたsed。そのため、データの30%でエラー(不明なコマンド '\' ')が発生しました。したがって、これも悪い方法です。 これを達成し、パフォーマンスを高速化する他のオプションは何ですか(PHPスクリプトで実行できますが、時間がかかります)。INSERT SELECTこの場合のパフォーマンスはどうなりますか。 事前に感謝します。
12 mysql  innodb 

3
同じテーブルに基づくUPDATEテーブル
製品の説明を含む表があり、各製品の説明にはとがproduct_idありますlanguage_id。私がやりたいのは、すべてのフィールドをで更新し、language_idがである場所2と同じになるようにすることです。product_idlanguage_id1 これまでのところ、次のクエリを試しましたが、テーブルがサブクエリでも使用されているテーブルをMySQLが更新したくないことを示すエラーが表示されています。 UPDATE products_description AS pd SET pd.products_seo = ( SELECT pd2.products_seo FROM products_description AS pd2 WHERE pd2.language_id = 1 AND pd2.products_id = pd.products_id ) WHERE pd.language_id <> 1 MySQLのこの制限を回避する「簡単な」方法はありますか?それとも「トリック」ですか?論理的に思えるので、クエリが機能しないことに少し驚いています。
12 mysql  update 

2
すべてのリレーショナルデータと共にデータをエクスポートするツールですか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、データベース管理者のStack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 リレーショナル設計によってリンクされた他のテーブルの他のテーブルに保存されているすべてのデータとともに、テーブルの選択された行からデータをエクスポートするツールはありますか? 目的は、アドホック移行のためにサーバー間でデータのビットの移行を容易にすることです。定義された外部キーを持つMySQL InnoDBのツールを特に探しています。

1
デフォルトのcharacter_set_serverがlatin1なのはなぜですか?
私はMySQL 5.5を使用していますが、文字セットに関する変数を表示すると、 +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ …

2
innodb_flush_method = O_DIRECTとLVMディスクパーティションのあるext3のO_DSYNCパフォーマンスへの影響
私の実稼働環境の1つでは、RedHatクラスター上で2つのインスタンスが実行されており、1つの実稼働インスタンスがクラスターに関連付けられています。 インスタンス1が占有する24G InnoDBバッファープールと、インスタンス2が占有する12Gの125Gメインメモリがあり、RedHatクラスターに関連付けられていません。データとトランザクションログは両方とも、ext3ファイルシステムのあるLVMディスクパーティションにあります。 パフォーマンスの向上とI / Oスループットの向上のために、に変更innodb_flush_methodすることにしましたO_DIRECT。 MySQLドキュメントを参照して: InnoDBのデータファイルとログファイルがSAN上にある場合、に設定innodb_flush_methodするとO_DIRECT、単純なSELECTステートメントのパフォーマンスが3倍低下することがわかっています。 ハイパフォーマンスMySQL Ver 2および3を参照すると、InnoDB開発者がを使用してバグを発見したと述べていinnodb_flush_method=O_DSYNCます。O_SYNCとO_DSYNCに類似しているfsync()とfdatasync():O_SYNC一方、同期データとメタデータの両方、O_DSYNCのみ同期データ。 それがアドバイスなしで多くの説明のように思えた場合、ここにアドバイスがあります: Unixライクなオペレーティングシステムを使用しており、RAIDコントローラーにバッテリバックアップ式の書き込みキャッシュがある場合は、を使用することをお勧めしますO_DIRECT。そうでない場合は、O_DIRECTアプリケーションに応じて、デフォルトまたはおそらく最適な選択肢のいずれかです。 グーグルで、私はこのベンチマークレポートを得ました:オンO_DSYNC対O_DIRECT ベンチマークレポート: =================== 1B行の複雑なトランザクションテスト、64スレッド * SAN O_DIRECT:読み取り/書き込み要求:31560140(8766.61毎秒) * SAN O_DSYNC:読み取り/書き込み要求:5179457(1438.52毎秒) * SAN fdatasync:読み取り/書き込み要求:9445774(毎秒2623.66) *ローカルディスクO_DIRECT:読み取り/書き込み要求:3258595(毎秒905.06) *ローカルディスクO_DSYNC:読み取り/書き込み要求:3494632(1秒あたり970.65) *ローカルディスクfdatasync:読み取り/書き込み要求:4223757(1秒あたり1173.04。 ただし、O_DIRECTOSレベルのキャッシュを無効にします。ダブルキャッシュを無効にすると、I / Oスループットが向上します。 O_DIRECTよりも一緒に行くのは良いO_DSYNCですか?これら2つのオプションは少しわかりにくいです。特に本番環境でデータ、読み取り/書き込みに影響を与えることなく、I / Oスループットの向上とパフォーマンスの向上を示すオプションはどれですか?あなたの個人的な経験に基づいたより良い提案はありますか? 投稿で Rolando Updateを見ることができました: それでも、これらのパラメーターの両方にわずかな混乱があります。私が使用して生産の設定テンプレートのほとんどを見ることができた場合はO_DIRECT推薦ところ、私は任意のを見ていませんO_DSYNC。 システム MySQL 5.1.51-enterprise-gpl-pro-log Red Hat Enterprise Linux Serverリリース5.5 バッテリーライトバックキャッシュ512MBのRAIDコントローラーを搭載したDELL DRAC バッテリーバックアップユニット(BBU)を搭載したDell …

1
DELETEがSELECTよりもはるかに遅いのに、IDでDELETEするのはなぜですか?
私はかなり忙しいInnoDBテーブルを持っています(200,000行、1秒あたり数十のクエリのようなものだと思います)。バグが原因で、(同じ)無効なメールアドレスが含まれる14行を取得し、それらを削除したいと考えました。 私は単純にしようとしたDELETE FROM table WHERE email='invalid address'と、約50秒後に「ロック待ちタイムアウトを超えて」しまいました。行の列にはインデックスが付けられていないため、これは驚くべきことではありません。 しかし、私はそうしSELECT id FROM table WHERE email='invalid address'、それは1.25秒かかりました。実行DELETE FROM table WHERE id in (...)、コピー、貼り付けSELECTの結果から、IDSは、0.02秒を要しました。 何が起こっている?条件付きのDELETEが非常に遅いためタイムアウトする理由を誰かが説明できますか? ありがとう。 編集:リクエストに応じて、テーブル構造といくつかのexplain結果を投稿しました。また、このテーブルを参照する外部キーがないことにも注意してください。 しかし、状況は私には簡単に思えます。私が選択しているインデックスのないフィールドがあります。これにはテーブル全体をスキャンする必要がありますが、それほど大きくありません。idは主キーであるため、IDによる削除は非常に高速です。 mysql> show create table ThreadNotification2 \G *************************** 1. row *************************** Table: ThreadNotification2 Create Table: CREATE TABLE `ThreadNotification2` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `alertId` bigint(20) DEFAULT …

1
JDBCで明示的なコミットを無効にする、SQLで検出する、またはデータベースを読み取り専用状態にする
背景:私はhttp://sqlfiddle.com(私のサイト)に取り組んでおり、そこで悪用される可能性のある1つの手段を防止しようとしています。私が現在取り組んでいる問題について尋ねることによって、潜在的な虐待を不注意に悪化させないことを望んでいますが、あなたは何ができますか?皆さんを信頼しています。 任意のユーザーが特定のトランザクションブロック内で明示的な「コミット」呼び出しを発行することを防止したいと思います。SQL Fiddleのコンテキストから見ると、トランザクションブロックは右側のパネルで実行されるコードです。基本的に、ループしてプレーンテキストのSQLコマンドのリストを実行し、それらの変更がすべてバッチの最後に確実にロールバックされるようにします。通常、それらの変更はロールバックされますが、テキスト内に明示的な「コミット」ステートメントがある場合があるため、もちろん私のロールバックは機能しません。この明示的なコミットは、SQL Fiddleでスキーマを壊そうとするユーザーによるものである可能性が高いため、他のユーザーがエラーを確認します。 主な望ましい結果:可能であれば、JDBCレベルで明示的なコミットを無効にします。これは、複数のデータベースバックエンドベンダーをサポートする必要があるためです。もちろん、それぞれのベンダーには低レベルの癖があります。 フォールバックオプション:明示的なコミットを無効にするようにJDBCを構成できない場合、SQL Server、Oracle、MySQL、およびPostgreSQLの各バックエンドのバッチを処理中に明示的なコミットを検出するためのソリューションを利用できます。 SQL Serverの場合、このソリューションを考えました。実行する前にステートメントのXMLクエリプランを解析し、このXPathに一致するエントリの存在を確認します。 //*[@StatementType="COMMIT TRANSACTION"] これはSQL Serverでかなりうまくいくと思います。ただし、このアプローチは他のDBタイプでは機能しません。明示的なコミットに関するOracleのXML実行計画の出力は、コミットステートメントを実行しているという事実を参照していません(むしろ、コミットしているクエリから実行計画の出力を単純に繰り返します)。PostgreSQLおよびMySQLは、明示的なコミットに対して実行計画の出力(XMLまたはそれ以外)を一切提供しません。 そのため、「コミット」という単語の実際のステートメントを確認できます。これは機能しますが、可能なすべての種類のバリエーションがある場合を除きます。 declare @sql varchar(50) set @sql = 'com' + 'mit' exec(@sql); 上記はSQL Serverの例です(回避できます)が、Oracle、MySQL、PostgreSQLでも同様のことが可能だと思います。私はその仮定で間違っていますか?たぶん、彼らは「動的な」コミット文を許可しないでしょうか?Oracle、MySQL、PostgreSQLで同様のことができるかどうかを確認するために、SQL Fiddle(できればサンプルスキーマまたは他の誰かが作業している可能性のあるものではない)を自由に使用してください。そうでない場合は、単純な文字列の検出が機能する可能性があります。 さらに別の可能性 別のオプションがありました-これらのデータベースのいずれかを読み取り専用モードに設定する方法を知っている場合、そのモードでは何もコミットできませんが、それも機能します。そのモードで何もコミットできない限り、トランザクションの開始とトランザクション内でのコードの実行を許可する必要があります。それは可能ですか? 更新 私が最近学んだこと-これは実際にはPostgreSQLの問題ではありません。トランザクションブロック内で発行されたコミットは、その同じブロックが最終的に(Postgresで)ロールバックされた場合には適用されないようです。Postgresの皆さん、ありがとう! PhilのSO投稿へのリンクのおかげで、DEFERRABLE INITIALLY DEFERREDハックを使用してOracleを達成できると思います(コミットが発行されるとエラーがスローされますが、それを回避できます)。これはOracleに対処する必要があります。(ネストされたトランザクションがここで機能するかもしれないと少しの間考えましたが、Oracleがネストされたトランザクションをサポートしているようには見えませんか?とにかく、このように機能するものは見つかりませんでした)。 MySQLのソリューションはまだありません。ネストされたトランザクションを使用してみましたが、動作しないようです。右側のSELECT以外は許可しない、または各クエリの後にDBを削除/再作成するなど、MySQLのより抜本的なアプローチを真剣に考えています。どちらも良い音ではありません。 解決 したがって、SQL ServerとOracleについて説明したソリューションを実装しましたが、前述したように、これは実際にはPostgreSQLの問題ではありません。MySQLの場合、クエリパネルをselectステートメントのみに制限するというやや不幸なステップを踏んでいます。MySQLのDDLとDMLは、スキーマパネル(左側)で入力するだけです。これがあまりにも多くの古いフィドルを壊さないことを願っていますが、それは単にデータの一貫性を確保するために行わなければならないことだと思います。ありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.