私が歌川です

@utgwkk が書いている

MySQLで特定カラムの文字数順ソートにindexを効かせる

ISUCON6 予選問題の解説を読んでいたところ,

キーワードリンクが最前最長マッチを期待している関係上、CHARACTER_LENGTH 順でソートしていますが、そこをvirtual columnなり別カラムなりにindexを張るのも良いでしょう。折角MySQL5.7なので、virtural columnを使うのがオシャレです。

とあったので,具体的にどうすればいいか試してみた.

virtual column を作る

まずindexを貼る対象となるvirtual columnを作る. 普通に ALTER TABLE でカラムを追加するのに加えて AS (式) でカラムの内容を指定してやるとよい. カラムの型が必要なので適当に指定してやるとよい.TINYINT でもいい気がしたけど念のため SMALLINT にした.

mysql> ALTER TABLE entry ADD COLUMN keyword_length SMALLINT(8) AS (CHARACTER_LENGTH(keyword));

ソート用のインデックスを貼る

この時点ではまだソート用のindexは作られていないため,filesortが行われている.

mysql> EXPLAIN SELECT keyword FROM entry ORDER BY CHARACTER_LENGTH(keyword) DESC;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
|  1 | SIMPLE      | entry | NULL       | index | NULL          | keyword | 767     | NULL | 5851 |   100.00 | Using index; Using filesort |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)

結論から言うと (ソート対象のカラムの文字数を表す virtual column, ソート対象のカラム) となる複合indexを貼ってやるとよい.

mysql> CREATE INDEX keyword_length_and_keyword ON entry(keyword_length, keyword);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> EXPLAIN SELECT keyword FROM entry ORDER BY CHARACTER_LENGTH(keyword) DESC;
+----+-------------+-------+------------+-------+---------------+----------------------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key                        | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+----------------------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | entry | NULL       | index | NULL          | keyword_length_and_keyword | 770     | NULL | 5851 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+----------------------------+---------+------+------+----------+-------------+

1 row in set, 1 warning (0.00 sec)

これで文字数順ソートにindexが効くようになった.ORDER BY keyword_length としても同じ.

参考

青島ビール飲んだことない気がするので飲みたい.

今週読んだ本 - 私が歌川です

今週読んだ本

神経科学の話に終始せずにさまざまなコラムを挟みつつ,脳や器官の動作原理を教えてくれる本という感じ.まだ噛み砕いたぐらいでぜんぶは理解してないのでもうちょっと読みたい.

むかしニコニコで読んだ気がする.ツインテールの女の子になると便利.ルーツビア良かったのでそっちも読んでほしい.

ルーツビア(1) (アース・スターコミックス)

ルーツビア(1) (アース・スターコミックス)

こちらがルーツビアです.あるある多めでビールを飲みまくる話.青島ビール飲んだことない気がするので飲みたい.今週読んだ本ではない.

ISHOCON1に参加した #scouty_ishocon

scouty.connpass.com

参加させていただき,解いた.最終得点は85402点で,4位だった.

gyazo.com

:ok_man: というチームで*1参加した.

github.com

ここから先は解いたときの過程などがあり,ネタバレを大いに含みます.

*1:個人戦だがチーム名が付けられる.

続きを読む

透明なのに紅茶の味がするので脳がバグるという体験ができる.甘すぎないのでいいと思う.COMPを添えると一気にディストピア食になって便利そうだけどCOMP持ってなかった.

夏休みに読んだ本

夏休みも終わってしまいましたね.

Linuxシステム[実践]入門 (Software Design plus)

Linuxシステム[実践]入門 (Software Design plus)

Linuxシステムの構成要素や設定方法について書いてある.Linux興味あるけど何も分からないんですよねみたいな人に勧めたい.

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

HTTPがどういう情報をやり取りするプロトコルなのかが書いてある.自分が雰囲気でHTTPについて喋ってるなーと思ったら読むとよい.

文庫 思考する機械コンピュータ (草思社文庫)

文庫 思考する機械コンピュータ (草思社文庫)

「ビット表現が透けて見える」という表現かなり良いので積極的に使っていきたい.

ぱらのま 1

ぱらのま 1

この本でサンライズを知り,実際に乗った.鉄道のオタクではないが面白いと思う.

東京・金沢

9/27

大阪から乗車なので京阪に乗り,京橋で銭湯に入った.

サンライズに乗った.上り3号車なのでサンライズ出雲

B寝台を取ったところ思ったよりも快適だったし,ぱらのまで読んだ! って言いながら乗った.このあと一睡もできないため崩壊.

9/28

一睡もできず体調が終わったが到着.

渋谷.

けものフレンズがーでん(N日ぶり2度目)に行った.雨で寒すぎたのですぐに帰ってしまったが,カレーがおいしかった.帰りにデレステ広告を見ることができた.代々木だっけ?

9/29

横からようこそジャパリパークへが聞こえてきたので目が覚めた.

これ渋谷だろうなーと思っていたので見れてよかった.アニデレ2期OPでキャンディアイランドが歩いているところ.

夕方まではメトロでぶらぶらして,池袋へ向かった.

けものフレンズがーでん(1日ぶり3度目)に行った.光るわたあめ最高だったので絶対に注文してほしい.

このあともう一軒行って,北陸新幹線終電で金沢へ.北陸ロマンすき.

ゲストハウス的な宿に入ったところ,部屋が広すぎてぜんぜん寝つけなかった.

9/30

金沢をシェアサイクルで観光する作戦に出た.近江町市場→金沢城公園→兼六園21世紀美術館と回り,足が疲れてきたので駅に戻りサンダーバードで上洛.

初8番.