# 失敗から学ぶRDBの正しい歩き方 - https://amzn.to/4e0CqfH
# 失敗から学ぶRDBの正しい歩き方 - https://amzn.to/4e0CqfH
はじめに みなさんはDBのインデックスを正しく使えていますか? 私はなんとなく「DBのパフォーマンスを向上するためのもの」という認識はあったのですが、 どのような場面で使うものなのか、逆にどのような場面では使うべきでないのかなど 明確に理解できていませんでした。 今回はそんなインデックスについての理解を深めたいと思います。 インデックスとは インデックスとは、その名の通り「索引」です。 表現の仕方と変えると、(x, a)という形式の配列であるとも言えます。 xというキー値とそれに結びつくaというデータ情報があり、 これを利用することですべてのデータを網羅して見ることなく、 まさに本の索引のように目的のデータにたどり着くことができます。 インデックスはSQLのパフォーマンスを改善するための非常にポピュラーな手段であり、 理由としては下記の3点が挙げられます。 アプリケーションのコードに影響を
これはなに ども、レバテック開発部のもりたです。最近めっちゃ元気!! 今回は『データベースについて勉強したいあなたに送る技術書17冊(+11冊1講義7link)』として、もりたがここ半年くらいでわーっと集めたデータベース周りの書籍(とか)を紹介していきます。アプリケーションって結局はデータベースみたいなところがあると思うんですが、おれは長いことデータベースをどう学んだら良いのか分かりませんでした。同じような気持ちを抱えているITエンジニアの人もいると思うので、学習ロードマップと合わせて紹介していきます。 なお具体的な対象読者は業務でなんとなくSQL書いてるけど、ウィンドウ関数とか言われると分からんな……くらいの人です。 扱う領域と扱わない領域 扱う領域としてはだいたい以下 再入門本 SQL 内部構造 論理設計 周辺知識 データベース理論 その他高度なもの モデリング、NoSQL、分散データ
基調講演「30分でわかるデータ指向アプリケーションデザイン」 ・ スピーカー 斉藤 太郎氏 Twitter:@taroleo / Github:@xerial Principal Software Engineer , Treasure Data 東京大学理学部情報科学科卒。情報理工学 Ph.D。データベース、大規模ゲノムデータ処理の研究に従事。その後、スタートアップであるTreasure Dataに加わり、アメリカ、シリコンバレーを拠点に活動中。日本データベース学会上林奨励賞受賞。OSSを中心にプログラミングやデータ処理を簡単にするためのプロダクトを作成している。 「30分でわかるデータ指向アプリケーションデザイン」最新の論文にも触れながら、分散データシステムの世界の魅力を伝えていきます。後半、@tagomoris https://t.co/TQ2TnsFIOT… — Taro L.
この記事はエムスリー Advent Calendar 2022の30日目の記事です。 前日は id:kijuky による チームメンバーのGoogleカレンダーの休暇予定一覧をスプレッドシート+GASで作った でした。 AI・機械学習チームの北川(@kitagry)です。 今回はMySQLへのインサートを20倍以上高速化した話について書きます。 仕事をちゃんとしてるか見張る猫 TL; DR はじめに 今回のテーブル バイナリログを無効化する 追試 LOAD DATA INFILE 追試 テーブルの正規化 インデックスを一時的に剥がす まとめ We are hiring!! TL; DR バイナリログをオフにする LOAD DATA INFILEを使う インデックスを一時的に消す はじめに AI・機械学習チームではサイトトップからアプリに至るまで多くの推薦システムがあります。 そこでは推薦ロ
ANDPADボードチームの原田(tomtwinkle)です。 Node.jsの mysqljs/mysql の仕様に起因するSQLインジェクションが話題に上がっていたので、それGolangのORMであるGormでも同じような「仕様」があるよ! という注意喚起の意味も込めて筆を執りました。 ※ 2022/02/21追記 コードレビューを自動化して指摘してもらう記事を公開しました! tech.andpad.co.jp Node.jsのMySQLパッケージにおけるエスケープ処理だけでは防げない「隠れた」SQLインジェクション | 株式会社Flatt Security TL;DR GormのQuery Conditions関数に関する危険な仕様 対策 締め TL;DR GormのConditions関数(Find, First, Delete...)を使用する際、第2引数の値にStringを引き渡
よく見るDB接続例 Go言語を用いてmysqlに接続する際、DBの情報を文字列で直書きしているケースを良くみる import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main(){ db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/db?charset=utf8&parseTime=true") // 以下省略 } import ( "database/sql" "time" "github.com/go-sql-driver/mysql" ) func connectDB() *sql.DB { jst, err := time.LoadLocation("Asia/Tokyo") if err != nil { // エラーハンドリ
ニフクラエンジニアミートアップ様にお声がけをいただいて、このたび「第51回」のイベントにて登壇させていただきました。 fujitsufjct.connpass.com この4日前にも似たようなレイヤである「入門」のお話をする場があり、期間が近いこともあって「同じ内容でいいよ」としてお誘いいただいていたのですが、当日が近づくにつれて気合いが入ってきて、まったく新たに今回用の構成を組み立て直しました(一部ページの再利用はあります)。 時間に限りがあることもあり「何を伝えないか」に頭を悩ませましたが、まったくデータベース管理システム(DBMS)を触ったことがない人にイメージをつかんでもらうところを最重点として、通常ならじっくりと構文をお伝えするSQLについては雰囲気を見ていただくに留めるという割り切り方をしました。 その辺りを期待していた方には些か拍子抜けの向きもあろうかと思いますが、ご了承くだ
この記事はtomowarkar ひとりAdvent Calendar 2019の18日目の記事です。 はじめに Goでのmysql操作を備忘録としてまとめてみた コード全文 コード全文 package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) const appname = "gopherbot" func run() (*sql.DB, error) { dbDriver := "mysql" dbUser := "root" dbPass := "password" dbName := "" db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName) if err != nil { return nil, err
はじめに 2022年のセキュリティ・キャンプ全国大会に講師として参加しました。その際に、Goにおける脆弱性への対策はどうなっているのか調べました。この記事では、github.com/google/go-safeweb/safesqlがどのようにSQLインジェクションを防いでるのかについて解説します。 なお、@rungさんの文書を多いに参考にしております。また、セキュリティ・キャンプで用いた資料はこちらから閲覧できます。 SQLインジェクションとは? 独立行政法人情報処理推進機構(IPA)が公開している安全なウェブサイトの作り方を見ると、SQLインジェクションは以下のように説明されています。 データベースと連携したウェブアプリケーションの多くは、利用者からの入力情報を基にSQL文(データベースへの命令文)を組み立てています。ここで、SQL文の組み立て方法に問題がある場合、攻撃によってデータベ
【2022/2/26 追記】 主にはてブコメントで様々なご指摘を頂いたので、タイトルの修正&内容を一部追記しました。分かりにくいタイトルを付けてしまい申し訳ございません。ご指摘ありがとうございます。 もともと本記事は自分用のメモを兼ねて駆け出しエンジニアの人が数人参考にしてくれたらいいかな、程度の気持ちで書いたものでした。 現在はてなブックマークのテクノロジーカテゴリーで 1 位になっており、予想の 1000 倍以上の人に見ていただける記事になってしまいました。 今後も精進します、ありがとうございます! 特に理由もなくローカルに MySQL を入れて遊びたくなる気持ちって定期的に湧きますよね。 私は湧きます、半年に 1 回ぐらい。 業務ではフロントを触ることが多く、DB はそれほど触りません。 そのため久々に MySQL をローカルで立ち上げようとするといつも手順を忘れてしまっていて、なん
Go database/sqlチュートリアルのエラーハンドリングの日本語意訳になります。 エラーハンドリング database/sql でのほぼ全ての操作では最後の返り値としてエラーが返却されます。 それらのエラーを必ずチェックし、無視しないでください。 エラー動作が特殊だったり、何かが追加されているケースはいくつかあり、知っておくべきものもあります。 取得行セットの繰り返しによるエラー 以下のようなコードがあるとします。 for rows.Next() { // ... } if err = rows.Err(); err != nil { // ここでエラーを処理する } rows.Err() でのエラーは、 rows.Next() ループ処理内の様々な種類のエラーの結果が入る可能性があります。 ループ処理は正常に終わるだけでなく、何らかの理由によって終了してしまうかもしれません。 そ
この記事は DeNA 20 新卒 Advent Calendar 2020 19日目の記事です。 はじめに MySQLやPostgreSQLに代表されるRDBMSではトランザクションと呼ばれる仕組みが提供されています。多くのWebアプリケーションエンジニアはこのトランザクションを駆使してDBとやりとりをするロジックを組み立てることになります。 しかし不整合を起こしたくない処理があるからといって闇雲にトランザクションを張ったり、トランザクションが張られているからと安心してアプリケーション側で闇雲にロジックを組み立ててしまうと思わぬバグを生むことになってしまいます。 このエントリでは、「トランザクションを張っておけば大丈夫」という考え方は危険な場合もあるということを、ありがちな実装例を交えて紹介していきます。 並列に処理されるトランザクション そもそも、トランザクションは全て直列に処理されるわ
※ InnoDBはREPEATABLE READでもファントムリードが発生しません。 MySQLで実際に試す MySQL(InnoDB)でトランザクション分離レベルを実際に試してみます。 準備 プレイヤーのコイン数を表す簡単なテーブルを作ります。 テーブル構造は次のようになります。 テーブルにplayer1とplayer2のデータを追加します。 2つのターミナルからMySQLに接続します。クライアントAとクライアントBとします(以下はAとBと呼ぶ)。 これで準備は完了です。 READ UNCOMMITTED READ UNCOMMITTEDは一番低いレベルです。 コミットされていない変更を他のトランザクションから参照できる設定です。 ① Aで現在接続中のセッションのトランザクション分離レベルをREAD UNCOMMITTEDに設定して、テーブルを検索します。 ② BでREAD COMMIT
Disclaimer 当記事はNewSQL開発ベンダの技術ブログや各種論文、その他ニュースサイト等の内容を個人的にまとめたものです。 そのため、理解不足等に起因する誤解・誤認を含む可能性があります。更なる理解が必要な方はリファレンスに挙げた各種文献を直接参照下さい。技術的な指摘は可能であれば取り込み修正しますが、迅速な対応はお約束できません。 NewSQLの解説は二部構成 当記事は前編でNewSQLの概要編となる。 全体の目次は下記である。 NewSQLとは何か NewSQLのアーキテクチャ NewSQLとこれまでのデータベースの比較 NewSQLのコンポーネント詳解 1章から3章までの内容を当記事で解説する。 4章はさらに詳細な技術的解説となり、後編の「NewSQLのコンポーネント詳解」で記述している。 こちらも合わせて一読いただきたい。 1. NewSQLとは何か NewSQLとは、海
ハマりにハマる PDOでMySQLを扱っていたのですが、あるSQLがいっこうに受け付けてもらえません。 エラーも出ないのでSQL文が間違っているわけでもなさそうなのですが…。 不具合かなと思い、いろいろ調べているとPDOはデフォルトでエラーを吐かないという衝撃の事実を知りました。 なんだってーーーー!!! PHP.iniの設定でdisplay_Errorをyesにしていたので出力されるものだと思っていました。 セキュリティを考えるとエラーを吐かない方がいいのはわかっているつもりでしたが、設定は別なんですね。 PDOでは属性を設定することで、エラーの挙動や出力を変更することが可能です。 ちょっとした説明 PDOの属性設定はPDO::setAttribute()で行います。エラー以外にもさまざまな属性が存在しています。 属性の設定は「どの属性の設定か」の指定に続き、「その属性の設定」を行います
Tutorials: Learn SQL in stages 0 SELECT basics Some simple queries to get you started 1 SELECT name Some pattern matching queries 2 SELECT from World In which we query the World country profile table. 3 SELECT from Nobel Additional practice of the basic features using a table of Nobel Prize winners. 4 SELECT within SELECT In which we form queries using other queries. 5 SUM and COUNT In which we ap
急な仕事が降って沸くことはよくあります。 ソフトウェア開発の現場では、緊急度の高い案件が突然舞い降りて、平和なんてものは一瞬にして覆されることが日常茶飯事です。 だから、グループ合同で行う新卒研修の3時間講義枠を、その前日に依頼されるなんてこともよくある話なんじゃないかと思います。 ……。 ということで、急遽依頼された形で SQL の研修を行うことになりました。 Web -> OOP -> SQL と通算9時間も講義をしている計算になります。 これがなるセミか。 SQL Tutorial 依頼された講義は DB の講義です。 とはいえ、そんなに DB に詳しいわけでもありませんし、であれば今後使うであろう SQL のチュートリアルなんかがいいのかな、と思って今回の講義内容です。 アウトプット合宿を最後に行うので、そこで絶対使いますしね。 スライド 必死に前日に作りました。作業時間は8時間ぐ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く