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

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

2
MySQLインデックスのメンテナンス
MySQLでインデックスを維持して断片化を防ぎ、いくつかのクエリの実行を何らかの方法で最適化する方法について、多くの調査を行いました。 テーブルで使用可能な最大スペースとデータとインデックスで使用されるスペースの比率を計算する式に精通しています。 しかし、私の主な質問はまだ答えられていません。おそらく、これはSQL Serverでのインデックスのメンテナンスに精通しているためであり、MySQLでもそれはある程度似ているはずだと思う傾向があります。 SQLサーバーでは、いくつかのインデックスを設定でき、それぞれに異なるレベルの断片化を設定できます。次に、1つをピックアップして、残りに影響を与えることなく、その特定のインデックスで「REORGANIZE」または「REBUILD」操作を実行できます。 私の知る限りでは、このような「テーブルの断片化」はなく、SQL Serverは「テーブルの断片化」を修正するためのツールを提供していません。それが提供するのは、内部および外部の断片化だけでなく、インデックスの断片化(インデックスによって使用されるページ数とそのページの完全性と連続性の間の比率のように理解される)をチェックするツールです。 少なくとも私にとっては、そのすべてを理解するのは非常に簡単です。 MySQLでインデックスを維持する番になると、前述のように「テーブルの断片化」の概念しか存在しません。 MySQLのテーブルには複数のインデックスを含めることができますが、その有名な式で「断片化率」を確認すると、各インデックスの断片化が表示されず、テーブル全体が表示されます。 MySQLでインデックスを最適化したい場合、(SQL Serverのように)操作する特定のインデックスを選択しません。代わりに、テーブル全体で「OPTIMIZE」操作を実行します。これは、おそらくすべてのインデックスに影響します。 MySQLでテーブルが最適化されると、データ+インデックスVS全体のスペースによって使用されるスペースの比率が減少します。これは、ハードドライブでのある種の物理的な再編成を示唆し、物理スペースの減少につながります。ただし、インデックスの断片化は、物理的なスペースだけでなく、挿入と更新によって時間の経過とともに変更されたツリーの構造に関するものです。 最後に、InnoDB / MySQLにテーブルを取得しました。このテーブルには、300万レコード、105列、55インデックスがあります。2.1GBのインデックスを除いて1.5GBです。 このテーブルは、更新、挿入のために毎日何千回もヒットしています(実際にはレコードを削除しません)。 そのテーブルは何年も前に作成されており、誰もインデックスを維持している人はいません。 そこに巨大な断片化を見つけることを期待していましたが、規定どおりに断片化計算を実行すると free_space / (data_length + index_length) 断片化が0.2%しかないことがわかります。私見はかなり非現実的です。 したがって、大きな質問は次のとおりです。 テーブル全体ではなく、MySQLの特定のインデックスの断片化をチェックするにはどうすればよいですか SQL Serverのように、OPTIMIZE TABLEは実際にインデックスの内部/外部断片化を修正しますか? MySQLでテーブルを最適化すると、実際にテーブルのすべてのインデックスが再構築されますか? (ツリー自体を再構築せずに)インデックスの物理スペースを減らすと、実際にパフォーマンスが向上すると考えるのは現実的ですか?

3
ヘッダー付きのCSVファイルからテーブルを作成する
指定したCSVの内容のみに基づいて新しいMySQLテーブルを生成する方法を探しています。私が使用するCSVファイルには、次のプロパティがあります。 「|」区切られた。 最初の行は列名(ヘッダー)を指定し、 "|"も指定します 区切られた。 列名と順序は固定されていません。 列の数は固定されていません。 ファイルのサイズが大きい(1 mil行/ 50列)。 Excelではこれはすべてかなり単純ですが、MySQLではそうではありません(Googleでは運がありません)。私が見ているべきものについて何か提案はありますか?
12 mysql  csv  import  bulk 

3
外部キー制約を変更するために必要な最小限の特権は何ですか?
外部キー制約を変更するために必要な最小限の特権は何ですか? MySQL 5.5.41がこのバグを修正した後、移行スクリプトが機能しなくなりました。 InnoDBは、ユーザーに十分な権限がない親テーブルを参照する外部キーの作成を許可しました。バグ#18790730) 私はこのエラーを受け取ります: SQLSTATE [42000]:構文エラーまたはアクセス違反:1142 REFERENCESコマンドがテーブル 'core.users'のユーザー 'foo' @ 'localhost'に拒否されました(SQL:変更テーブル `user_baz`が制約user_baz_user_id_foreign外部キー(` user_id`)を参照しています)更新カスケードの削除カスケードの `core`.`users`(` id`)) つまり、権限を修正する必要があります。必要な最低限の特権は何ですか?
12 mysql 

2
MySQL-それ自体を参照する外部キー制約を持つ行を削除します
ユーザーが私のウェブサイトに投稿したすべてのフォーラムメッセージを保存するテーブルがあります。メッセージ階層構造は、入れ子集合モデルを使用して実装されます。 以下は、テーブルの単純化された構造です。 Id(主キー) Owner_Id(IDへの外部キー参照) Parent_Id(IDへの外部キー参照) nleft そろそろ nlevel これで、テーブルは次のようになります。 + ------- + ------------- + -------------- + ---------- + ----------- + ----------- + | Id | Owner_Id | Parent_Id | nleft | nright | nlevel | + ------- + ------------- + -------------- + ---------- + ----------- + ----------- + | 1 …

3
MySQLにすべてのインデックスを強制的に強制するにはどうすればよいですか?
FORCEインデックスに関する記事を読みましたが、MySQLを強制的にIGNORE ALLインデックス化するにはどうすればよいですか? 試しましたがSELECT * FROM tbl IGNORE INDEX(*)、うまくいきませんでした。 なぜ私(および他の人)がこれを行う必要があるのか​​については、たとえば、次のようにtldでリファラー統計を要約する必要がありました。 SELECT count(*) as c, SUBSTRING ( domain_name, LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2 ) as tld FROM `domains_import` IGNORE INDEX(domain_name) GROUP BY tld ORDER BY c desc LIMIT 100 ...しかし、私は常に定義されているインデックスを確認するか、Explainを使用してどのインデックスを使用するかを決定する必要があります。単に書いてIGNORE INDEX ALL、気にしないのは非常に便利です。 誰かが構文やハックを知っていますか?(MySQL定義テーブルを介した数十行は、実際にはショートカットではありません)。 チャットディスカッションから追加: Bechmark: インデックスなし= 148.5秒 インデックス= 180秒で、まだデータの送信で実行中SSDアレイは非常に強力であるため、データキャッシュはほとんど気にしません... ベンチマークの定義: CREATE …
12 mysql  index  mysql-5.6 

4
ID列の再シード:必要な場合
大学(私は学生です)での最後のレッスンの1つで、講師から、データベース(必要に応じてMySQLサーバー)と、データベースをデータソースとして使用する小さなクライアントアプリを開発するように依頼されました。 要件の1つは、ID列(すべてのテーブルのPK)が連続している必要があることです。つまり、テーブル行が削除された場合、そのPKは後続の挿入で再利用する必要があります。RDBMS、PK、およびID列に関する平均的な知識があります。私が理解していることから、そのID列は、行を挿入するときにDBがPKを自動生成できるようにするための手段にすぎません。また、ID列の値は、(自然キーではない限り)行属性とは一切関係しません。 この要件(厳密に連続したID列)は私には不審でした。IDがシーケンシャルでない(削除によるギャップがある)場合、何が悪いのかを講師に尋ねてみましたが、「ユーザーにとっては便利であり、データベースを保守するDB管理者にとっては便利」という非常に抽象的な回答を得ました。具体的な例はありません。「ユーザーにとって便利」という議論は、ビジネスドメインでは何の意味もないため、ばかげているように思われます。 したがって、これらの理由が本当かどうか知りたいのですが。ID列を再シードする必要がある場合、つまりIDスペースが使い果たされた場合の1つだけを考えることができます。ただし、これは、ID列のタイプが誤って選択された場合int、bigintつまりuniqueidentifierテーブルに10億行が含まれている代わりに、または単純である場合に、より設計上の問題になります。ID列がクラスター化インデックスであるとします。ID列のギャップがインデックスのパフォーマンスに影響を与える可能性はありますか?多分私が知らない削除ごとに自動ID列が再シードされる実際の理由は他にもありますか? 前もって感謝します!

2
異なる属性セットを持つことができるエンティティタイプをモデル化する方法は?
ユーザーとアイテムの間に1対多(1:M)の関係を持つデータベースを再作成するときに問題が発生します。 これはかなり簡単です、はい。ただし、各アイテムは特定のカテゴリ(たとえば、Car、Boat、Plane)に属しており、各カテゴリには特定の数の属性があります。 Car 構造: +----+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | +----+--------------+--------------+ Boat 構造: +----+--------------+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | Attribute #3 | +----+--------------+--------------+--------------+ Plane 構造: +----+--------------+--------------+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | Attribute #3 | Attribute #4 | +----+--------------+--------------+--------------+--------------+ …

5
ファイル/var/lib/mysql/user.lower-testを作成できません
MySQLデータベースは、数か月間問題なく使用されてきました。今日、Synaptic Package Managerを使用してアップグレード可能なパッケージを確認したところ、さまざまなMySQLコンポーネント(-common、-client、-serverなど)が思い付きました。したがって、アップグレードすることに決めました(インストールしたバージョンを書き忘れていましたが、5.6.21だったと思います)を5.6.25-1-ubuntu2.0にアップグレードしました。その後、データベースのクエリを実行すると、次のメッセージが表示されました:- Error occured: Can't connect to MySQL server on '127.0.0.1' (111) その後、サーバーが稼働していないことがわかりました。ログファイルで、次のメッセージが好きです。 Can't create file /var/lib/mysql/user.lower-test 私は1時間ほどオンラインで検索しており、この問題は以前に報告されていましたが、「更新後」の問題のコンテキストでは見ていなかったため、次のステップがわかりません。
11 mysql  linux 

2
INSERT INTOで新しく作成された宛先テーブルの後にROLLBACKが機能しない
私は、CSVファイル(customers.csv)をMySQLテーブル(customers)にインポートするPHPスクリプトに取り組んでいます。 mysqlテーブルにCSVファイルの内容を挿入する前に、最初に元のcustomersテーブルをバックアップしています。 mysqlトランザクションでインポートプロセス全体(バックアップを含む)をラップしています(CSVが途中で破損している場合を考慮し、インポートがアトミックであることを確認するため)。 問題は、ステートメントの直後にROLLBACKを呼び出したときにROLLBACKが機能しないように見えることですINSERT INTO。phpMyAdminを介してデータベースをチェックすると、新しく作成されたテーブルとROROW INSIDE ITがroollback後も存在していることがわかります。 操作のログは次のとおりです。 [2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] [] [2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] [] [2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] [] [2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] [] [2015-01-19 14:08:50] DEBUG: "ROLLBACK" …

2
連続する各行の合計期間を見つける
MySQLバージョン コードはMySQL 5.5で実行されます バックグラウンド 次のようなテーブルがあります CREATE TABLE t ( id INT NOT NULL AUTO_INCREMENT , patient_id INT NOT NULL , bed_id INT NOT NULL , ward_id INT NOT NULL , admitted DATETIME NOT NULL , discharged DATETIME , PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; このテーブルは入院中の患者に関するものであり、入院中に各患者が時間を費やしたベッドが格納されています。 各病棟には複数のベッドがあり、各患者は同じ病棟内の異なるベッドに移動します。 目的 私がしたいのは、各患者が別の病棟に移動せずに特定の病棟で過ごした時間を見つけることです。つまり、彼が同じ病棟内で過ごした連続した時間の合計時間を見つけたいのです。 …

1
「制限1000、25」と「制限25オフセット1000」
最近、MySQLにoffset機能があることがわかりました。オフセットの結果、またはオフセットと制限バリアントの違いについてのドキュメントを探していましたが、探しているものが見つからないようです。 テーブルに10.000行あり、行1.000から25件の結果が必要だとします。これまでのところ、私は同じ結果を得るために両方を行うことができました: SELECT id,name,description FROM tablename LIMIT 1000,25 SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000 私が知りたいのは、この2つの違いです。 これは実際に同じことをするのですか、それとも私の理解は間違っていますか? 大きなテーブルでは1つ遅い/速い 変更するとオフセットの結果は変わりますかWHERE column=1(たとえば、列に100を超える異なる値がある) オフセットの結果を変更したときORDER BY column ASC(ランダムな値があると仮定して) これが「愚かな」質問であり、誰かがその主題を啓発する文書を知っている場合は、それらを返信に追加してください。 私は、オフセットがデータベースで見つかった最初のX行をスキップして、ソートと場所を無視していると感じています。
11 mysql  limits 

1
MySQL:my.cnfのbind-address 0.0.0.0が機能しませんか?
mysqlは初めてです。好きなIPを使用してMySQLサーバーに接続したい。私はmy.cnfファイルにbind-address = 0.0.0.0という行を追加するだけでよいことを読みました。それが私がしたことです。mysqlサーバーを再起動し、コマンドラインからテストしました。 mysql -uroot -p'*password*' -h 127.0.0.1 --> Works mysql -uroot -p'*password*' -h 192.168.2.4 (local ip address) ---> ERROR 1045 (28000): Access denied for user 'root'@'mguru.lnx.gr' (using password: YES) 以下のmysqldセクションの一部をmy.cnfファイルで確認できます [mysqld] user = mysql port=3306 socket = /opt/lampp/var/mysql/mysql.sock skip-external-locking key_buffer = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size …
11 mysql  my.cnf 

1
特定の時間に毎日イベントをスケジュールする
イベントを毎日00:20に実行したい。時間のスケジュールに戸惑っています。最初のオプションと2番目のオプションのどちらを使用する必要がありますか? オプション1 CREATE EVENT my_event ON SCHEDULE EVERY 1 DAY STARTS '2014-04-30 00:20:00' ON COMPLETION PRESERVE ENABLE DO # My query オプション2 CREATE EVENT my_event ON SCHEDULE AT ('2014-04-30 00:20:00'+ INTERVAL 1 DAY) ON COMPLETION PRESERVE ENABLE DO # My query
11 mysql  event 

1
なぜ自動インクリメントは、挿入された行数を超えてジャンプするのですか?
auto_incrementストアドプロシージャを使用して一括挿入を実行した後、BidsテーブルのbidIDに記録されている値に見られるこの奇妙な動作に非常に混乱しています。 INSERT INTO Bids (itemID, buyerID, bidPrice) SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice) FROM Items WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows; たとえばauto_increment、開始時にbidID値が101であり、100行挿入した場合、終了値は201ではなく213になります。ただし、挿入された行のbidIDは、最大201まで順次実行されます。 以下を確認して、 SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | …

2
MySQLは別のテーブルに対して結合するときにインデックスを使用しません
2つのテーブルがあります。最初のテーブルには、CMS内のすべての記事/ブログ投稿が含まれています。これらの記事の一部は雑誌にも掲載される場合があります。その場合、それらは雑誌固有の情報を含む別のテーブルと外部キーの関係を持っています。 以下は、これらの2つのテーブルの作成テーブル構文の簡略化されたバージョンで、いくつかの重要でない行が削除されています。 CREATE TABLE `base_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_published` datetime DEFAULT NULL, `title` varchar(255) NOT NULL, `description` text, `content` longtext, `is_published` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `base_article_date_published` (`date_published`), KEY `base_article_is_published` (`is_published`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `mag_article` ( `basearticle_ptr_id` int(11) NOT NULL, …

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