タグ

MySQLに関するakatakunのブックマーク (79)

  • MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.4.4 MySQL での内部一時テーブルの使用

    場合によっては、サーバーはステートメントの処理中に内部一時テーブルを作成します。 これが発生した場合、ユーザーは直接的に制御できません。 サーバーは、次のような条件下で一時テーブルを作成します: UNION ステートメントの評価 (ただし、後で説明するいくつかの例外があります)。 TEMPTABLE アルゴリズム、UNION または集計を使用するビューなど、一部のビューの評価。 導出テーブルの評価 (セクション13.2.11.8「導出テーブル」 を参照)。 共通テーブル式の評価 (セクション13.2.15「WITH (共通テーブル式)」 を参照)。 サブクエリーまたは準結合の実体化用に作成されたテーブル (セクション8.2.2「サブクエリー、導出テーブル、ビュー参照および共通テーブル式の最適化」 を参照)。 ORDER BY 句と異なる GROUP BY 句を含むステートメント、または結合

    akatakun
    akatakun 2023/11/08
    ステートメントに一時テーブルが必要かどうかを判断するには、EXPLAIN を使用し、Extra カラムをチェックして、Using temporary と表示されているかどうかを確認します
  • laravel使うならmysqlのcollation指定はutf8mb4_binにしておくべき | ++頭道++

    記事では多少laravelとからめて主にmysqlのcollationについて取り上げます。 そもそもcollationって何?というところからどのように設定にすべきかというところまで解説したいと思います。mysqlのcollationについて一般的に取り扱うので、laravelphpだけでなくアプリケーションを開発する場合に知っておくべき内容となります。 なんでlaravelとからめるの?ということですがちょうどlaravelphpフレームワークとして使用していて実際に私が直面したユースケースを取り上げるためです。 私の開発環境ではlaravel5.5を用いていましたが、laravel5.5においてはcollationを指定しなかった場合マイグレーションの仕組みによってデフォルトで utf8_unicode_ci に設定されてしまうようです。 今回はこのケースに沿って説明していきま

    akatakun
    akatakun 2019/03/22
    utf8_unicode_ci: ひらがな・カタカナ・大文字・小文字・半角・全角を同一視,utf8_unicode_ci: 大文字・小文字を同一視,基本はutf8mb4_binで必要に応じてselect文に別のcollationを指定するとかがいい
  • INSERT ON DUPLICATE KEY UPDATEの利点と注意点 - Qiita

    所属しているプロジェクトで INSERT ON DUPLICATE KEY UPDATE を使っているが、問題が起きたのでまとめておく。 起きた問題 INSERT のときだけでなく、UPDATE の処理が走った際にも、AUTO_INCREMENT が増えてしまい、AUTO_INCREMENT で更新される値が予測を超えて増加し、int型の最大値に達してしまい、データの挿入ができなくなった。 INSERT ON DUPLICATE KEY UPDATEとは INSERT しようとした時に、UNIQUE インデックス または PRIMARY KEY に重複した値を発生させるレコードが挿入されていた場合は、古いレコードの UPDATE が実行されるという構文。 使っていた状況 例えばユーザーの獲得した様々な種類のポイントとかいろんな行動のサマリなどのように、確実にレコードがあるかどうか分からない

    INSERT ON DUPLICATE KEY UPDATEの利点と注意点 - Qiita
    akatakun
    akatakun 2019/02/25
    INSERTしようとした時に、UNIQUEインデックスまたはPRIMARY KEYに重複した値を発生させるレコードが挿入されていた場合は、古いレコードの UPDATE が実行されるという構文,UPDATEの処理が走った際にも、AUTO_INCREMENTが増える
  • varcharとtextの違い(mysql innodb) - lxyuma BLOG

    mysqlの可変長文字列を扱う、varchar型とtext型の違いの話。 古い情報が混在していたので、ちょっと整理してメモ。 myisamの頃の話 sizeが違う 行の中身がdataか(varchar)、dataへのポインタか(text) 参照挟むので、performanceの違いがあった(varcharが早い) 今 net でぐぐって、ひっかかる情報の大半がこの話。 最近のinnodbの話 最大sizeは一緒。64kb(但し、TINYTEXT型、MEDIUMTEXT型、LONGTEXT型は名前の通り違う) varcharもtextも、中身は同じ仕組み(BLOB field / off page column) 行にdata入れるのも、外部(overflow page)への参照にするのも、行フォーマット次第(row format) 5.6で行formatのdefault は COMPACT

    varcharとtextの違い(mysql innodb) - lxyuma BLOG
    akatakun
    akatakun 2019/02/19
    データか参照かはrow format次第(default: COMPACT),COMPACT: データ量が小さい(768b以上)とデータとして保持,varchar: 最大文字数で指定,text: バイトで指定
  • 【MySQL】CHAR型とVARCHAR型の違い – ysklog

    両方の型とも文字列のデータを挿入するときに指定しますが、CHAR(10)とVARCHAR(10)では実際にデータを挿入した時に違いが生じます。 例えば、「A」という文字は半角英数字なので1バイトの容量を必要としますが、CHAR(10)型のフィールドに「A」を挿入した場合、消費容量は10バイトとなります。 一方、VARCHAR(10)型のフィールドに「A」を挿入した場合、消費容量は1バイト(正確には2バイト)です。 VARCHARのみ使用すればいいのでは? だとしたら、CHAR型ではなくVARCHAR型だけ使用すればいいことになりますが、CHAR型は格納するデータのバイト数に関わらずすべてのレコードで同じ容量のデータを格納するため、MySQLサーバのスピードが向上します。 しかし、CHAR(100)のように大きめのデータを格納しようとすると逆にメモリを消費することもあります。 そのため基

    akatakun
    akatakun 2019/01/29
    CHAR型はMySQLサーバのスピードが向上するがデータ長が大きくなるとメモリ消費が増える。また足りない分は空白パディングされる。
  • Illegal mix of collations MySQL Error

    I'm getting this strange error while processing a large number of data... Error Number: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€' What can I do to resolve this? Can I escape the string somehow so this error wouldn't o

    Illegal mix of collations MySQL Error
    akatakun
    akatakun 2018/12/27
    dumpしたデータ突っ込んで、DB作った場合にやりがち。
  • mysqlのバックアップ(mysqldump)のロック問題 - SEEDS Creator's Blog

    こんにちは、はらぐちです。 今回お話したいのは、mysqlのバックアップ方法についてのあれこれです。 バックアップ mysqldump mysqlのバックアップといえばmysqldumpです。 以下のような形で使います。 mysqldump -u root -p -x -A > my_dumpall.db これで全データベースのダンプができます。 特定のデータベースをダンプしたい場合は、以下のようにデータベース名を指定します。 mysqldump -u root -p -x データベース名 > dump.sql 定期的にバックアップを取りたい場合は、シェルスクリプトで以下のようなものを cronで実行してあげるといいでしょう。 二日間のバックアップを保持するスクリプト例です。 #!/bin/bash MPASS=パスワード mysqldump --defaults-extra-file=<

    mysqlのバックアップ(mysqldump)のロック問題 - SEEDS Creator's Blog
    akatakun
    akatakun 2018/12/11
    innodbならsingle-transactionオプションを付けることでロックなしでデータダンプができる
  • utf8mb4は誰がどこで決めた仕様?

    全般的におかしいので指摘を残しておきます Unicode には BMP (Basic Multilingual Plane) という概念があって https://ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 これは UNICODE 3.0 までで追加された「よく使うであろう」文字のセットのことで BMPは「文字のセット」ではありません。Basic Multilingual Planeという言葉の通り、面すなわち領域のことです。 BMPへの追加は今でも行われており、Unicode3.0までがBMP、それ以降が追加面、という区別の仕方は誤りです。 BMP にある文字は UTF-8 エンコーディングでは 3byte となります。 BMP 外の文字は UTF-8 エンコーディングで 4byt

    utf8mb4は誰がどこで決めた仕様?
    akatakun
    akatakun 2018/11/14
    BMP: UNICODE 3.0までに追加された「よく使うであろう」文字のセット,BMP外の文字は4byte,mysqlのutf8はBMPに登録されている文字だけを取り扱う代わりに、1文字3byteのディスク空間を占有するという仕様
  • nfs mount point cannot be used as volume · Issue #23839 · moby/moby

    akatakun
    akatakun 2018/10/02
    mysqlイメージはchownを実行しようとするが、nfsはnfsクライアントによるchownを許可していない,mysql imageのuserオプションで1000:1000を指定すればいける
  • 開発環境のデータをできるだけ本番に近づける - クックパッド開発者ブログ

    こんにちは。技術部の吉川です。 今回はクックパッドの開発環境構成、特に開発用データベースの構成についてご紹介します。 開発環境の構成 クックパッドのシステム環境は以下のようなフェイズに分かれています。 ※ これはcookpad.comの構成で、サブシステムや個別のサービスはその規模や特性に応じて構成が異なります。 development 開発者が実際に開発を行う環境です。クックパッドでは仮想環境は用いず、手元のマシンでRailsアプリケーションを動かして開発を行っています。 データベースはローカルではなく、開発者全体で共通の開発用データベースに接続しています。 test 手元でテストを実行する場合は、ローカルマシンのデータベースを利用します。CI(rrrspec)などの場合も同様で、テスト実行サーバーのデータベースが利用されます。 staging stagingといえば準番環境として、

    開発環境のデータをできるだけ本番に近づける - クックパッド開発者ブログ
  • Backup and restore a mysql database from a running Docker mysql container

    mysql-docker.sh ��-KV # Backup docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql # Restore cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE

    Backup and restore a mysql database from a running Docker mysql container
    akatakun
    akatakun 2018/08/28
    ローカルホストから叩いても"mysqldump: Got error: 2003: Can't connect to MySQL server on '127.0.0.1' (61) when trying to connect"だったので
  • MySQL 8.0登場!立ち止まることを知らない進化はこれからも続く。

    ゴールデンウィークはいかがお過ごしされただろうか。今年は天気も良く、行楽日和が続いたように思う。 さて、先日MySQL 8.0が正式にリリースされた。少し時間が経ってしまったが、今回はMySQL 8.0の新機能について紹介したい。コミュニティ版のダウンロードはこちらから可能だ。 ひとつ前の正式バージョンはMySQL 5.7だったのだが、MySQL 8.0は非常に大きなリファクタリングが含まれており、5.x台のバージョン番号を捨て去ろうという話があった。そこで、次のメジャーバージョンは最初の桁を増やすということになったのだが、MySQL 6.0は過去に既に存在し、買収などの騒ぎで開発が頓挫してしまった経緯がある。7.xはMySQL NDB Clusterと被っている。というわけで、5.7の7の部分の次という意味合いもあって、8.0というバージョン番号を引っさげ、満を持しての登場となった。その

    MySQL 8.0登場!立ち止まることを知らない進化はこれからも続く。
    akatakun
    akatakun 2018/07/07
    デフォルトがutf8mb4、utf8mb4_0900_ai_ci,日本語を扱いたい場合には、utf8mb4_ja_0900_as_cs_ksを利用すると良いだろう。ただしこちらはケースセンシティブなので、英語の大文字小文字を区別する点には注意して欲しい
  • pixivにおけるMySQL運用の実際

    MySQL Trend Seminar 2018 @ 福岡

    pixivにおけるMySQL運用の実際
    akatakun
    akatakun 2018/02/26
    500GBのオンメモリひえーー
  • READロックとWRITEロックがよくわからなくなるので改めて – sawara.me

    MySQLではLOCK TABLES文で明示的にテーブルにロックをかけることが出来ます。 で、いつもわからなくなるんですね。READロックとWRITEロックが。 他のスレッドからWRITE不可 他のスレッドからREAD/WRITE不可 さて、どっちがREADロックでどっちがWRITEロックか分かりますか? 単純に考えると 他のスレッドからWRITE不可 → 【WRITEロック】 他のスレッドからREAD/WRITE不可 → 【READロック】 って思うでしょう。普通。いや実はこれ不正解なんです。 「えっ?なんで?」って思いませんか。WRITEを出来なくする(ロックする)から「WRITEロック」、READも出来なくする(ロックする)から「READロック」じゃないのって。 僕だけですかね。 いつも間違えて、あれ?どっちだったけ?ってなって、毎度調べてしまっているので、今回は改めて頭に叩き込むこ

    READロックとWRITEロックがよくわからなくなるので改めて – sawara.me
    akatakun
    akatakun 2017/12/14
    自スレッド目線で考える,READするから待って: READロック(自分が読み込みするから自他スレッドともに書き込みをロック,WRITEするから待って: WRITEロック(自分が書き込みするから他スレッドの読み書きをロック)
  • ALTER TABLEを上手に使いこなそう。

    テーブル定義を変更したい。インデックスが壊れてしまったので再作成したい。そんな場合はALTER TABLEを使う。ALTER TABLEはテーブル定義を変更するお馴染みのコマンドであるが、その挙動は意外と知られていない。(エキスパートとおぼしき方々からも度々質問を受ける。)そんなわけで、今日はALTER TABLEについて解説しようと思う。 まず結論から言うと、なんとMySQLのALTER TABLEはテーブルのデータを全てコピーし直すのである。なんて無駄なことを!?と思うかも知れないが、テーブル定義(スキーマ)の変更を動的に行うには、ストレージエンジンによるサポートが必要であり、動的なスキーマ変更をサポートしているストレージエンジンはまだ少ないのである。(動的スキーマ変更をサポートしているのはMySQL Clusterぐらいだ。しかも追加だけ。)デフォルトで利用出来るMyISAMはInn

    ALTER TABLEを上手に使いこなそう。
    akatakun
    akatakun 2017/11/08
    ALTER TABLEはテーブルのデータを全てコピーし直す,読み込み専用なTL_WRITE_ALLOW_READロックする
  • MySQL with InnoDB のインデックスの基礎知識とありがちな間違い - クックパッド開発者ブログ

    こんにちは、サービス開発部の荒引 (@a_bicky) です。 突然ですが、RDBMS の既存のテーブルを見てみたら「何でこんなにインデックスだらけなの?」みたいな経験はありませんか?不要なインデックスは容量を圧迫したり、挿入が遅くなったりと良いことがありません。 そんなわけで、今回はレコードを検索するために必要なインデックスの基礎知識と、よく見かける不適切なインデックスについて解説します。クックパッドでは Rails のデータベースとして主に MySQL 5.6、MySQL のストレージエンジンとして主に InnoDB を使っているので、MySQL 5.6 の InnoDB について解説します。 InnoDB のインデックスに関する基礎知識 インデックスの構造 (B+ 木) InnoDB では B+ 木が使われています。B+ 木は次のような特徴を持った木構造です。 次数を b とすると、

    MySQL with InnoDB のインデックスの基礎知識とありがちな間違い - クックパッド開発者ブログ
  • 現場指向のレプリケーション詳説

    この文書は、技術評論社刊『WEB+DB PRESS Vol.22』に執筆した記事を技術評論社の 許可を得てWWWで公開しているものです。 このWWW版は校正前の原稿を元にしている点、WWW公開後に必要があれば修正する点で、雑誌版の文章とは異なる部分があります。また、図表も雑誌版とは異なります。 予めご了承ください。 また、この文章が対象しているのはMySQL 4.0系なので、最新のリリース版と比べると説明不足な点などが多々あると思います。 レプリケーションの基をおさえるには、この文書はまだ有益だと思いますが、設定レベルの説明は最新のドキュメントを参照するようにしてください。

    akatakun
    akatakun 2017/03/22
    REPLACE ... SELECTもしくはINSERT ... SELECT: 更新対象のテーブルのプライマリキーがAUTO_INCREMENTで、かつ、 SELECT文にORDER BYを使っていない場合に、 REPLACEもしくはINSERTされる順が不定となるため、AUTO_INCREMENTで発番されるプライマリ
  • MySQLでデータをエクスポートする - Qiita

    上記の場合DROP TABLEやCREATE TABLEが同時に作成される。これらが必要ない時は「-t」オプション

    MySQLでデータをエクスポートする - Qiita
    akatakun
    akatakun 2017/03/21
    スキーマ情報のみ、指定テーブルのみ、WHERE絞りなど可能
  • MySQL テーブルの複製(コピー)を作成する

    MySQL テーブルの複製(コピー)を作成する 2011.04.28 MySQL テーブルデータを大量に変更したり、削除するとき、テスト用にテーブルの複製(コピー)が欲しいときがある。 コピーしたテーブルに対して、 SQLを発行してうまくいったら、番用のテーブルに対して作業を行えば良い。 作業は2ステップ、作業時間は3分もかからない。気軽にテスト用のテーブルを作って色々なSQLにチャレンジできるのが嬉しい。 ■空テーブルを作成する 元テーブルと同じフィールドを持つ空テーブルを作成する。 mysql> create table books2 like books; ■データをコピーする INSERT文を実行する。 mysql> insert into books2 select * from books; Query OK, 8765 rows affected (0.26 sec) Re

    MySQL テーブルの複製(コピー)を作成する
    akatakun
    akatakun 2017/03/21
    `create table books2 like books; insert into books2 select * from books;`でOK,複数レプリケーション動かしている状態でこの方法でインサートするとバグ るから注意ね
  • MySQLに対して定期的に実行して結果を保存しておくと幸せになれるアレ - なからなLife

    ワンライナー mysql -u ユーザ -pパスワード -h 接続先 -e "SQL文" | sed -e 's/\t/\" \"/g' | sed -e 's/^/\"/g' | sed -e 's/$/\"/g' | sed -e "s/^/$(date '+%Y%m%d %H:%M:%S') /g" >> ファイル パスワードを生テキストで書くなって人はゴニョゴニョしてください。 追記:ゴニョゴニョするはなし、書きました。 MySQLで幸せになれるヤツの続き-パスワードを隠蔽する方法 - なからなLife 取りたい情報に応じて、権限が異なります。DBのroot相当の権限があるといいのですが、少なくとも「全スキーマへのSELECT」と「PROCESS」は必要になるはず。 何するやつ? MySQLにログインして、-eの後に指定したSQLを実行して、ログアウトする。 SQLの結果をパイプで

    MySQLに対して定期的に実行して結果を保存しておくと幸せになれるアレ - なからなLife