カテゴリー別アーカイブ: database

mysqlのネクストキーロックと挿入インテンションギャップロックのデッドロックを確認する

概要

先日mysqlを利用したアプリケーションにおいてデッドロックが発生しました。
あちゃぱーと思いつつもせっかくなので自分の中で消化しきれいなかった部分をこれを機に再確認してみることに。

この記事ではmysqlのデフォルトの分離レベル(Repeatable Read)においての レコードロック / ネクストキーロック / ギャップロック / 挿入インテンションギャップロック というハイカラな単語と結びつけながら自分なりに解釈したものを解説します。
と、赤字で書きましたが、始めに詫びを入れておきます。
ロックの解釈はドキュメントを読むだけで詳細に把握するのは非常に難しく、もしかしたら間違っていることを言っているかもしれません。そしたら本当に申し訳ありません。 続きを読む mysqlのネクストキーロックと挿入インテンションギャップロックのデッドロックを確認する


mac osx におけるファイルディスクリプタの上限

概要

mac osxでmysql5.7.11を用いてアプリケーション開発を行ったところ、特定の動作をした時点でアプリケーションが動作しなくなる現象に直面した。

mysqlのエラーログを確認してみると下記のようなエラーが出ていることが確認できた。

[Warning] File Descriptor 2032 exceedeed FD_SETSIZE=1024

開発にともなって行った「特定の動作」とはmysqlにおいて、あるテーブルにpartitioningを適用したことである。それも結構な数の。
なるほどmysqlエラーログと合わせてみてみるとその状況は察することができる。
partitioningを切ったことで、物理的に異なるファイルとしてその実態データファイル(InnoDBでいうところのibdファイル)が分離された。
mysql上でそれら実体ファイルをオープンしているfile descriptorがosの上限を上回ったのであろう。

この点について原因の調査と、対応方法をまとめる。 続きを読む mac osx におけるファイルディスクリプタの上限


mysqlにおけるvarcharのindex使用時の注意

概要

みなさんmysqlを使用していてvarcharのカラムにindexをつけることってないだろうか?
selectする際にindexが付いているカラムを対象にwhereをつけているのにindexが有効になっていない機会があり得る。
今回はそんな時に認識しておかないと、はまるかもしれない挙動について取り上げる。 続きを読む mysqlにおけるvarcharのindex使用時の注意


count(*)からinnodbにおけるindex構成を確認する

* 概要

今回はinnodbにおけるcountの高速化について検証する。

きっかけは下記のブログですが。いつもお世話になっております。

http://nippondanji.blogspot.jp/2010/03/innodbcount.html

要約すると下記のようなスキーム雨がある時

CREATE TABLE t1 (  
  a bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  b int(11) DEFAULT NULL,  
  c tinyint(4) DEFAULT NULL,  
  d date DEFAULT NULL,  
  e varchar(200) DEFAULT NULL,  
  f varchar(200) DEFAULT NULL,  
  g varchar(200) DEFAULT NULL,  
  h varchar(200) DEFAULT NULL,  
  i varchar(200) DEFAULT NULL,  
  PRIMARY KEY (a)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

下記のようなsqlを想定する

SELECT count(*) FROM t1;

このとき例えばtinyintなどにindexを貼ることで、count(*)の高速化が見込める。

innodbのcount(*)において全レコードへのアクセスが必要になることは変わりないが
これは主キー(bigint)を全走査することよりも、小さいindexを全走査するほうが効率が良いということである。

まあ頭のなかでは理解できて、予想はできているんだけどちゃんと自分の手でピコピコやりたいなというところで下記を確認する。
1. 検索速度がa,b,cで変わることを確認(参照テーブルも)
2. e,f,g,h,iがあるときとないときで検索速度がそこまで変わらないことの確認(クラスタインデックスのノードが影響を与えないこと) 続きを読む count(*)からinnodbにおけるindex構成を確認する