Community journal

The latest from the MySQL community

Ideas, releases, practical guides, and perspectives from the people building with MySQL.

Follow the feed
Showing entries 841 to 850 of 3187 « Previous | Next »
innotopにmy.cnfや.mylogin.cnfを食わせる方法

TL;DR

  • 何も設定しなくても食うけど、 [client] セクションしか読んでくれないので「読んでない」と思われることが多いっぽい
  • それ以外のセクションを食わせるためには ~/.innotop/innotop.conf に記述が必要だけど割と簡単だよ

innotop はPerl5製で DBD::mysql を使っているので、デフォルトファイルの読み込みは mysql_read_default_file と mysql_read_default_group あたりに影響を受ける。 …と思って探してみれば割とさっくり見つかって、

  • …
[さらに読む]
3つの「れいわ」がMySQLにちゃんと入るか確認しといた

https://qiita.com/tfukumori/items/959ed9c751734b73675fで上がってた話をMySQLで一応調査してみた。

やったこと

https://qiita.com/tfukumori/items/959ed9c751734b73675f であがってた文字コード「U+4EE4」と「U+F9A8」、あと「U+32FF」はいずれもMySQLに入れても大丈夫だよね?文字化けしないよね?(U+32FFは今は保留)という検証。

カラムの型

  • char
  • varchar
  • text

の3つで試した。

また、 …

[さらに読む]
MySQL 8.0 Functional Key Parts

MySQL8.0の機能を調べてまとめている。 Functional Key Partsについて読んだまとめ。

dev.mysql.com

MySQL 8.0.13から関数index(functional key parts)がサポートされる。
5.7以前ではカラムの値そのものかカラムのprefixでしかindexを作成することができなかったが、8.0.13からはテーブルに直接入っている値以外でもindexを作成することができるようになる。

  • マルチカラムインデックスでは関数インデックスと通常indexを混在して指定できる
  • ASC, DESC指定は関数インデックスでも可能
  • PKに指定できない
  • PKがない場合 …
[さらに読む]
そのvarchar型のカラムに入っている値が数字だけかどうかを確認する方法

TL;DR

  • なんか SELECT * FROM t1 WHERE CONCAT('',c1 * 1) != c1 であぶりだせるらしいけどなんで? と聞かれたのでその解説。
    • 俺は↑のやり方初めて聞いた。。
  • 個人的には WHERE c1 NOT RLIKE '^[0-9][0-9]*$' でいいんじゃない? と思う。

前提(?) 「数値しか入らないはずのカラムに文字列が入っていてバッチが転けてるので削除しました」
「?? カラムの型は?」
「varchar型です」
「ちょwww」 こんな状態

mysql57 8> SELECT num FROM t1;
+----------------------+
| num |
+----------------------+
| 1 |
| 2 |
| 3 |
| 4 |
| \(^o^)/オワタ |
| 0x12345 …
[さらに読む]
mysql コマンドを使ってシェルスクリプトを綺麗に書くコツ

mysql コマンドは -e で実行するSQLを指定できる。
セミコロンで区切れば複数のSQLを同時に実行することもできる。

$ mysql -e 'select 1; select 2'
+---+
| 1 |
+---+
| 1 |
+---+
+---+
| 2 |
+---+
| 2 |
+---+

-e を複数指定して、これでもいける。複数行に分けて書く時に自然。

$ mysql -e 'select 1;' \
>       -e 'select 2'

-e で指定した文字列を単に結合して実行しているようで、セミコロンをなくしてしまうと文法エラーになる。

$ mysql -e 'select 1 ' \
>       -e 'select 2'
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for
…

[さらに読む]
mysql コマンドを使ってシェルスクリプトを綺麗に書くコツ

mysql コマンドは -e で実行するSQLを指定できる。
セミコロンで区切れば複数のSQLを同時に実行することもできる。

$ mysql -e 'select 1; select 2'
+---+
| 1 |
+---+
| 1 |
+---+
+---+
| 2 |
+---+
| 2 |
+---+

-e を複数指定して、これでもいける。複数行に分けて書く時に自然。

$ mysql -e 'select 1;' \
>       -e 'select 2'
…

[さらに読む]
MySQL 8.0 Descending index

MySQL8.0の機能を調べてまとめている。
Descending indexについて読んだまとめ。

dev.mysql.com

MySQL 8.0では、Descending index(DESC, 降順のindex)がサポートされるようになった。 これまではASC(昇順)のindexを逆順にスキャンすることはできたが、パフォーマンス上のペナルティがあった。 Descending indexを使うことで、降順のアクセスでも正順でスキャンすることができる。 optimizerはDESCを含むマルチカラムindexであってもコストを考慮してこれを利用してくれる。

サンプル

c1, c2カラムにasc, descの組み合わせでカラムを作った。
index名はasc, descの頭1文字をとってaかd

mysql> …
[さらに読む]
MySQL 8.0 Invisible indexes

MySQL8.0の機能を調べてまとめている。
invisible indexesについて読んだまとめ。

dev.mysql.com

MySQL 8.0からはinvisible indexesがサポートされる。

invisible indexはoptimizerに使われないindexのこと。 optimizerから見て、visible(利用可能)かinvisible(利用不可)かを選択できるようになった。 invisible indexを利用することで、indexを削除しても影響がないかを確認することが容易になる。
これは結構ありがたい機能で、行数が多かったり、更新頻度が高いテーブルではindexの削除・作成は非常にコストがかかるし、下手にindexを外すとクエリをつまらせてサービスダウンになることもある。

…

[さらに読む]
MySQL 8.0 Derived Table, Lateral Derived Table

MySQL8.0の機能を調べてまとめている。 Derived Table, Lateral Derived Tableについて読んだまとめ。

DERIVED TABLE

LATERAL DERIVED TABLESや8.0の新機能を説明する前に、DERIVED TABLEについて説明する

dev.mysql.com

DERIVED TABLEとはFROM句のscope内で作るテーブルのことで、例えばFROM句に書いたサブクエリのSELECT等がある。 構文としては以下で、

SELECT ... FROM (subquery) [AS] tbl_name [(col_list)] ...

JSON_TABLE()関数によってJSONカラムからderived tableを作ることもできる

SELECT * FROM JSON_TABLE(arg_list) [AS] tbl_name ...

このとき、

  • …
[さらに読む]
NOT NULL指定しないとカラムの確保するストレージサイズが1byte増える

NULLを許容するカラムをつくるとそれぞれのカラムで必要なストレージサイズが1byte増えていた。

以下はexplainでkey長を見てみた様子。 INTは4byteを確保する訳だけど、NULL (DEFAULT NULL)指定したら各カラムで1byte増えているのがわかる。

NULLABLEかの判定に1bit使っていて、丸められて1byte使っているとしたらNULLABLEなカラムがN個あるとして(N/8+1) byte余計に使うかと思ったらそれぞれのカラムで1byte増えてた。。。(idx8, idx9はその境界値が出たりしないかと思って作った)

mysql> CREATE TABLE `t7` (
    ->   `id` int NOT NULL AUTO_INCREMENT,
    ->   `c1` int DEFAULT NULL,
    ->   `c2` int DEFAULT NULL,
    ->   `c3` int DEFAULT NULL,
    ->   `c4` int DEFAULT NULL,
    ->   `c5` int DEFAULT NULL,
    ->   `c6` int DEFAULT NULL,
    ->   `c7` int DEFAULT NULL,
    ->   `c8` …
[さらに読む]