Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQL 意外と簡単!グループ連番を検索結果に付番する方法!

特に連番がないテーブルに意図的に連番を振りたいってこと、日々の運用で結構あったりませんか?以外と簡単にSQLでそれを実現できます!!!

f:id:hit10231023:20180309104332j:plain

サンプルデータについて

例えば以下のようなテーブルがあり、これを題材にやってみたいと思います

mysql> DESC login ;
+---------+------------+------+-----+-------------------+-------+
| Field   | Type       | Null | Key | Default           | Extra |
+---------+------------+------+-----+-------------------+-------+
| userId  | bigint(20) | NO   | PRI | NULL              |       |
| loginAt | datetime   | NO   | PRI | CURRENT_TIMESTAMP |       |
+---------+------------+------+-----+-------------------+-------+
続きを読む

スゴ技! MySQLでレコードの異なる日時の差(引き算)を求めるSQL

やってみたら、かなり私には、高度すぎて死にかけました。

やりたいことは、

MySQLで同列の異なる行と行の引き算をSQLで書くとこうなるってことです。

やってみたいことを文書で表すと、ユーザーのログインは前回のアクセスからどれくらいの感覚でログインしているのかを算出する場合、SQLでそれをどのように表現するかって感じになるのかなというのを試して見ました

f:id:hit10231023:20180309104332j:plain

サンプルデータについて

例えば以下のようなテーブルがあり、これを題材にやってみたいと思います

mysql> desc login ;
+---------+------------+------+-----+-------------------+-------+
| Field   | Type       | Null | Key | Default           | Extra |
+---------+------------+------+-----+-------------------+-------+
| userId  | bigint(20) | NO   | PRI | NULL              |       |
| loginAt | datetime   | NO   | PRI | CURRENT_TIMESTAMP |       |
+---------+------------+------+-----+-------------------+-------+

で、以下のようなデータが入っているものとします。ユーザーIDは、1,2,3とあり、それぞれログインの間隔が異なるものとします。 loginAtはログインした日付がはいっており、useridと、loginAtのセットで、primaryキーだとします。 つまり、同じユーザーidで複数、ログイン日付が入っていると想像してください

続きを読む

なければINSERT、あればUPDATE(ON DUPLICATE KEY UPDATE)

レコードがなければINSERT、あればUPDATEなどどいう超便利なSQL構文があります

ON DUPLICATE KEY UPDATE

オプションがそれなのですが、

結構便利です、今回 MariaDBで試しておりますが、MySQLでもおそらく同様にいけると思います。

f:id:hit10231023:20180309104332j:plain

続きを読む

MySQL 集計結果を横倒しで出すSQL

かなり無理やりだけど、集計の結果を横倒しで表示するサンプルSQLです。 かなり、無理やりですが笑

f:id:hit10231023:20180309104332j:plain

こんなデータを。。。

+------------+------+
| wdate      | cnt  |
+------------+------+
| 2014-01-21 |    1 |
| 2014-01-22 |   20 |
| 2014-01-23 |   10 |
| 2014-01-24 |    4 |
| 2014-01-25 |   15 |
| 2014-01-26 |   18 |
| 2014-01-27 |    5 |
| 2014-01-28 |    2 |

このような結果にしたい

+------+------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| YYYY | MM   | day1 | day2 | day3 | day4 | day5 | day6 | day7 | day8 | day9 | day10 | day11 | day12 | day13 | day14 | day15 | day16 | day17 | day18 | day19 | day20 | day21 | day22 | day23 | day24 | day25 | day26 | day27 | day28 | day29 | day30 | day31 |
+------+------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| 2014 |    2 | 1715 | 2540 | 2710 | 1577 | 1461 |  912 |  680 | 1033 |  631 |   629 |   552 |   364 |   309 |  1309 |  2509 |  1567 |   880 |   622 |   576 |    51 |     0 |     0 |     0 |     0 |     0 |     0 |     0 |     0 |     0 |     0 |     0 |
+------+------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+

そんなSQLを書いております

続きを読む

python3 のrequest.args.getでUnicodeEncodeErrorが出た時の対処方法

ここで書いていることって、現役エンジニアの人にしてみればちゃんちゃらおかしい話なんだろうな、なんてことをいつも思いつつも、今日もメモします。

python3でのgetでこんなエラーが出てしまいハマりました。

問題のgetはこちら

word = request.args.get('word')

とにかく、日本語が通らないのでなんだこりゃって感じで苦戦すること2時間。。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 12-13: ordinal not in range(128)

とか

AttributeError: 'str' object has no attribute 'decode'

とかです。日本語がなんかダメなんですよね。。。というところまではわかったのですが、これの対策の苦戦した話のメモになります

f:id:hit10231023:20180302202040p:plain

続きを読む

python3 ヒアドキュメント で一部変数展開をする

python3でのヒアドキュメントで、一部変数が入っていた場合の置き換え方法をメモ あ、ヒアドキュメントを利用して、かつ、変数展開をするっていう、題名通りのメモです汗

ソースはこんな感じになりました。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():

  _text = '''
text1 : {_text1}
text2 : {_text2}
    '''.format(_text1 = 'テキスト1',_text2 = 'テキスト2').strip()

  print(_text)


if __name__ == '__main__':
    main()

f:id:hit10231023:20180302202040p:plain

続きを読む

知ってた!?MySQL5.6以上から日本語全文検索ができるようになったってこと・・

MySQL5.6~ で日本語全文検索ができるぞ!!!

f:id:hit10231023:20180309104332j:plain

最近MariaDBばかりやっていて、MySQLの存在を忘れていたのですが、今まで英語しか利用できなかったのに、いつの間にか標準で日本語全文検索ができるようになっていたので、久しぶりに触って見ようと思います。これがまた、意外に簡単!だったので、その設定/実装方法をできるだけ簡単に紹介したいと思います

全文検索とは

あれですね。通常テーブルに設定するカラムの索引ではなく、行全体に対して、インデクシングをする設定といえばいいのかしら

ウィキペディアで見るとこんな感じで書かれております

複数の文書(ファイル)から特定の文字列を検索すること。「ファイル名検索」や「単一ファイル内の文字列検索」と異なり、「複数文書にまたがって、文書に含まれる全文を対象とした検索」という意味

データベースでいうところの、複数カラムにまたがったカラムの中の全文を対象にした検索って言い方になると思います。僕的には、「索引を設定できない大きなサイズのカラムも全文検索索引でさくさく検索できる」と言った意味合いで利用しております。(ざっくりすぎですみません・・)

過去のMySQL、いや、Mariaもそうなのですが、昔から全文検索自体の機能はついていたのですが、こと日本語の全文検索になると。Mroonga等、サードパーティーのエンジンを入れる必要がありました。入れるまでは良いのですが、その後の運用保守が結構めんどくさい ・・いや、、Mroongaが使いづらいという話ではなくて、私自身が、複雑な構成をとっていたため、RDBMS本体のバージョンアップ等が大きな壁になっていたんですね。

今回は、日本語全文検索が標準で実装される!!これは大きいと思います。

索引文字列の抽出方法について

MySQLの抽出のデフォルトは、N-Gramになります、N-Gramは、検索対象を単語単位ではなく文字単位で分解し、後続の N-1 文字を含めた状態で出現頻度を求める方法です。インデクシングの速度は速いですが、サイズがでかくなることと検索のノイズ、そして検索速度が遅いというデメリットがあります。しかしながら、単語辞書が必要ないという利点があり、比較的導入しやすいと思います。

実装

前置きはさておき、実装を検討してみます。

続きを読む

MySQL 日時表記を数字のみで表す

現在日時を、YYYY-MM-DD の形式で表示されることがもっとも普通なのですが笑、時と場合によって、日付を8桁の数字のみで表したいとかありますよね。そんな時は、DATE_FORMATでやっちゃえばいいんです。

f:id:hit10231023:20180309104332j:plain f:id:hit10231023:20180309103851j:plain

続きを読む

python3 json.loadsでjsonを読み込み、for ループで特定の要素を抜き出すサンプル

通常でよく使いそうなので、python3でのjsonの読み込み、取得したjsonをforループ処理にて、一部の要素の参照するという、まぜまぜのサンプルを作って見ました。

サンプルでは、このあたりを中心に書いてますー

辞書型変数の参照( for xx in yy:) 、 json.loads および urllib.request 

f:id:hit10231023:20180302202040p:plain

続きを読む

python3から、MySQLのストアドプロシージャをCALLする

python3でコードを書いているうちに、MySQLに関わる部分のソースが煩雑になってしまうため、ビジネスロジックは、全て、MySQLのストアドプロシージャにまかせるってことでこんなに綺麗なソースじなります。(あくまでも個人的な主観ですが)

なお、python3でのMySQLライブラリは、MySQLdb を利用しています

f:id:hit10231023:20180302202040p:plain f:id:hit10231023:20180309104332j:plain

続きを読む

python3でapiサーバを作る!!(笑)

開発の人に見せたらすごく笑われてしまいますが、ちょっと勉強用のため、ここにメモを残しておきます。

サンプルは、python3でMySQLからSELECTした結果をjsonで返すものです。自分的にapi (笑)的なもの

  • port 5000番で待ち受けます
  • port 8080から上記をCALLします

ってな感じで汗

仮に、port:5000 を apiサーバとしてw port: 8080 をCALL側として書いた例です

うーん、、プログラムってむずい。。。

f:id:hit10231023:20180302202040p:plain

続きを読む

aws s3のファイル大量削除は、ライフサイクルルールでやりましょう!

awsバケットの削除、もしくは、フォルダの中身の削除、s3のコンソールからでも行えるのですが、この中身が大量にあると一苦労。あっさり消えてくれません。もしくは、webのセッションがタイムアウトしてしまって、作業時間の無駄になってしまいますw

ここは、もっと効率よく、ライフサイクルルールで大量削除を実施しましょう!ただし、取り扱い注意!!

f:id:hit10231023:20180309123622p:plain

続きを読む

S3のコスト削減は、ストレージクラスの一括変更で!

S3のコストを下げよう!

利用していない、S3のデータ、そのまま保存しておいても課金されているのはご存知だと思います。もちろん、まったく使わないのであれば、削除しても構わないのですが、もしかしたら、いつか使うかも?とかいうケースって結構ありますよね?

ちなみに、S3に入っているデータを、とりあえず、別の環境にバックアップしておこう!なんて考えたりもすると思うのですが、ちょっとまってください。データ転送料というトラップがありますので、そう簡単にはいきません。

じゃあ、現在の設定は維持しつつ、ストレージの管理コストを下げましょうよってことで今回、s3 ストレージクラス変更の変更をしてみたいと思います。

f:id:hit10231023:20180309123622p:plain

続きを読む

AWS EC2 インスタンスタイプの変更でハマりました。ENAってなんだ??

インスタンスタイプを変更したら、ec2が起動しなくなった(汗

もともとの、VPCのNATインスタンスとして利用しておりましたが、いつの間には、m5インスタンスなるものが出ているじゃないっすか?汗 しかも、安い!!

m4.Xlarge : 月コスト: $146.40 最大帯域: 791 Mbits/sec m5.large
月コスト: $70.28 最大 10 Gbps

コストパフォーマンスの観点から、ことネットワークの帯域が大きく、かつ、コストが下がるってことを理由に、m4.Xlarge から m5.Largeにインスタンスタイプを切り替えてみようともくろみ、さて起動しようとしたら、なんかエラーで出て起動でないって、、あわわ。。

f:id:hit10231023:20180309123622p:plain

Enhanced networking with the Elastic Network Adapter (ENA) is required for the 'm5.large' instance type. Ensure that your instance 'i-xdsdsxddddd' is enabled for ENA.

インスタンス切り替えるのはいいけど、ENA有効になっている?って怒られて起動しなくてビビりました。そもそも、ENAって何?笑

ENA

次世代ネットワークドライバってやつらしい。

EC2 インスタンス向けの次世代ネットワークインターフェイス、Elastic Network Adapter (ENA) を導入

まあ、全然読んでないのですが、ネットワークの帯域太くできるよって意味だと思うので、現行のm4.Largeはそれが対応していないってことなのかな? ってなわけで、これをENA対応する設定を試してみたいと思います

続きを読む