MySQL

【MySQL】で処理に長時間かかっているクエリを殺す方法。

60秒とか分単位で時間を喰うようなクエリを発行してしまった場合、この方法で落としてしまおう。

まずはプロセスの殺し方。

  • MySQLのプロセスIDをkillの後に指定するだけ

例)

な感じ。

プロセスリストを確認する方法。

  • 下記SQLを発行すれば実行中のプロセスを取得出来る。

もしくは

もしくは

60秒以上かかっているクエリのみを抽出する。

これで抽出されたプロセスのIDをkillで頃してやればOK。

【MySQL】で巨大なQueryをサーバーへ送りたい場合。

max_allowed_packet の設定を確認する。

my.cnfのデフォルト値は1MBなので、これを超えるサイズのクエリを送信したい場合はmax_allowed_packetの値を任意のサイズに書き換えてやればOK。 ちなみに最大サイズは16MB。下記の通り編集してやればよい。

my.cnf

この状態でサーバーを再起動すると反映される。

が、MySQLのプロセスを落とすことが許されない状況の場合、 サーバーの再起動が行えないため、MySQLにログインしSQL文を直接叩くことで対応する。

※上記は16MBに設定する際の例

正しく設定されたか確認したければ下記のSQLを叩けばOK。

【MySQL】でFULL ONTER JOINしたい場合。

MySQLでは完全外部結合(FULL OUTER JOIN)に対応していないので、
LEFT JOINとRIGHT JOINの結果をUNIONしてやることで再現してやる。

select * from table1 left join table2 on table1.id = table2.id
union
select * from table1 right join table2 on table1.id = table2.id

といった具合。

 

【MySQL】でひらがな、カタカナ、大文字、小文字、全角、半角を区別したい。

結構ハマったのでメモ。

何も考えずにカラムの照合順序を「utf8_unicode_ci」にしていた所、MySQLの有難すぎる仕様が判明。

たとえば「テスト」という文字列で特定カラムをselectすると、上記の型の場合

「テスト」、「てすと」、「テスト」、「てスト」の全てにヒットしてしまうらしい。というかヒットした。

アルファベットも同様、「ABC」を検索すると

「ABC」、「ABC」、「abc」、「ABc」がヒットし、

数値「123」の場合

「123」、「123」、「123」といった具合にヒットする。

今回はあくまでも完全一致のみを引っ張ってきてほしかったため、解決方法を探した所
カラムの照合順序を「utf8_bin」に変更すればOKとのことが判明。

変更後、無事完全一致で引っ張ることができた。

場合によってはとても便利な仕様だけどもしっかりと把握しておくべき重要なポイントだね。

 

【Mysql/Doctrine2】where句の記述順によるパフォーマンスの違い。

select時のそういった最適化は全てオプティマイザーが最適解を求めてくれているのかと思い込んでいたがどうやらそういうわけでもない模様。

下記に示す二つのDQLで大きくパフォーマンスが違う。

■パターン1

    select
        p
    from
        HogeFugaBundle:Post as p
    where
        p.body like :str
    and
        p.deletedAt is null
    and
        p.createdAt >= :date

■パターン2

    select
        p
    from
        HogeFugaBundle:Post as p
    where
        p.createdAt >= :date
    and
        p.deletedAt is null
    and
        p.body like :str

だいたいレコード25万くらいのテーブルで実験したところ、パターン1が30秒前後、パターン2が2~3秒といった結果になった。
ある意味素直に最初に指定した条件から順番に絞り込むってことだね。そりゃ25万件のlikeは重いわ。

っていうお話。

 

【MySQL】のチューニング。

良エントリを発見!

http://nick.hateblo.jp/entry/2014/01/26/183822

参考にさせていただきます。

 

【CentOS7】にMySQL5.6をインストールする。

まずwgetをインストール。
※すでに入ってる場合はいらない。

yum install wget

rpmを取得

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

実行

rpm -ivh mysql-community-release-el7-5.noarch.rpm

下記コマンドを実行して

ls -1 /etc/yum.repos.d/mysql-community*

こう表示されればOK。

/etc/yum.repos.d/mysql-community.repo
/etc/yum.repos.d/mysql-community-source.repo

インストールする

yum install mysql-server

あとは完了後にスタートさせればOK。

簡単だね。

 

【MySQL/PHP】PHPからmysqlに特定のテーブルが存在しているかを確認する。

下記のSQLを実行してリザルトが返ってくるか否かで判定すればOK。

例)
postsテーブルの有無を確認する。

show tables like posts